手写RPC框架(五)整合Zookeeper
手写RPC框架(五)整合Zookeeper
Zookeeper是一种分布式程序协调服务,RPC框架中使用Zookeeper可以更加灵活,不仅可以存储<K,V>结构的数据,也可以存储树状结构的数据,同时Zookeeper相较于Redis支持分布式,当一台节点挂掉时,也可以用其他机器提供服务。
我们采用开源Zookeeper客户端ZKClient,它对ZookeeperAPI进行了封装,实现了超时重连,Watcher反复注册等功能。
-
引入ZKClient
<dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.11</version> </dependency>
-
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); } }
-
服务注册中心数据处理
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)); } }
-
服务注册、发现
RegisterCenter.registerProvider(rpcRegisterEntity);//提供者 RegisterCenter.registerConsumer(rpcRegisterEntity);//消费者
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步