标签:如何 err 注册 cache curator getchild imp 方法 指正
在最近一段时间里,通过搜集有关资料加上自己的理解,设计了一款轻量级RPC,起了一个名字lightWeightRPC。它拥有一个RPC常见的基本功能。主要功能和特点如下:
以上是lightWeightRPC的全部功能,本版本添加的内容就是最后一个功能,为服务节点添加监听器。
因为之前在本地添加了持久化的缓存,当服务消费时会先从缓存中查找信息,查不到再到注册中心查找,但是当服务地址等信息发生变化时,如果不对缓存信息进行修改就可能会发生错误。所以在本版本中为服务节点添加了监听器。
当客户端首次从注册中心获取服务信息时,会对有关服务节点添加监听器,具体方法在addListenerForService
,设置完监听后,再获取相关服务节点信息,并封装在URL类中。
public static List<URL> getServiceInfo(String interfaceName) {
try {
addListenerForService(interfaceName);
System.out.println("开始查找服务节点:" + getPath(interfaceName));
List<String> urlList = client.getChildren().forPath("/" + interfaceName);
System.out.println("结果:" + urlList);
List<URL> result = new ArrayList<>();
for(String serviceUrl : urlList) {
String[] urls = serviceUrl.split(":");
String implClassName = get(interfaceName, serviceUrl);
System.out.println(implClassName);
result.add(new URL(urls[0], Integer.valueOf(urls[1]), interfaceName, implClassName));
}
return result;
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
return null;
}
在添加监听器时主要是PathChildrenCache
类,当节点发生变化时会触发childEvent
事件,根据不同的状态采取不同的策略。
final PathChildrenCache childrenCache = new PathChildrenCache(client, getPath(serviceName), true);
//同步初始监听点childrenCache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
childrenCache.getListenable().addListener(new PathChildrenCacheListener(){
@Override
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception { if(event.getType().equals(PathChildrenCacheEvent.Type.INITIALIZED)) {
//建立完监听
return;
}
//删除远程服务节点
if (event.getType().equals(PathChildrenCacheEvent.Type.CHILD_REMOVED)) {
String path = event.getData().getPath();
FileUtil fileUtil = new FileUtil(true);
fileUtil.alterServiceCache(serviceName, path);
}
至此,一个RPC设计完成了,有一些不足,希望大家多多指正。
项目地址: lightWeightRpc
标签:如何 err 注册 cache curator getchild imp 方法 指正
原文地址:https://www.cnblogs.com/maratong/p/12333758.html