ZooKeeper 基本原理
Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,推荐生成环境使用。
下面结合上图介绍 Zookeeper 在服务注册与发现里面的应用:
如上图整体 Zookeeper 的树根 Root 是 Dubbo,说明建立的 Zookeeper 分组为 Dubbo,树的第二层为 Service 层用来表示具体的接口服务,这里为 com.test.UserServiceBo 接口服务,树的第三层为 Type 层用来区分是服务提供者,还是服务消费者,还是路由规则等,树的第四层 URL 是具体服务提供者或者消费者对应的机器列表或者具体的路由规则。
假设服务提供者对外提供 com.test.UserServiceBo 的实现类的服务,那么当服务提供者启动时候,Provider 会通过 ZKClient 在 Zookeeper 服务端的
/dubbo/com.test.UserServiceBo/providers
目录下写入自己的 URL 地址。如果服务提供者有多个,那么 providers 下就会有多个地址,这里需要注意的是这里的树形目录不一定是二叉树,假如服务提供者有100个机器,那么 providers 下就会有100个节点的。假设服务消费者需要使用 com.test.UserServiceBo 接口的服务,那么当服务消费者启动时候,Consumer 会通过 ZKClient 订阅 Zookeeper 服务端的
/dubbo/com.test.UserServiceBo/providers
目录下提供的服务提供方的 URL 地址列表。并且在/dubbo/com.test.UserServiceBo/consumers
目录下写下自己的 URL 地址,这里要记录服务消费者的地址是为了当服务提供者地址列表变化时候(比如新增了机器,减少了机器)时候,Zookeeper 可以通知订阅该服务的订阅者。监控中心和管理控制台在启动时候会通过 ZKClient 订阅 Zookeeper 服务端的
/dubbo/com.test.UserServiceBo/
目录下的内容,并通过 providers 和 consumers 子目录区分哪些是服务提供者列表,哪些是服务消费者列表,另外管理控制台还可以写入路由规则到/dubbo/com.test.UserServiceBo/routers
目录,这些路由规则也会被推送到服务消费端。
当服务提供者集群中有一台机器挂了后,Zookeeper 能及时通过长链断开发现该机器挂了,并会从 Zookeeper 注册中心服务提供者的 providers 目录下删除该机器,然后会通知服务消费者更新可用的服务提供者的地址列表。由于 Zookeeper 支持持久化存储,所以当 Zookeeper 重启后,可以自动恢复服务注册信息。
ZooKeeper 的安装
本文我们讲解使用 Apache ZooKeeper 作为服务注册中心时候 ZooKeeper 的搭建。
首先你需要到 Apache ZooKeeper 下载一个 Zookeeper 的包,本文作者使用的是 zookeeper-3.4.11 版本,如下图:
解压该包后,如下图:
然后修改 zookeeper-3.4.11/conf
文件夹里面的 zoo.cfg 文件。
- 设置配置项 dataDir 为一个存在的以 data 结尾的目录;
- 设置 Zookeeper 的监听端口 clientPort=2181;
- 设置 Zookeeper 心跳检查间隔 tickTime = 2000;
- 设置 Follower 服务器启动时候从 Leader 同步完毕数据能忍受多少个心跳时间间隔数 initLimit=5。
- 设置运行过程中 Leader 同步数据到 Follower 后,Follower 回复信息到 Leader 的超时时间 syncLimit=2,如果 Leader 超过 syncLimit 个 tickTime 的时间长度,还没有收到 Follower 响应,那么就认为这个 Follower 已经不在线了,如下图:
最后在 zookeeper-3.4.11/bin 下运行 sh zkServer.sh start-foreground
就会启动 Zookeeper,会有下面输出:
可知 Zookeeper 在端口 2181 进行监听,至此服务注册中心搭建完毕。
ZooKeeper 的使用
服务提供方和调用方需要引入 ZKClient 的 Jar 包才能使用访问 Zookeeper 服务器,需要在 pom 里面添加下面依赖。
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
Zookeeper 的单机配置:指定一个 Zookeeper 的 IP 作为服务注册中心。
<dubbo:registry address="zookeeper://12.22.123.101:2181" />
或者:
<dubbo:registry protocol="zookeeper" address="12.22.123.101:2181" />
其中 ZooKeeper 指明使用 ZooKeeper 作为服务注册中心,12.22.123.101:2181 是 ZooKeeper 的服务器地址和服务监听端口号。
ZooKeeper 集群配置:指定多个 IP 作为服务注册中心:
<dubbo:registry address="zookeeper://11.10.13.10:2181?backup=11.20.153.111:2181,11.30.
133.112:2181" />
或者:
<dubbo:registry protocol="zookeeper" address="11.10.13.10:2181,11.20.153.111:2181,11.30.
133.112:2181" />
另外你还可以在同一个 Zookeeper 服务器上划分多个分组,例如下面:
<dubbo:registry id="registry1" protocol="zookeeper" address="10.20.153.10:2181" gr
oup="registry1" />
<dubbo:registry id="registry2" protocol="zookeeper" address="10.20.153.10:2181" gro
up="registry2" />
如上代码,在同一个 Zookeeper 服务器上划分了两个分组,也就是会有两颗树目录,树根分别为 registry1 和 registry2。
http://gitbook.cn/gitchat/column/5adda21279e8c577efc8fbdf/topic/5ae02702be3c130a554d3905