使用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><</code><code>groupid</code><code>>dubbo-demo</</code><code>groupid</code><code>></code>
<code> </code><code><</code><code>artifactid</code><code>>dubbo-demo-api</</code><code>artifactid</code><code>></code>
<code> </code><code><</code><code>version</code><code>>0.1</</code><code>version</code><code>></code>
<code> </code><code><</code><code>packaging</code><code>>jar</</code><code>packaging</code><code>></code>
<code> </code><code><</code><code>name</code><code>>dubbo-demo-api</</code><code>name</code><code>></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><groupid>dubbo-demo</groupid></code>
<code> </code><code><artifactid>dubbo-demo-provider</artifactid></code>
<code> </code><code><version></code><code>0.1</code><code></version></code>
<code> </code><code><packaging>jar</packaging></code>
<code> </code><code><name>dubbo-demo-provider</name></code>
<code> </code><code><properties></code>
<code> </code><code><project.build.sourceencoding>utf-</code><code>8</code><code></project.build.sourceencoding></code>
<code> </code><code></properties></code>
<code> </code>
<code> </code><code><dependencies></code>
<code> </code><code><dependency></code>
<code> </code><code><groupid>junit</groupid></code>
<code> </code><code><artifactid>junit</artifactid></code>
<code> </code><code><version></code><code>3.8</code><code>.</code><code>1</code><code></version></code>
<code> </code><code><scope>test</scope></code>
<code> </code><code></dependency></code>
<code> </code><code><!-- 添加dubbo服務接口的依賴 --></code>
<code> </code><code><groupid>dubbo-demo</groupid></code>
<code> </code><code><artifactid>dubbo-demo-api</artifactid></code>
<code> </code><code><version></code><code>0.1</code><code></version></code>
<code> </code><code><!-- 添加spring context依賴 --></code>
<code> </code><code><dependency></code>
<code> </code><code><groupid>org.springframework</groupid></code>
<code> </code><code><artifactid>org.springframework.context</artifactid></code>
<code> </code><code><version></code><code>3.1</code><code>.</code><code>2</code><code>.release</version></code>
<code> </code><code></dependency></code>
<code> </code><code><!-- 引入dubbo依賴 --></code>
<code> </code><code><groupid>com.alibaba</groupid></code>
<code> </code><code><artifactid>dubbo</artifactid></code>
<code> </code><code><version></code><code>2.5</code><code>.</code><code>3</code><code></version></code>
<code> </code><code></dependency></code>
<code> </code><code><!-- zookeeper依賴 --></code>
<code> </code><code><groupid>org.apache.zookeeper</groupid></code>
<code> </code><code><artifactid>zookeeper</artifactid></code>
<code> </code><code><version></code><code>3.4</code><code>.</code><code>6</code><code></version></code>
<code> </code><code><!-- zookeeper用戶端 zkclient --></code>
<code> </code><code><groupid>com.github.sgroschupf</groupid></code>
<code> </code><code><artifactid>zkclient</artifactid></code>
<code> </code><code><version></code><code>0.1</code><code></version></code>
<code> </code><code></dependency></code>
<code> </code><code></dependencies></code>
2.暴露服務,整合spring完成服務提供者
配置provider.xml:
<code><!-- 提供方應用資訊,用于計算依賴關系 --></code>
<code> </code><code><dubbo:application name=</code><code>"dubbo-demo-provider"</code> <code>/></code>
<code> </code><code><!-- 使用multicast廣播注冊中心暴露服務位址 --></code>
<code> </code><code><!-- 用dubbo協定在</code><code>20880</code><code>端口暴露服務 --></code>
<code> </code><code><dubbo:protocol name=</code><code>"dubbo"</code> <code>port=</code><code>"20880"</code> <code>/></code>
<code> </code><code><!-- 聲明需要暴露的服務接口 --></code>
<code> </code><code><dubbo:service </code><code>interface</code><code>=</code><code>"bingyue.dubbo.provider.testservice"</code> <code>ref=</code><code>"testservice"</code> <code>/></code>
<code> </code><code><!-- 和本地bean一樣實作服務 --></code>
<code> </code><code><bean id=</code><code>"testservice"</code> <code>class</code><code>=</code><code>"bingyue.dubbo.provider.testserviceimpl"</code> <code>/></code>
(3)建立服務消費端項目
1.建立項目和相關配置
在pom.xml中依賴接口項目:
<code> </code><code><</code><code>artifactid</code><code>>dubbo-demo-consumer</</code><code>artifactid</code><code>></code>
<code> </code><code><</code><code>dependencies</code><code>></code>
<code> </code><code><!-- 添加spring context依賴 --></code>
<code> </code><code><</code><code>dependency</code><code>></code>
<code> </code><code><</code><code>groupid</code><code>>org.springframework</</code><code>groupid</code><code>></code>
<code> </code><code><</code><code>artifactid</code><code>>org.springframework.context</</code><code>artifactid</code><code>></code>
<code> </code><code><</code><code>version</code><code>>3.1.2.release</</code><code>version</code><code>></code>
<code> </code><code></</code><code>dependency</code><code>></code>
<code> </code><code><</code><code>groupid</code><code>>junit</</code><code>groupid</code><code>></code>
<code> </code><code><</code><code>artifactid</code><code>>junit</</code><code>artifactid</code><code>></code>
<code> </code><code><</code><code>version</code><code>>3.8.1</</code><code>version</code><code>></code>
<code> </code><code><</code><code>scope</code><code>>test</</code><code>scope</code><code>></code>
<code> </code><code></</code><code>dependency</code><code>></code>
<code> </code><code><!-- 添加dubbo服務接口的依賴 --></code>
<code> </code><code><</code><code>dependency</code><code>></code>
<code> </code><code><</code><code>groupid</code><code>>dubbo-demo</</code><code>groupid</code><code>></code>
<code> </code><code><</code><code>artifactid</code><code>>dubbo-demo-api</</code><code>artifactid</code><code>></code>
<code> </code><code><</code><code>version</code><code>>0.1</</code><code>version</code><code>></code>
<code> </code><code></</code><code>dependencies</code><code>></code>
配置consumer.xml:
<code><!-- 消費方應用名,用于計算依賴關系,不是比對條件,不要與提供方一樣 --></code>
<code> </code><code><</code><code>dubbo:application</code> <code>name="dubbo-demo-consumer" /></code>
<code> </code>
<code> </code><code><!-- 使用multicast廣播注冊中心暴露發現服務位址 --></code>
<code> </code><code><!-- 把接口的聲明引入到本項目中,通過jar或者maven依賴都可以 --></code>
<code> </code><code><!-- 生成遠端服務代理,可以和使用本地bean一樣使用服務者提供的服務 --></code>
<code> </code><code><</code><code>dubbo:reference</code> <code>id="testservice" interface="bingyue.dubbo.provider.testservice" /></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的繼承,将消費端項目和具體的接口實作類代碼分離開。