轻量级RPC设计与实现第五版(最终版)
在最近一段时间里,通过搜集有关资料加上自己的理解,设计了一款轻量级RPC,起了一个名字lightWeightRPC。它拥有一个RPC常见的基本功能。主要功能和特点如下:
- 利用Spring实现依赖注入与参数配置
- 利用Netty来实现客户端与服务端的远程通信
- 利用Hessian来实现序列化
- 设置Zookeeper作为注册中心
- 新设监控器,通过心跳机制来判断服务端与监控器的网络连接状况,当出现不稳定时,认为服务端出现了问题,在注册中心删除相关的服务信息。
- 利用Netty的Promise来实现异步的传送
- 构建线程池来管理发送的请求线程
- 添加服务缓存机制,在注册中心宕机的情况下仍能进行服务消费。
- 支持服务扩展点发现机制(SPI),对Spring的SPI机制进行改进,解决了依赖注入问题。
- 在客户端从注册中心获取服务时,添加监听器,当注册中心对应节点发生变化时通知客户端修改本地缓存信息。
以上是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
轻量级RPC设计与实现第五版(最终版)的更多相关文章
- 轻量级RPC设计与实现第三版
在前两个版本中,每次发起请求一次就新建一个netty的channel连接,如果在高并发情况下就会造成资源的浪费,这时实现异步请求就十分重要,当有多个请求线程时,需要设计一个线程池来进行管理.除此之外, ...
- 轻量级RPC设计与实现第二版
在上一个版本中利用netty实现了简单的一对一的RPC,需要手动设置服务地址,限制性较大. 在本文中,利用zookeeper作为服务注册中心,在服务端启动时将本地的服务信息注册到zookeeper中, ...
- 轻量级RPC设计与实现第四版
在本版本中引入了SPI机制,关于Java的SPI机制与Dubbo的SPI机制在以前的文章中介绍过. 传送门:Dubbo的SPI机制与JDK机制的不同及原理分析 因为设计的RPC框架是基于Spring的 ...
- 轻量级RPC设计与实现第一版
什么是RPC RPC (Remote Procedure Call Protocol), 远程过程调用,通俗的解释就是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应 ...
- 微博轻量级RPC框架Motan
Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用. ...
- 微博轻量级RPC框架Motan正式开源:支撑千亿调用
支撑微博千亿调用的轻量级 RPC 框架 Motan 正式开源了,项目地址为https://github.com/weibocom/motan. 微博轻量级RPC框架Motan正式开源 Motan 是微 ...
- 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)
轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...
- C# 的轻量级 RPC 框架
Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Comple ...
- 轻量级RPC框架开发
nio和传统io之间工作机制的差别 自定义rpc框架的设计思路 rpc框架的代码运行流程 第2天 轻量级RPC框架开发 今天内容安排: 1.掌握RPC原理 2.掌握nio操作 3.掌握netty简单的 ...
随机推荐
- postman之存储测试结果
前言 在Jmeter的随笔中,我跟大家讲过利用Jmeter工具存储测试结果,那么,postman工具要该如何存储测试结果呢?下面一起来学习吧! 一:添加一个登录请求,填入接口参数点击send 二:点击 ...
- 《Python编程:从入门到实践》分享下载
书籍信息 书名:<Python编程:从入门到实践> 原作名:Python Crash Course 作者: [美] 埃里克·马瑟斯 豆瓣评分:9.1分(2534人评价) 内容简介 本书是一 ...
- golang 引入 和 创建 包
/* 单个包: improt "包目录的路径" 多个包: improt ("包目录的路径", "包目录的路径") improt ( &quo ...
- k8s系列---StorageClass
介绍这个概念前,需要提前知道存储卷pv/pvc之类的概念. 之前的文章有关于EFK日志系统的介绍,里面的环境是测试环境,完全按照教程一步步的操作,甚至注释掉了持久化存储,当真正线上部署时,又抓虾,打开 ...
- centos6.5安装openLDAP2.3
查看系统版本,内核,定时任务同步时间,关闭防火墙selinux等 [root@ldap-master ~]# cat /etc/redhat-release CentOS release 6.5 (F ...
- 论文翻译:2018_Artificial Bandwidth Extension with Memory Inclusion using Semi-supervised Stacked Auto-encoders
论文地址:使用半监督堆栈式自动编码器实现包含记忆的人工带宽扩展 作者:Pramod Bachhav, Massimiliano Todisco and Nicholas Evans 博客作者:凌逆战 ...
- 【全集】IDEA入门到实战
课程介绍 IDEA是一款功能强悍.非常好用的Java开发工具,近几年编程开发人员对IDEA情有独钟.虽然IDEA功能很强大,但目前市面讲解的不细致.不系统,导致很多IDEA初学者要么无从下手,要么 ...
- Head First设计模式——代理模式
在HeadFirst设计模式中代理模式用了比较多的篇幅来讲解,其中的例子我感觉有些繁琐,所以我们这篇就不按照惯例用例子来阐述代理模式了.我们直接进入正题,分析模式本身的设计和解决的问题. 远程代理模式 ...
- Go语言SQL注入和防注入
Go语言SQL注入和防注入 一.SQL注入是什么 SQL注入是一种注入攻击手段,通过执行恶意SQL语句,进而将任意SQL代码插入数据库查询,从而使攻击者完全控制Web应用程序后台的数据库服务器.攻击者 ...
- RT-Thread can - STM32F103ZET6
SDK版本v4.0.2 目前,RT-Thread Studio还不能够自定义添加can设备.下面介绍手动添加过程: 使用RT-Thread Studio创建一个简单工程 使用RT-Thread env ...