天天看点

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的继承,将消费端项目和具体的接口实现类代码分离开。