轻量级RPC设计与实现第五版(最终版)

网友投稿 246 2022-06-21


在最近一段时间里,通过搜集有关资料加上自己的理解,设计了一款轻量级RPC,起了一个名字lightWeightRPC。它拥有一个RPC常见的基本功能。主要功能和特点如下:

利用Spring实现依赖注入与参数配置

利用Netty来实现客户端与服务端的远程通信

利用Hessian来实现序列化

设置Zookeeper作为注册中心

新设监控器,通过心跳机制来判断服务端与监控器的网络连接状况,当出现不稳定时,认为服务端出现了问题,在注册中心删除相关的服务信息。

利用Netty的Promise来实现异步的传送

构建线程池来管理发送的请求线程

添加服务缓存机制,在注册中心宕机的情况下仍能进行服务消费。

支持服务扩展点发现机制(SPI),对Spring的SPI机制进行改进,解决了依赖注入问题。

在客户端从注册中心获取服务时,添加监听器,当注册中心对应节点发生变化时通知客户端修改本地缓存信息。

以上是lightWeightRPC的全部功能,本版本添加的内容就是最后一个功能,为服务节点添加监听器。

因为之前在本地添加了持久化的缓存,当服务消费时会先从缓存中查找信息,查不到再到注册中心查找,但是当服务地址等信息发生变化时,如果不对缓存信息进行修改就可能会发生错误。所以在本版本中为服务节点添加了监听器。

1|0如何添加监听器

当客户端首次从注册中心获取服务信息时,会对有关服务节点添加监听器,具体方法在addListenerForService,设置完监听后,再获取相关服务节点信息,并封装在URL类中。

public static List getServiceInfo(String interfaceName) { try { addListenerForService(interfaceName); System.out.println("开始查找服务节点:" + getPath(interfaceName)); List urlList = client.getChildren().forPath("/" + interfaceName); System.out.println("结果:" + urlList); List 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

__EOF__

本文链接:https://cnblogs.com/maratong/p/12333758.html


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:轻量级RPC设计与实现第四版(高性能rpc框架)
下一篇:Java 类加载与实例化(java安装教程详细)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~