不灭的焱

革命尚未成功,同志仍须努力

作者:php-note.com  发布于:2018-10-16 23:30  分类:Java库/系统 

本来只是想写一写,学一学的,不过觉得还是应该跟大家一起分享一下一个完整的在我知识体系中相对健全的RPC框架

写这个RPC的时候,我是写过一个的RPC的,其实不能称之为写,算抄吧,看过别人写的RPC,也无脑的抄了一遍别人的代码,抄完之后,问了冯大神,感觉收获很多,比每天看书看帖收获多得多

作者:php-note.com  发布于:2018-10-16 23:51  分类:Java基础 

现在N多RPC框架应该选用的都是Netty,基于多种原因吧:

1)它很容易上手,它封装了网络传输底层的实现,但也有Spring的开闭原则,可以根据用户的参数配置去定制属于自己的网络传输模型

2)它优化了线程模型,且基于事件驱动,基于NIO,提高IO效率

3)内存优化,直接内存的使用/池化的技术

4)第四点,我也是认为很重要的一点,也是我们写这个RPC框架的核心点,就是有很多参考,基于Netty的成熟的生产级别的代码可以参考(本RPC框架的网络模块netty应用是融合Jupiter和RocketMQ的),说白了,有点抄袭,但也是做了部分的修改

作者:php-note.com  发布于:2018-11-04 18:28  分类:Java库/系统 

注册中心在RPC整个体系中担任的角色是比较重要的,但也是比较微妙的,它维护了所有服务提供者的所暴露服务的信息,最最核心的信息就是IP+端口号,服务消费者会在调用服务的时候去注册中心上去询问它远程调用服务的端口和IP地址,注册中心返回它所需要的信息,服务消费者拿着服务的IP+端口号,如果获取到多个IP的时候,再根据负载策略去远程调用服务,其实最最简单的注册中心的职责就是如此,注册中心的最核心的职责也是如此

作者:php-note.com  发布于:2018-11-04 16:42  分类:Java库/系统 

本节介绍Provider端代码的搭建,工欲善其事必先利其器,Provider端的代码结构很重要,写代码的时候,我们需要知道我们自己要干嘛,好了,废话不多说,先写一个接口,接口是明确自己要干什么的利器,写个接口压压惊~

作者:php-note.com  发布于:2018-11-04 18:13  分类:Java库/系统 

对于RPC而言,服务的降级也是必不可少的,何为服务的降级,就是在业务洪流来的时候,服务器的压力陡增,数据库的压力也很大的时候,轻量化服务的功效,比如某个非核心服务需要调用数据库的,我们降级的服务不需要调用数据库,就比如我们在某某电商购物的时候,商品详情页的侧边栏一般会有电商推荐的一些比较类似的产品,这个后台的机制可能是某个推荐算法,根据用户浏览商品的记录给出推荐的产品,这是非核心的逻辑,这个功能在服务器的压力比较大的时候,可以进行降级的处理,我们可以给出几个默认的产品返回,因为推荐算法可能会设计大数据的计算和分析,甚至设计几次的数据库查询,在这个时候我们如果让这个后台方法默认返回几个固定的值的时候,可以减轻服务的压力,给其他的核心服务,例如支付,详情页等服务做出服务资源的让步

作者:php-note.com  发布于:2018-11-04 20:03  分类:Java库/系统 

订阅服务看起来是比较简单容易实现的功能,乍一看,就是发送订阅服务的名称给注册中心,然后注册中心反馈给服务消费者,感觉万事大吉,其实并不是这样的,这块是比较容易实现的,使用Netty很容易就能实现了,但是写的时候就会发现各种问题

作者:php-note.com  发布于:2018-11-04 20:08  分类:Java库/系统 

对于远程调用来说,最高境界就是让使用者不知道此处代码是远程调用一样,感觉就是调用本地的某个普通方法,封装底层调用的细节,这是我们服务消费端最后要做的事情

作者:php-note.com  发布于:2018-11-04 17:33  分类:Java库/系统 

首先先进行服务的编织,将一个服务的一些基本信息编织成一个类,发送给注册中心,订阅者在注册中心取到的编织信息就可以调用该方法,这是整体的思路,我们在网络篇说过,所有的数据传输走RemotingTransporter,核心的传输主体要实现CommonCustomBody接口,接下来,我们就定义Provider发送给注册的类:

