Zookeeper示例之服务发现与治理

上一篇 << 下一篇 >>>Zookeeper示例之分布式锁


Zookeeper的服务注册与发现,主要应用的是Zookeeper的Znode数据模型和Watcher机制,主要分为如下几个步骤:

  • 服务注册:服务提供者(Provider)启动时,会向Zookeeper服务端注册服务信息,即会在Zookeeper服务器上创建一个服务节点,并在节点上存储服务的相关数据(如服务提供者的ip地址、端口等),比如注册一个用户注册服务(user/register):
  • 服务发现:服务消费者(Consumer)启动时,会根据本身依赖的服务信息,向Zookeeper服务端获取注册的服务信息并设置Watch,获取到注册的服务信息之后将服务提供者信息缓存在本地,调用服务时直接根据从Zookeeper注册中心获取到的服务注册信息调用服务,比如发现用户注册服务(user/register)并调用。

1、服务注册

ZooKeeper zooKeeper = new ZooKeeper(ADDRES, TIMEOUT, new Watcher() {
    // 获取该连接是否成功
    @Override
    public void process(WatchedEvent watchedEvent) {
        Event.KeeperState state = watchedEvent.getState();
        if (state == Event.KeeperState.SyncConnected) {
            System.out.println("zk连接成功");
            // 计数器减去1
            countDownLatch.countDown();
        }
    }
});
countDownLatch.await();
// 1. 判断父节点是否存在
String parentPath = "/dubboService";
Stat exists = zooKeeper.exists(parentPath, null);
// 2. 创建我们的子节点
if (exists == null) {
    // 父亲节点不存在
    zooKeeper.create(parentPath, "jarye".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
// 3.实现我们的服务注册
String path = "http://127.0.0.1:" + serverPort;
zooKeeper.create(parentPath + "/" + serverPort, path.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
        CreateMode.EPHEMERAL);
System.out.println("服务注册成功" + parentPath);

2、服务发现

String path = "/dubboService";
// 获取该节点下子集
List children = zooKeeper.getChildren(path, null, new Stat());
for (int i = 0; i < children.size(); i++) {
    String pathChildren = path + "/" + children.get(i);
    byte[] data = zooKeeper.getData(pathChildren, null, new Stat());
    System.out.println("服务接口地址:" + new String(data));
}

推荐阅读:
<< << << << <<<为什么Zookeeper集群节点一定要是奇数
<< << << << << << << << << << << << <<

你可能感兴趣的:(Zookeeper示例之服务发现与治理)