不灭的焱

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

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

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

 

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

 

人生也是一样,差一点点就成功了,差一点点就追到女神了,这一点点也就成了鸿沟了

游戏亦是如此,你差一点点就杀了对方的英雄了,对方三滴血逃生之后,反手一个大,你死了,差一点点,这一点点成就了别人的王者,你的青铜

网络的水很深,在后面的优化中,进一步优化Netty的模块

 

我们言归正传,这个小节,我们开始讲述一下,服务提供端Provider的要实现的功能,研究一下,它要实现的逻辑,本小节的开篇稍微介绍过,不过不够详细,这节还是讲讲与我初见的Provider端

 

1)Provider端与我们传统的Service层一样,有自己的处理的逻辑,有自己的接口,有对这个接口具体的实现,所以一个Provider端最基本的功能就是提供一个稳定的方法调用,如下图所示,一个最最简单的接口实现

2)升级版的服务提供,需要向注册中心提供你提供服务的一些基本信息,所以在提供服务之前,你需要将你的服务进行编织,例如你的服务名是什么,你在哪个端口号提供服务等等,这些信息你可以编织成一个信息类,将这个信息类发送给注册中心,注册中心只要有这些信息就够了,注册中心拿着这些信息给服务订阅者就完成了所有的工作,不要在乎服务提供者是怎么实现的,所以Provider端第二重要的部分是服务的编织

 

3)当你服务编织好的时候,就需要将信息发送给注册中心,这边网络模块可以实现,我们不深究细节,不过在发送编织信息的同时,Provider需要做的事情就是自己启动一个Netty Server的实例,并在规定好服务端口进行监听,等待服务消费者的链接,进行服务消费,否则Provider发送了注册信息,却没有按照规定在某个端口上监听,就不科学了,你不是在逗人家吗?

 

4)最最简单的Provider实现上述3点就完成了基本功能了,不过功能健壮的Provider不仅仅如此,还要实现服务的治理

①提供调用次数的统计,失败次数的统计,方便直接的查看服务的状态

 

②提供服务降级的功能,假如provider端提供的服务业务逻辑很复杂,数据库的操作比较多,甚至可能也远程调用其他的服务,当业务洪流来的时候,可能会压垮数据库,和其他的系统,所以我们需要提供服务降级的功能,所谓降级,网上的资料很多,简而言之,就是简化提供的功能,举几个简单的例子而言,对于库存系统而言,可以默认返回0,对于推荐系统,我不做大数据的分析了,默认返回几个卖的最好的商品,对于定价系统而言,默认拿取商品成本价*1.01或者某个固定的数值,而不是去数据库查询该产品的定价率,然后再远程调用促销系统,查看该商品是否有促销活动,说白了,就是大大简化逻辑操作,提供默认的返回值,防止大促来的时候,压垮系统

 

③熔断机制,熔断机制,其实很好理解,就像我们家的保险丝,当电流大于某个值的时候,自动熔断保险丝,拒绝提供某种服务,这种做法看上去很Lower,其实不然,比如说,大促的时候,为了保证一些核心功能,比如下单,详细页面,秒杀页面的正常运行,可以让一些其他的辅佐功能,锦上添花的功能做出牺牲,比如推荐系统,好友系统等,暂时都关闭,或者不进行调用,本地给出默认值,减少本地服务器的压力和流量压力

 

④限流,限制流量的方式有很多种,具体实现后面详细说明,我们这边只是说限流的重要性,如果不限流,比如秒杀系统,某个时间点,一下剧增的流量会一下冲垮服务器,所以每个服务提供者要有自我保护方法,最简单的方式就是限制一分钟内,最多调用10000次,次数跟你服务器的性能和你服务的复杂性有关

 

⑤VIP服务,这个功能还是从RocketMQ源码看到的,其实算有点鸡肋吧,不过也还好,所谓VIP服务,就是该服务在另一个端口监听,提供服务,这样做的好处就是与其他的服务隔离开,不公用同一个网络长连接,提供该服务的稳定性和质量

 

初识Provider的主体功能大概就是如此了吧,接下来的小节,我们将实现这些功能,本节END~

 

 

摘自:https://blog.csdn.net/linuu/article/details/52523182