天天看點

Dubbo內建Spring與Zookeeper執行個體

使用dubbo結合zookeeper和spring,

是使用比較廣泛的一種組合,下面參考官方文檔,做個簡單的示例,一步步搭建一個使用dubbo結合zookeeper和spring的demo工程。

(1)安裝zookeeper

(2)啟動zookeeper服務

dubbo官方提供了幾個管理工具,包括管理控制台dubbo-admin及簡易監控中心等。

這裡的demo學習使用了最新的穩定的2.5.3版本。

官網指出在阿裡巴巴内部廣泛使用的ga版本為2.4.9,并且推薦此版本,

在實際項目中可以使用這一穩定版本。

(1)下載下傳dubbo-admin,修改相關的配置

找到dubbo.properties配置檔案,修改其中的zookeeper位址為上面部署的zk位址。

(2)啟動dubbo-admin工程

把工程檔案夾放在tomcat的工程目錄下,啟動後登入即可。

demo項目主要是使用了cxf整合spring建立webservice的技術,關于cxf可以參考:

<a href="http://yakar.iteye.com/blog/968961" target="_blank">webservice cxf學習(進階篇1):整合spring架構</a>

(1)建立服務提供接口項目

服務端接口需要單獨打包,服務提供方和消費方共享,同時被提供端和消費端依賴。

1.建立maven項目

建立dubbo-demo-api工程,pom檔案如下:

1

2

3

4

5

<code>&lt;</code><code>groupid</code><code>&gt;dubbo-demo&lt;/</code><code>groupid</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>artifactid</code><code>&gt;dubbo-demo-api&lt;/</code><code>artifactid</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>version</code><code>&gt;0.1&lt;/</code><code>version</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>packaging</code><code>&gt;jar&lt;/</code><code>packaging</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>name</code><code>&gt;dubbo-demo-api&lt;/</code><code>name</code><code>&gt;</code>

2.編寫服務接口

<code>public</code> <code>interface</code> <code>testservice {</code>

<code>    </code><code>public</code> <code>string sayhello(string name);</code>

<code>}</code>

(2)建立項目實作接口

1.建立具體接口實作項目

6

7

8

9

