《zookeeper注册中心实践》由会员分享,可在线阅读,更多相关《zookeeper注册中心实践(6页珍藏版)》请在金锄头文库上搜索。
1、1 系统结构: .12 节点角色: .13 调用关系: .14 ZooKeeper 集群部署 .15 ZooKeeper 注册中心目录结构 .26 服务提供者向注册中心注册服务信息 .27 服务消费者从注册中心获取服务信息 .38 注册中心实时监视提供者服务状态 .49 注册中心实时通知消费者服务状态 .411 系统结构:Z o o K e e p e r S e r v e r 1S e r v i c e 1Z o o K e e p e r S e r v e r 2S e r v i c e 2Z o o K e e p e r S e r v e r 3S e r v e r 1 S
2、 e r v e r 2 S e r v e r 3Z o o K e e p e r 注册中心L e a d e rF o l l o w e r F o l l o w e rS e r v e r 4S e r v i c e 3注册服务注册服务注册服务C l i e n t获取服务2 节点角色:1. Server1、Server2、Server3 构成了 ZooKeeper 注册中心,通过 LeaderElection,Server2为 Leader,Server1 和 Server3 为 Follower;2. Server1 和 Server2 本身还提供服务,假设 Server3
3、 不提供任何服务;3. Server4 对外提供服务,但没有部署 ZooKeeper 服务器,不加入 ZooKeeper 注册中心;4. Client 远程调用 Server1、Server2、Server4 的服务。3 调用关系:1. Server1、 Server2、Server4 中对外发布的服务,在启动时向 ZooKeeper 注册中心注册服务;2. 服务消费者(Client)向注册中心获取服务提供者地址列表,直接调用提供者;3. 注册中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表;4. 服务消费者和服务提供者可连接注册中心任意一台 ZooKeeper 服务器
4、。4 ZooKeeper 集群部署三个 ZooKeeperServer25 ZooKeeper 注册中心目录结构/ Z o o S e r v e r A/ a d d/ l o c k/ n a m e/ n a m e s p a c e/ Z o o S e r v e r B/ s u b/ z o o k e e p e r/ s e r v i c e A l i v e/ u r l/ l o c k/ n a m e/ n a m e s p a c e/ u r l/ s e r v i c e A d d/ s e r v i c e S u b/ . . ./ . . .
5、6 服务提供者向注册中心注册服务信息服务提供者将服务需要的信息通过create()函数,在注册中心创建对应的节点/* registerService()* register methord add on zookeeper* param args* throws IOException * throws InterruptedException * throws KeeperException */private static void registerService() throws IOException, KeeperException, InterruptedException if
6、(null = zk.exists(/serviceAlive, false)3zk.create(/serviceAlive, serviceAlive.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);if (null != zk.exists(/serviceAlive, false)zk.create(/serviceAlive/serviceAdd, add.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);if (null = zk.exists(/ZooSer
7、verA, false) zk.create(/ZooServerA, ZooServerA.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);if (null = zk.exists(/ZooServerA/add, false)zk.create(/ZooServerA/add, add.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);if (null = zk.exists(/ZooServerA/add/url, false)zk.create(/ZooServ
8、erA/add/url, http:/localhost:6666/add.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);if (null = zk.exists(/ZooServerA/add/namespace, false)zk.create(/ZooServerA/add/namespace, http:/ Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);if (null = zk.exists(/ZooServerA/add/name, false)zk.create(/ZooS
9、erverA/add/name, ZooKeeperServerAService.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);String address = http:/localhost:6666/add;Endpoint.publish(address, new ZooKeeperServerA();System.out.println(service add started.);7 服务消费者从注册中心获取服务信息服务消费者通过 getData()从注册中心获取使用服务所需的信息。/从注册中心获得 serviceAdd
10、需要的信息String urlAdd = new String(zkA.getData(/ZooServerA/add/url, false, null);String nameSpaceAdd = new String(zkA.getData(/ZooServerA/add/namespace, false, null);String nameAdd = new 4String(zkA.getData(/ZooServerA/add/name, false, null);8 注册中心实时监视提供者服务状态服务启动时,服务提供者在注册中心创建一个临时的目录/serviceAlive/servi
11、ceAdd,当服务提供者与注册中心连接中断后,该临时节点会自动删除,注册中心通过触发与该节点关联的 Watcher,从而将服务状态通知到服务的消费者。if (null = zk.exists(/serviceAlive, false)zk.create(/serviceAlive, serviceAlive.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);if (null != zk.exists(/serviceAlive, false)zk.create(/serviceAlive/serviceAdd, add.getByt
12、es(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);9 注册中心实时通知消费者服务状态1. 服务消费者在使用服务前,检查/serviceAlive/serviceAdd 节点是否存在,从而判断服务是否可用,并将该节点目录绑定到watchSeiverceAdd; /检查“/serviceAlive/serviceAdd”节点是否存在,判断服务是否可用if (null != zkA.exists(/serviceAlive/serviceAdd, watchSeiverceAdd) serviceAdd = true;2. 当节点/serviceAli
13、ve/serviceAdd状态发生变化时,注册中心会自动通知到watchSeiverceAdd;收到通知的 Watcher在process()方法中做相应的处理/watchSeiverceA用于监视serviceAdd 是否可用private static Watcher watchSeiverceAdd = new Watcher() /服务A启停watchOverridepublic void process(WatchedEvent event) if (serviceAdd = true)serviceAdd = false;elseserviceAdd = true;System.out.println();try