上一篇文章讲了如何快速的体验dubbo,里面的服务注册中心采用的multicast,官方推荐的是采用zookeeper,这也是目前运用最多的方式,本文就介绍如何采用zookeeper来替代multicast。
安装zookeeper
直接去官网下载最新的发布版本,然后解压即可,在linux下可以采用命令行下载:
wget http://mirror.olnevhost.net/pub/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
tar xzvf zookeeper-3.4.10.tar.gz
修改配置文件,直接复制conf目录下的配置样例即可:
cp conf/zoo_sample.cfg conf/zoo.cfg
有了配置文件就可以直接运行了,运行有两种方式:
# 后台运行,日志在安装目录下的zookeeper.out文件里可以查看
./bin/zkServer.sh start
# 前台运行,可以在终端看到日志
./bin/zkServer.sh start-foreground
更多的指令的用法如下:
Usage: ./bin/zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
duboo没有对zookeeper做任何的修改,所以zookeeper正常运行后就不用管了,其他的事都交给duboo即可。(正式环境当然不会这么随意,后面的文章会专门来讲解在正式环境下该如何搭建)
增加zookeeper客户端依赖
zookeeper支持zkclient和Curator,两者的配置大同小异,依赖上,如果使用zkclient,则只需要增加一下依赖即可。
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
目前Curator是一个比zkclient更优秀的zookeeper客户端,后文也将采用Curator来描述。
在dubbo-demo-parent的pom增加依赖:
<dependency>
<groupId>com.netflix.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
同理在dubbo-demo-provider和dubbo-demo-consumer的pom中增加依赖:
<dependency>
<groupId>com.netflix.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
替换服务提供者的注册中心
修改dubbo-demo-provider工程中的配置文件provider.xml:
<!-- 使用multicast广播注册中心暴露服务地址 -->
<!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" subscribe="false" client="curator"></dubbo:registry>
替换服务提供者的注册中心
修改dubbo-demo-consumer工程中的配置文件consumer.xml:
<!-- 使用multicast广播注册中心暴露发现服务地址 -->
<!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" register="false" client="curator"></dubbo:registry>
dubbo:registry的属性说明:
-
register是否向此注册中心注册服务,如果设为false,将只订阅,不注册。
-
check注册中心不存在时,是否报错。当设置为false时,记录失败注册和订阅请求,后台定时重试
-
subscribe是否向此注册中心订阅服务,如果设为false,将只注册,不订阅。
-
timeout注册中心请求超时时间(毫秒)。
-
address可以Zookeeper集群配置,地址可以多个以逗号隔开等。
-
id用来区分多个注册中心,service可以通过id指定要连接的注册中心
-
group,用来设置zookeeper的跟节点,缺省为dubbo
-
protocol显示的指定协议(本位是将协议写在了地址前面)
-
<dubbo:registry username="admin" password="1234" />设置zookeeper登录信息
dubbo:service
-
interface服务接口的路径
-
ref引用对应的实现类的Bean的ID
-
registry向指定注册中心注册,在多个注册中心时使用,值为<dubbo:registry>的id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A
-
register 默认true ,该协议的服务是否注册到注册中心。
-
group:service和reference上也可以配置group,这个用于区分同一个接口的不同实现,只有在reference上指定与service相同的group才会被发现
到此就把multicast的注册中心替换为了zookeeper。如果要运行provider和consumer都必须要先启动zookeeper,并且每次运行都能在zookeeper的日志文件或者终端中看到对应的日志信息。
扩展知识
配置zookeeper,有多种写法:
<dubbo:registry address="zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181,10.20.153.12:2181" />
<dubbo:registry protocol="zookeeper" address="10.20.153.10:2181,10.20.153.11:2181,10.20.153.12:2181" />
同一个zookeeper还可以创建多个注册中心
<dubbo:registry id="chinaRegistry" protocol="zookeeper" address="10.20.153.10:2181" group="china" />
<dubbo:registry id="intlRegistry" protocol="zookeeper" address="10.20.153.10:2181" group="intl" />
另外文章开头没有选择用zkclient,是网上看到一些同学用zkclient遇到一些问题,因此也不见建议用,具体的一些问题如下:
-
修改服务器时间会导致容器挂掉
-
dubbo使用zkclient没有传超时时间导致zookeeper无法连接的时候,直接阻塞Integer.MAX_VALUE
主要参考:
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-Zookeeper%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83
您还想了解或讨论dubbo的哪些内容,请在评论中留言,或者发送邮件到weichengke@email.com,后面的文章会根据大家反馈来进行编写。