<code>public</code> <code>class</code> <code>testserviceimpl </code><code>implements</code> <code>testservice {</code>

<code>    </code><code>/**</code>

<code>     </code><code>* 服務提供方實作接口:(對服務消費方隐藏實作)</code>

<code>     </code><code>*/</code>

<code>    </code><code>public</code> <code>string sayhello(string name) {</code>

<code>        </code><code>system.out.println(</code><code>"調用provider服務"</code><code>);</code>

<code>        </code><code>return</code> <code>"hello"</code><code>+name;</code>

<code>    </code><code>}</code>

添加api的依賴,添加spring、dubbo和zookeeper的依賴,pom檔案如下:

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

<code>&lt;groupid&gt;dubbo-demo&lt;/groupid&gt;</code>

<code>  </code><code>&lt;artifactid&gt;dubbo-demo-provider&lt;/artifactid&gt;</code>

<code>  </code><code>&lt;version&gt;</code><code>0.1</code><code>&lt;/version&gt;</code>

<code>  </code><code>&lt;packaging&gt;jar&lt;/packaging&gt;</code>

<code>  </code><code>&lt;name&gt;dubbo-demo-provider&lt;/name&gt;</code>

<code>  </code><code>&lt;properties&gt;</code>

<code>    </code><code>&lt;project.build.sourceencoding&gt;utf-</code><code>8</code><code>&lt;/project.build.sourceencoding&gt;</code>

<code>  </code><code>&lt;/properties&gt;</code>

<code>  </code> 

<code>  </code><code>&lt;dependencies&gt;</code>

<code>    </code><code>&lt;dependency&gt;</code>

<code>      </code><code>&lt;groupid&gt;junit&lt;/groupid&gt;</code>

<code>      </code><code>&lt;artifactid&gt;junit&lt;/artifactid&gt;</code>

<code>      </code><code>&lt;version&gt;</code><code>3.8</code><code>.</code><code>1</code><code>&lt;/version&gt;</code>

<code>      </code><code>&lt;scope&gt;test&lt;/scope&gt;</code>

<code>    </code><code>&lt;/dependency&gt;</code>

<code>     </code><code>&lt;!-- 添加dubbo服務接口的依賴 --&gt;</code>

<code>      </code><code>&lt;groupid&gt;dubbo-demo&lt;/groupid&gt;</code>

<code>      </code><code>&lt;artifactid&gt;dubbo-demo-api&lt;/artifactid&gt;</code>

<code>      </code><code>&lt;version&gt;</code><code>0.1</code><code>&lt;/version&gt;</code>

<code>    </code><code>&lt;!-- 添加spring context依賴 --&gt;</code>

<code>   </code><code>&lt;dependency&gt;</code>

<code>     </code><code>&lt;groupid&gt;org.springframework&lt;/groupid&gt;</code>

<code>     </code><code>&lt;artifactid&gt;org.springframework.context&lt;/artifactid&gt;</code>

<code>     </code><code>&lt;version&gt;</code><code>3.1</code><code>.</code><code>2</code><code>.release&lt;/version&gt;</code>

<code>   </code><code>&lt;/dependency&gt;</code>

<code>    </code><code>&lt;!-- 引入dubbo依賴 --&gt;</code>

<code>            </code><code>&lt;groupid&gt;com.alibaba&lt;/groupid&gt;</code>

<code>            </code><code>&lt;artifactid&gt;dubbo&lt;/artifactid&gt;</code>

<code>            </code><code>&lt;version&gt;</code><code>2.5</code><code>.</code><code>3</code><code>&lt;/version&gt;</code>

<code>        </code><code>&lt;/dependency&gt;</code>

<code>    </code><code>&lt;!-- zookeeper依賴 --&gt;</code>

<code>            </code><code>&lt;groupid&gt;org.apache.zookeeper&lt;/groupid&gt;</code>

<code>            </code><code>&lt;artifactid&gt;zookeeper&lt;/artifactid&gt;</code>

<code>            </code><code>&lt;version&gt;</code><code>3.4</code><code>.</code><code>6</code><code>&lt;/version&gt;</code>

<code>    </code><code>&lt;!-- zookeeper用戶端 zkclient --&gt;</code>

<code>         </code><code>&lt;groupid&gt;com.github.sgroschupf&lt;/groupid&gt;</code>

<code>         </code><code>&lt;artifactid&gt;zkclient&lt;/artifactid&gt;</code>

<code>         </code><code>&lt;version&gt;</code><code>0.1</code><code>&lt;/version&gt;</code>

<code>      </code><code>&lt;/dependency&gt;</code>

<code>  </code><code>&lt;/dependencies&gt;</code>

2.暴露服務,整合spring完成服務提供者

配置provider.xml:

<code>&lt;!-- 提供方應用資訊,用于計算依賴關系 --&gt;</code>

<code>    </code><code>&lt;dubbo:application name=</code><code>"dubbo-demo-provider"</code>  <code>/&gt;</code>

<code>    </code><code>&lt;!-- 使用multicast廣播注冊中心暴露服務位址 --&gt;</code>

<code>    </code><code>&lt;!-- 用dubbo協定在</code><code>20880</code><code>端口暴露服務 --&gt;</code>

<code>    </code><code>&lt;dubbo:protocol name=</code><code>"dubbo"</code> <code>port=</code><code>"20880"</code> <code>/&gt;</code>

<code>    </code><code>&lt;!-- 聲明需要暴露的服務接口 --&gt;</code>

<code>    </code><code>&lt;dubbo:service </code><code>interface</code><code>=</code><code>"bingyue.dubbo.provider.testservice"</code> <code>ref=</code><code>"testservice"</code> <code>/&gt;</code>

<code>    </code><code>&lt;!-- 和本地bean一樣實作服務 --&gt;</code>

<code>    </code><code>&lt;bean id=</code><code>"testservice"</code> <code>class</code><code>=</code><code>"bingyue.dubbo.provider.testserviceimpl"</code> <code>/&gt;</code>

  

(3)建立服務消費端項目

1.建立項目和相關配置

在pom.xml中依賴接口項目:

<code>  </code><code>&lt;</code><code>artifactid</code><code>&gt;dubbo-demo-consumer&lt;/</code><code>artifactid</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>dependencies</code><code>&gt;</code>

<code>  </code><code>&lt;!-- 添加spring context依賴 --&gt;</code>

<code>   </code><code>&lt;</code><code>dependency</code><code>&gt;</code>

<code>     </code><code>&lt;</code><code>groupid</code><code>&gt;org.springframework&lt;/</code><code>groupid</code><code>&gt;</code>

<code>     </code><code>&lt;</code><code>artifactid</code><code>&gt;org.springframework.context&lt;/</code><code>artifactid</code><code>&gt;</code>

<code>     </code><code>&lt;</code><code>version</code><code>&gt;3.1.2.release&lt;/</code><code>version</code><code>&gt;</code>

<code>   </code><code>&lt;/</code><code>dependency</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>groupid</code><code>&gt;junit&lt;/</code><code>groupid</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>artifactid</code><code>&gt;junit&lt;/</code><code>artifactid</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>version</code><code>&gt;3.8.1&lt;/</code><code>version</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>scope</code><code>&gt;test&lt;/</code><code>scope</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>dependency</code><code>&gt;</code>

<code>    </code><code>&lt;!-- 添加dubbo服務接口的依賴 --&gt;</code>

<code>    </code><code>&lt;</code><code>dependency</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>groupid</code><code>&gt;dubbo-demo&lt;/</code><code>groupid</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>artifactid</code><code>&gt;dubbo-demo-api&lt;/</code><code>artifactid</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>version</code><code>&gt;0.1&lt;/</code><code>version</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>dependencies</code><code>&gt;</code>

配置consumer.xml:

<code>&lt;!-- 消費方應用名,用于計算依賴關系,不是比對條件,不要與提供方一樣 --&gt;</code>

<code>    </code><code>&lt;</code><code>dubbo:application</code> <code>name="dubbo-demo-consumer"  /&gt;</code>

<code> </code> 

<code>    </code><code>&lt;!-- 使用multicast廣播注冊中心暴露發現服務位址 --&gt;</code>

<code>    </code><code>&lt;!-- 把接口的聲明引入到本項目中,通過jar或者maven依賴都可以 --&gt;</code>

<code>    </code><code>&lt;!-- 生成遠端服務代理,可以和使用本地bean一樣使用服務者提供的服務 --&gt;</code>

<code>    </code><code>&lt;</code><code>dubbo:reference</code> <code>id="testservice" interface="bingyue.dubbo.provider.testservice" /&gt;</code>

2.配置和啟動消費者服務 

加載配置檔案後,消費端調用服務端接口的方式有多種,可以從上下文中擷取bean,也可以使用注解。

<code>public</code> <code>class</code> <code>tester {</code>

<code>    </code><code>//使用注解或者使用遠端服務代理取得接口執行個體</code>

<code>//  @autowired testservice testservice;</code>

<code>    </code> 

<code>    </code><code>public</code> <code>static</code> <code>void</code> <code>main(string[] args){</code>

<code>        </code><code>//加載同級目錄下的消費者配置檔案</code>

<code>        </code><code>classpathxmlapplicationcontext ctx=</code><code>new</code> <code>classpathxmlapplicationcontext(</code><code>"consumer.xml"</code><code>);</code>

<code>        </code><code>ctx.start();</code>

<code>        </code><code>testservice testservice = (testservice) ctx.getbean(</code><code>"testservice"</code><code>);</code>

<code>        </code><code>string result=testservice.sayhello(</code><code>"cnblogs"</code><code>);</code>

<code>        </code><code>system.out.println(result);</code>

這種dubbo使用方式可以不用考慮maven如何單獨對接口打包,

在頂層的服務提供方項目中編寫接口,

消費端項目會依賴服務提供方項目的jar包,從中獲得接口執行個體,

然後在服務方項目中建立單獨的子項目去編寫接口的實作類,

這樣通過maven的繼承,将消費端項目和具體的接口實作類代碼分離開。