什么是RPC?
RPC(Remote Procedure Call),远程过程调用。
其对应的协议称为RPC协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
用于解决分布式系统中服务之间的调用问题。通俗地讲,就是开发者能够像调用本地方法一样调用远程的服务。所以,RPC的作用主要体现在这两个方面:
①:屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法;
②:隐藏底层网络通信的复杂性,让我们更专注于业务逻辑。
什么时候需要RPC?
当我们的项目太大,需要解耦服务,扩展性强、部署灵活,这时就要用到 RPC ,主要解决了分布式系统中,服务与服务之间的调用问题
RPC框架的原理?
RPC框架的主要目标就是让远程服务调用更简单、透明。
RPC框架一般用来实现同一内网内部署在不同机器上的系统之间的方法调用,RPC框架负责屏蔽底层的传输方式(TCP或者UDP)、序列化方式和网络通信细节。使开发人员不必关心底层通信细节和调用过程,像调用本地服务一样调用远程服务。
RPC框架组件:
一个基本的RPC框架里面应该至少包含以下4个组件:
1、客户端(Client):服务调用方
2、客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数、数据信息打包成网络消息,再通过网络传输发送到服务端
3、服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理
4、服务端(Server):服务的真正提供者
组件之间的交互:
①:服务端在启动后,会将它提供的服务列表发布到注册中心,客户端向注册中心订阅服务地址
②:客户端会通过本地代理模块Proxy调用服务端,Proxy模块收到负责将方法、参数等数据转化为网络字节流
③:客户端从服务列表中选取其中一个的服务地址,并将数据通过网络发送给服务端
④:服务端收到数据后进行解码,得到请求信息
⑤:服务端根据解码后的请求信息调用对应的服务,然后将调用结果返回给客户端
补充:服务注册中心(Registry),负责将本地服务发布成远程服务,管理远程服务,提供给服务消费者使用
RPC调用过程:
RPC框架的实现目标就是将上面的2-10步骤完美的封装起来,让用户感觉上像调用本地服务一样的调用远程服务。
调用过程:
①:服务消费方(client)以本地调用方式调用服务
②:client stub 接收到调用后负责将方法、参数等封装成能够进行网络传输的消息体(序列化)
③:client stub 将消息进行编码并发送到服务端
④:server stub 收到消息后进行解码(反序列化)
⑤:server stub 根据解码结果调用本地的服务server
⑥:本地服务server执行业务逻辑处理
⑦:本地服务server将结果返回给 server stub
⑧:server stub 将返回结果进行编码(序列化)
⑨:server stub 将处理结果通过网络发送给client stub
⑩:client stub 接收到消息并进行解码(反序列化)
⑪、服务消费方(client)得到结果
RPC使用了哪些关键技术?
1、动态代理
2、序列化和反序列化
3、NIO通信(高性能网络传输)
4、服务注册发现
主流的RPC框架
dubbo
gRPC
thrift
RPC优点
跨语言(C++、PHP、Java、Python ...)
协议私密,安全性较高
数据传输效率高
支持动态扩展
HTTP 和 RPC 的优缺点
1、传输协议
RPC:可以基于TCP协议,也可以基于HTTP协议
HTTP:基于HTTP协议
2、传输效率
RPC:使用自定义的TCP协议,可以让请求报文体积更小,或者使用HTTP2协议,也可以很好的减少报文的体积,提高传输效率
HTTP:如果是基于HTTP1.1的协议,请求中会包含很多无用的内容,如果是基于HTTP2.0,那么简单的封装以下是可以作为一个RPC来使用的,这时标准RPC框架更多的是服务治理
3、性能消耗,主要在于序列化和反序列化的耗时
RPC:可以基于thrift实现高效的二进制传输
HTTP:大部分是通过json来实现的,字节大小和序列化耗时都比thrift要更消耗性能
4、负载均衡
RPC:基本都自带了负载均衡策略
HTTP:需要配置Nginx,HAProxy来实现
5、服务治理(下游服务新增,重启,下线时如何不影响上游调用者)
RPC:能做到自动通知,不影响上游
HTTP:需要事先通知,修改Nginx/HAProxy配置
END.