手写RPC框架(五)整合Zookeeper

手写RPC框架(五)整合Zookeeper

Zookeeper是一种分布式程序协调服务,RPC框架中使用Zookeeper可以更加灵活,不仅可以存储<K,V>结构的数据,也可以存储树状结构的数据,同时Zookeeper相较于Redis支持分布式,当一台节点挂掉时,也可以用其他机器提供服务。

我们采用开源Zookeeper客户端ZKClient,它对ZookeeperAPI进行了封装,实现了超时重连,Watcher反复注册等功能。

  1. 引入ZKClient

            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <version>0.11</version>
            </dependency>
    
  2. Zookeeper读写数据

    public class ZKUtil {
        private static final String ZK_ADDRESS = "127.0.0.1:2181";
        private static ZkClient client;
        static {
            client = new ZkClient(ZK_ADDRESS);
        }
    
        public static void writeData(String path, String data) {
            if (!client.exists(path)) {
                client.createPersistent(path, true);
            }
            client.writeData(path, data, -1);
        }
    
        public static <T> T readData(String path) {
            return client.readData(path);
        }
    }
    
  3. 服务注册中心数据处理

    public class RegisterCenter {
        private static final String ROOT = "/irpc";
        private static final String PROVIDER_PATH = "%s/%s/provider";
        private static final String CONSUMER_PATH = "%s/%s/consumer";
    
        public static void registerProvider(RpcRegisterEntity entity) {
            ZKUtil.writeData(String.format(PROVIDER_PATH, ROOT, entity.getInterfaceClassFullName()), JSON.toJSONString(entity));
        }
    
        public static void registerConsumer(RpcRegisterEntity entity) {
            ZKUtil.writeData(String.format(CONSUMER_PATH, ROOT, entity.getInterfaceClassFullName()), JSON.toJSONString(entity));
        }
    
        public static <T> T getProviderData(String path) {
            return ZKUtil.readData(String.format(PROVIDER_PATH, ROOT, path));
        }
    
        public static <T> T getConsumerData(String path) {
            return ZKUtil.readData(String.format(CONSUMER_PATH, ROOT, path));
        }
    }
    
  4. 服务注册、发现

    RegisterCenter.registerProvider(rpcRegisterEntity);//提供者
    RegisterCenter.registerConsumer(rpcRegisterEntity);//消费者
    
posted @   流光之中  阅读(135)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑
  1. 1 起风了 买辣椒也用券
起风了 - 买辣椒也用券
00:00 / 00:00
An audio error has occurred.