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