总结无敌花火哥给我们上的RPC公开课
RPC
预备知识
- 反射
- 动态代理 https://www.cnblogs.com/cjtaaa/p/18107339
- SPI
反射
比如说,花火是一个帅哥,他想和女朋友约会,这时候,他会想要买花,于是,他找到了一家花店(抽象service),并且,花店里面有玫瑰(对象),他还做了买玫瑰这个动作(实现方法),此时,他就成功买到花了
再细讲
在Java反射机制的语境下,我们可以将花火购买玫瑰的过程诠释为以下几个步骤,虽然这个例子可能不是反射机制的典型应用,但我们可以为了解释的目的而构建一个场景:
定义接口和服务类:
FlowerService 接口:代表花店服务,声明了购买花卉的方法。
RoseService 类:实现了 FlowerService 接口,是花店的具体实现,提供了购买玫瑰的方法。
使用反射:
花火想要买花,但他不知道哪家花店好,因此他使用了一个花店定位服务(可以是配置文件、注册中心等,这个下文细讲),该服务给了他一个花店接口的实现类名。他使用这个类名,通过反射来实例化花店服务对象,并调用其购买方法。
SPI
SPI机制就是一种“插件式”的扩展方式。系统定义了一组接口,然后不同的服务提供商可以实现这些接口,并提供自己的服务。当系统需要某种服务时,它会通过SPI机制来查找并加载相应的服务实现。就是,你想吃包子,你不用关心包子是怎么做的,你只要知道去哪里买就好了
好了,接下来上图片
RPC (Remote Procedure Call)
序列化与反序列化
啥意思呢,比如说你想发一条消息,肯定是用字符串发出去,那么计算机肯定是看不懂的,那么首先就得把它转换成二进制,这就是序列化,那转换成二进制发过去之后,你朋友看不懂啊,那么就得反序列化,成为正常文字
生产者
生产者,就是服务提供者,首先他肯定要把自己的接口写好,实现好,让别人调用,接着,注册服务到本地,然后注册到服务中心,啥意思呢,比如,你开一家包子店,你肯定希望通过大众点评引流别人才知道你的包子店开在哪里,那么你除了开店之外,还要把它放到大众点评里面,才能被喜欢吃包子的人发现,这样还有什么意义呢,比如说很多人喜欢吃包子,那么就你一家包子店肯定不可靠,这时候肯定大众点评上面,会有很多家包子店,这样第一,你的店不会炸掉,第二,万一你出去度假了,别人还能到其他店吃包子,这就是负载均衡,而且,你开店的时候,你得是不是告诉平台,我还在营业,这样别人才不会跑空造成精神损失,这就是心跳检测
消费者
消费者,就是服务调用者,首先他想调用服务,就要创建一个代理对象,就是比如花海没时间自己买花,他可以叫人帮忙,然后接着就是选择序列化器进行序列化,买花人根据大众点评(注册中心)给的地址,到了花店(抽象类),进而选择买什么花,买玫瑰花(实现类),然后开始买玫瑰花这个动作(就是通过反射机制,调类,调实现类,进而调方法),然后买完玫瑰花,玫瑰花要包装一下(序列化),最后给花火,花火拆开玫瑰花(得到反序列化结果),送给女朋友。。。甜甜的爱情真让人羡慕,希望博主也早日脱单
为什么要RPC
解耦
比如说一个大公司有多个业务,夸张点说,100万个接口,第一,万一系统某个板块出意外,整个系统都要瘫痪掉,损失很大的,假如说成功解耦,一个系统分成n多个服务,服务之间自治,那么,比如说订单崩掉,那还能跑,第二,比如说有些接口冷门比如用户信息,有些热门,比如秒杀,那我是不是用户信息部署一台服务器,秒杀部署100台服务器,很灵活把
给接口减负
接口之间为什么不直接互相调用要那么麻烦搞注册中心呢,还是卖包子的例子,比如消费者都去一家包子店,第一容易导致店炸掉,第二万一人家去度假了,就吃不到了,其次,接口之间通过微服务是横向调用,而直接调用则是纵向调用,要经过一个API层,会比较麻烦
思考
花火提到了一个负载均衡的概念,我个人觉得这肯定是通过某种算法,我希望以后有机会研究将深度强化学习在多任务分配上的优势结合到注册中心的负载均衡中的任务分配,通过深度强化学习算法来优化负载均衡机制我觉得是未来算法岗的一个很好的研究方向,希望它有机会从我的博客变成一篇论文,不管一作是否是我 明天更https://www.cnblogs.com/cjtaaa/p/18130323