RPC
RPC(Remote Procedure Call Protocol) 远程过程调用协议。通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议。RPC主要作用就是不同的服务间方法调用就像本地调用一样便捷。
常用框架
- 应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
- 远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
- 通信框架:MINA 和 Netty
主流的gRPC、Thrift、Dubbo - gRPC:gRPC是Google开源软件,gRPC是基于HTTP2.0协议,而HTTP2.0是基于二进制的HTTP协议升级版本,底层使用Netty框架支持。
- Thrift:Thrift是Facebook开源项目,其是一个跨语言的服务开发框架。用户只需在进行二开即可,对底层的RPC通讯透明。
- Dubbo:Dubbo是阿里开源组件协议和序列化框架都可以插拔,依托Spring框架开发,远程接口是基于Java接口,适用于微服务架构
为什么用RPC - 服务化:微服务化,跨平台的服务之间远程调用;
- 分布式系统架构:分布式服务跨机器进行远程调用;
- 服务可重用:开发一个公共能力服务,供多个服务远程调用。
- 系统间交互调用:两台服务器A、B,服务器A上的应用a需要调用服务器B上的应用b提供的方法,而应用a和应用b不在一个内存空间,不能直接调用,此时,需要通过网络传输来表达需要调用的语义及传输调用的数据。
场景 - 大型网站:内部涉及多个子系统,服务、接口较多。
- 注册发现机制:如Nacos、Dubbo等,一般都有注册中心,服务有多个实例,调用方调用的哪个实例无感知。
- 安全性:不暴露资源。
- 服务化治理:微服务架构、分布式架构。
一次RPC过程 - 客户端(Client)通过本地调用的方式调用服务(以接口方式调用)——(调用服务);
- 客户端存根(Client Stub)接收到调用请求后负责将方法、入参等信息进行组装序列化成能够进行网络传输的消息体(将消息体对象序列化为二进制流)——(接收到之后将信息转为二进制);
- 客户端存根(Client Stub)找到远程的服务地址,并且将消息通过网络发送给服务端(通过sockets发送消息)——(找到地址发送给服务端);
- 服务端存根(Server Stub)收到消息后进行反序列化操作,即解码(将二进制流反序列化为消息对象)——(服务端收到之后将二进制转化为信息:解码);
- 服务端存根(Server Stub)通过解码结果调用本地的服务进行相关处理——(调用服务);
- 服务端(Server)本地服务业务处理——(开始服务);
- 服务端(Server)将处理结果返回给服务端存根——(服务结果存根);
- 服务端存根(Server Stub)序列化处理结果(将结果消息对象序列化为二进制流)——(结果二进制);
- 服务端存根(Server Stub)将序列化结果通过网络发送至客户端(通过sockets发送消息)——(发送给客户端);
- 客户端存根(Server Stub)接收到消息,进行反序列化解码(将结果二进制流反序列化为消息对象)——(收到信息并解码);
- 客户端得到最终的结果。
服务寻址、序列化和反序列化、网络传输功能
基于不同协议的RPC - 基于TCP协议实现的RPC调用,由于是底层协议栈,更佳灵活的对协议字段进行定制,可减少网络开销,提高性能,实现更大的吞吐量和并发数。但,底层复杂,实现代价高。
- 基于HTTP协议实现的RPC调用,已封装实现序列化,但HTTP属于应用层协议,HTTP传输所占用的字节数比TCP更高,传输效率对比TCP较低。
RPC与Restful API对比 - 侧重不同
RPC侧重于操作
Restful侧重于资源 - 传输效率
RPC效率更高,可自定义TCP协议,控制请求报文体积。
Restful效率更低,基于HTTP协议。 - 复杂度
RPC实现复杂,需关注服务寻址、序列化和反序列化及网络传输,调用流程繁琐。
Restful实现简单,无需关注序列化和反序列化、网络传输,调用流程便捷。 - 使用场景
RPC适用于公司内部服务调用,如部门之间不同平台的服务调用,性能消耗低,传输效率高,实现复杂一些。
HTTP主要用于外部异构环境,浏览器接口调用、第三方接口调用等。

浙公网安备 33010602011771号