不灭的焱

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

作者:php-note.com  发布于:2018-11-04 20:36  分类:Java  编辑

sigh,很遗憾,没有写完整,还有很多想做而没有做的事情,总结一下想做而没有做的事情吧

1)性能测试,没有条件和环境给我做这个事情

2)对portal,对页面的支持,没有一个可以直观的可视页面

3)注册中心对zookeeper的支持

4)监控中心链路调用的追踪的支持,这个很重要,不过没有做

作者:php-note.com  发布于:2018-11-04 20:33  分类:Java  编辑
作者:php-note.com  发布于:2018-11-04 20:30  分类:Java  编辑

本小节测试一下限流的功能,首先我们先定义一个简单的类,配置一下它单位时间最大的调用次数

作者:php-note.com  发布于:2018-11-04 20:26  分类: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 20:08  分类:Java  编辑

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

作者:php-note.com  发布于:2018-11-04 20:05  分类:Java  编辑

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

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

1)随机

2)加权随机

3)轮询

作者:php-note.com  发布于:2018-11-04 20:03  分类:Java  编辑

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

作者:php-note.com  发布于:2018-11-04 20:00  分类:Java  编辑

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

作者:php-note.com  发布于:2018-11-04 19:59  分类:Java  编辑

介绍注册中心的功能的小节,我们曾经说过,注册中心要有持久化的操作,将一些服务的审核信息放到硬盘上,这样做的原因就是因为我们所有的服务信息都是放在内存里面的,如果注册中心的实例宕掉,或者服务器因为某种原因停止的时候,这样某些服务的审核记录就无法找回,为了避免这样的问题,我们需要做的事情就是把这些服务审核信息定时刷盘,把这些信息保存到硬盘上去,然后每个注册中心服务启动的时候,去硬盘上去恢复这些信息,这样就可以规避这样的问题了

作者:php-note.com  发布于:2018-11-04 19:54  分类:Java  编辑

上个小节简单的描述了一下注册中心如何处理与服务提供者的交互问题,也列举了几个简单的代码片段,中间有几个场景是需要通知服务消费者的几个业务逻辑的

1)当服务消费者服务发布成功且审核通过的情况下,需要通知服务订阅者

2)当某个服务下线的时候,也需要通知服务订阅者某个服务下线

作者:php-note.com  发布于:2018-11-04 19:43  分类:Java  编辑

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

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

作者:php-note.com  发布于:2018-11-04 19:35  分类:Java  编辑

注册中心的实现方式有很多种,实现的方式也有难有易,可以使用zookeeper,consul这些第三方已有的包去帮助实现,这样可以减少开发注册中心的难度,却可能加大运维的难度,当然最最原始的方法就是使用java去实现,不借助其他任何已有的第三方包去搞定,这样做的好处其实并不明显,不过对于开发者而言,使用这种最原始的方式最大的好处就是自己知道所有的实现细节,遇到问题,遇到bug,可以很快的定位到问题所在

作者:php-note.com  发布于:2018-11-04 18:28  分类:Java  编辑

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

作者:php-note.com  发布于:2018-11-04 18:13  分类:Java  编辑

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

作者:php-note.com  发布于:2018-11-04 18:06  分类:Java  编辑

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

作者:php-note.com  发布于:2018-11-04 17:54  分类:Java  编辑

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

作者:php-note.com  发布于:2018-11-04 17:33  分类:Java  编辑

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

作者:php-note.com  发布于:2018-11-04 16:42  分类:Java  编辑

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