作者:php-note.com  发布于:2018-10-17 00:12  分类:Java库/系统 

说到序列化,这在RPC的层面上也是很重要的一个环节,因为在我们的业务层面,你传输的一个对象,是一个Object,不过在网络上,却不管你传输的是Obj1,还是Obj2,网络只认byte,所以在代码层面上,如何将对象转化成byte数组,和如何将byte数组反序列化层对象,这也是很重要的,直接影响你的整个框架的性能。

作者:php-note.com  发布于:2018-11-04 17:54  分类:Java库/系统 

上一个小节简单的介绍了服务提供者端如何去编制一个服务的信息,然后将此服务的信息发送到注册中心上去的基本过程了,其实算是比较简单的,这节我们将简单的介绍一些Consumer端调用Provider端的时候,Provider端是如何处理的

作者:php-note.com  发布于:2018-11-04 20:26  分类:Java库/系统 

因为在某些场合下,服务提供者和服务消费者是直接可以调用的,不需要通过注册中心,本小节测试直连的调用:

作者:php-note.com  发布于:2018-11-04 20:05  分类:Java库/系统 

所谓负载策略,其实相对比较简单,某个消费者去远程调用某个服务,不过提供这个服务不止一个实例,那么建立的长连接就不止一个,所以需要做的事情就是根据某个策略在这个长连接中选择一个进行通讯

本Demo RPC只实现了三个比较常用的负载策略

1)随机

2)加权随机

3)轮询

作者:php-note.com  发布于:2018-11-04 16:17  分类:Java库/系统 

大家知道网络通信都是异步的,当你使用网络去发送一个请求的之后,就会去等待这个请求对应的响应体,可是你却不知道这个响应到底何时到达。

这就是异步的好处也是异步的坏处,好处就是在请求发送出去之后,你就可以去做其他的事,就比如你跟你的女神用微信表白了,表白之后,你不需要眼睛直勾勾的盯着手机微信,可以去干一些其他的事情,坏处就是你不知道响应到底什么到来,所以即使你去做其他的事情也会不舒心,你会时不时的去看手机的,这就是异步"表白"的优点和缺点了吧

作者:php-note.com  发布于:2018-11-04 20:16  分类:Java库/系统 

进入了基本的测试篇,首先我们先进入基本的代码测试,我们先跑通代码:

作者:php-note.com  发布于:2018-11-04 20:09  分类:Java库/系统 

本来想多写点文字的,不过发现自己的表达能力的确有限,现在还是理解为啥大神都是贴代码,不做解释了,的确很难说明一切,大神的代码易懂,看到代码就基本上知道啥意思了,这就是所谓的妙笔生花吧,我不能,所以多写一点文字多加一点注释,这也是没有办法的事情

作者:php-note.com  发布于:2018-11-04 16:34  分类:Java库/系统 

关于RPC的网络模块其实还有很多地方可以挖掘,还有很多细节可以去深究,还有很多配置去优化,写代码,对待人生,玩游戏都是这样

写代码,人家的代码,总是人家的代码,跟别人家的孩子一样,性能是那么的卓越,bug总是那么少,你跟别人总是差一点,就差一点,这一点点就成了鸿沟了

作者:php-note.com  发布于:2018-11-04 18:06  分类:Java库/系统 

对于远程调用来说,限流是很重要的,这是对自己的保护政策,因为为了保证在业务高峰期,线上系统也能保证一定的弹性和稳定性,最有效的方案就是进行服务降级了,而限流就是降级系统最常采用的方案之一

作者:php-note.com  发布于:2018-11-04 20:33  分类:Java库/系统 
作者:php-note.com  发布于:2018-11-04 20:00  分类:Java库/系统 

服务消费者也就是我们最最核心的主角,它是整个RPC中的主角,一切都是为它服务的,注册中心为其提供订阅功能,服务提供者,更不用说,消费者叫一声,你敢不答应吗?

作者:php-note.com  发布于:2018-11-04 19:43  分类:Java库/系统 

上两节我们简单地说明了注册中心的功能和基本结构,本节重点讲述注册中心如何处理服务提供者发送过来的信息

因为我们之前讲过Netty网络端的定义说明的,也讲了服务提供者发布服务的知识了,我们看看默认的注册中心的处理器是如何处理发布的信息的