RPC、gRPC的原理、架构、调用过程,特性

1.RPC的原理

RPC(Remote Procedure Call)指远程过程调用,它将服务器端的请求变成了本地方法调用。其屏蔽底层的传输方式(TCP/UDP)、序列化方式(XML/Json/ 二进制)和通信细节。可以看成是对数据的传输、序列化以及通信做了一层封装。服务调用者可以像调用本地接口一样调用远程的服务,而不需要关心底层通信细节和调用过程。主要用于异构的分布式系统之间的通信。随着系统复杂度的增加,我们不得不将一个大的应用拆分为多个服务,这种拆分既包括水平方向拆分(按照功能模块拆分),也包括垂直方向拆分(按照应用所处的层拆分)。进行服务拆分后,由于服务分布在多台服务器上,所以相互之间的调用需要通过网络来进行。RPC的主要目标是在尽量保证提供类似本地调用的简洁语义的基础上,让分布式应用之间的通信变得更加方便和高效。RPC框架需要提供一种透明调用机制,使得调用者无须显式地区分本地调用和远程调用,同时基于 RPC 使得服务治理(服务限流、服务熔断等)更加方便。

RPC框架

支持多语言的PRC框架,比较成熟的有 Google 的 gRPC、Apache(Facebook)的 Thrift;
支持特定语言的 RPC 框架,如新浪微博的 Motan;
支持服务治理等服务化特性的分布式服务框架,其底层内核仍然是RPC框架, 例如阿里的 Dubbo。

RPC的调用分为异步和同步两种方式,异步调用不用等待调用结果,而同步调用需要等待调用结果的返回。

RPC 架构包含4个核心组件:客户端(Client)、客户端存根(Client Stub)、服务端(Server)及服务端存根(Server Stub)。

(1)客户端:服务的调用者。

(2)客户端存根:存放服务端的服务列表,将客户端请求打包并通过网络发送到服务端。

(3)服务端:服务提供者。

(4)服务端存根:接收客户端消息并解包,然后调用本地的方法。

RPC的调用过程主要包括:建立通信、服务寻址、网络传输、服务调用和返回。一个典型的RPC调用的详细流程如图所示。

 

(1)客户端以本地调用的方式发起调用,这时调用的其实是客户端存根。

(2)客户端存根在收到调用后,负责将被调用的方法名、参数等打包并编码成特定格式的能进行网络传输的消息体。

(3)客户端存根将消息体通过网络发送给服务端。

(4)服务端存根通过网络接收到消息,按照相应的格式进行拆包、解码,获取方法名和参数。

(5)服务端存根根据方法名和参数进行本地调用,这时调用的是真正的服务提供者。

(6)服务提供者调用本地服务,然后将结果返回给服务端存根。

(7)服务端存根将返回值打包并编码成消息。

(8)服务端存根通过网络将消息发送给客户端。

(9)客户端存根在收到消息后,进行拆包、解码并返回给客户端。

(10)服务端存根得到本次RPC调用的最终结果。

在RPC中一般会用到动态代理、序列化反序列化、NIO网络通信、服务注册和发现等技术。

gRPC

gRPC是由Google开发的一款语言中立、平台中立、开源的远程过程调用(RPC)系统。在gRPC中,客户端应用可以像调用本地方法一样直接调用另一台不同机器上的服务端应用的方法,使得能够更容易地创建分布式应用和服务。

grpc的过程
建立连接
使用http/2协议,它比http1.x的特色在于采用新的二进制格式,多路复用,header压缩。这些特点都有利于提高传输效率。

寻址
由调用方提供要调用的方法,对方网络地址,端口。当然,这些细节都会在gRPC框架内做好映射:本地只要通过gRPC调用方法,就会自动去向对方请求,这个过程是透明的。

序列化与反序列化
网络传输过程都是用二进制流的形式。因为本地的序列化方式和远处的反序列化方式都是对应的,所以安全性也有了保障。哪怕有人截取了中间的信息,也只能得到二进制数据。这就不像http请求那样,会考虑到中间人攻击之类的问题。
为了提高序列化和反序列化的效率,gRPC采用的protobuf格式,压缩效率比常见的json和xml更高。

grpc的特点
1.支持多种语言
2.基于IDL文件定义服务,通过proto3工具生成指定语言的数据结构
3.基于HTTP/2设计,支持双向流、消息头压缩、多路复用、服务端推送等特性,在移动端设备上更省流量
4.序列化支持PB和JSON,PB 是一种语言无关的高性能序列化框架,基于 HTTP/2 + PB, 保障了 RPC 调用的高性能。
5.服务的实现不是通过反射实现,而是通过proto工具生成的代码实现,性能更优
 

grpc与restful
REST描述的是在网络中client和server的一种交互形式;REST本身不实用,实用的是如何设计 RESTful API。
REST全称Resource Representational State Transfer:通俗来讲就是资源在网络中以某种表现形式进行状态转移

Resource:资源,即数据,可以理解为某个url资源
Representational:某种表现形式,比如用JSON,XML,JPEG等;
State Transfer:状态变化。通过HTTP动词实现。如Get、Post、Delete等

restful和grpc都是服务器与客户端的常用交互方式。RESTful通常使用 http+JSON 或 XML 的格式传输信息,而gRPC采用protobuf传输信息,proto会提供更严格的接口约束条件,安全性更高,对于高并发的场景更适用。但是grpc的可读性不如restful的可读性
restful通过暴露服务接口的方式去提供接口调用,但是采用grpc,其服务的接口会放在客户端。由于restful是采用的http,需要三次握手建立连接,因此其效率会比restful更快。

在这里插入图片描述

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值