+
80
-

gRPC与RPC有什么区别?

gRPC与RPC有什么区别?


网友回复

+
0
-

RPC(Remote Procedure Call,远程过程调用)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络细节的应用程序通信协议。RPC协议构建于TCP或UDP,或者是HTTP上。允许开发者直接调用另一台服务器上的程序,而开发者无需另外的为这个调用过程编写网络通信相关代码,使得开发网络分布式程序在内的应用程序更加容易

RPC采用客户端-服务器端的工作模式,请求程序就是一个客户端,而服务提供程序就是一个服务器端。当执行一个远程过程调用时,客户端程序首先先发送一个带有参数的调用信息到服务端,然后等待服务端响应。在服务端,服务进程保持睡眠状态直到客户端的调用信息到达。当一个调用信息到达时,服务端获得进程参数,计算出结果,并向客户端发送应答信息。然后等待下一个调用。

gRPC是一个高性能、开源、通用的RPC框架。基于HTTP/2协议标准设计开发,默认采用Protocol Buffers数据序列化协议Protocol Buffers基本语法,支持多种开发语言。

grpc有以下特性和优势

Protobuf进行数据编码,提高数据压缩率

使用HTTP2.0弥补了HTTP1.1的不足

同样在调用方和服务方使用协议约定文件,提供参数可选,为版本兼容留下缓冲空间

protobuf是一款用C++开发的跨语言、二进制编码的数据序列化协议,以超高的压缩率著称。它和早期的RPC方案一样,需要双方维护一个协议约束文件,以.proto结尾,使用proto命令对文件进行解析,会生成对应的Stub程序,客户端和服务端都需要保存这份Stub程序用来进行编解码。对于这种协议文件导致的升级困难问题,protobuf 3 中定义的字段默认都是可选的(可以不传),在接口升级时,部分客户端不需要升级自己的Stub程序。

// ***.proto文件
syntax = "proto3";
package id_rpc;
message BusinessType {// 定义参数
string name = 1; //参数字段
}

message UniqueId {// 定义返回值
uint64 id = 1;
string business_type = 2;
}

service UniqueIdService {// 定义服务,可以调用 MakeUniqueId 方法
rpc MakeUniqueId(BusinessType) returns (UniqueId){}
}

对于JSON等文本形式的序列化协议来说,protobuf能有几十倍空间和性能提升, 比如传输123,文本类的需要3个字节(ascii 31 32 33)来传输,而二进制类只需要一个字节(01111011)就可以表示。 同时protobuf会维护.proto文件,这样在解析文件生成Stub程序时,可以对方法名等进行编号,传输时只传编号,而不用传方法的名字,这又可以节省大量字节,还有其他更多的精巧压缩方法,比如TLV,详情可以参考proto encoding 。 解决了数据体积的问题后,gRPC使用HTTP2来改善传输性能。 HTTP2是在HTTP1.1的基础上做了大量的改进,HTTP1.1虽然引入了KeepAlive复用TCP连接,但仍然有很多问题: 使用KeepAlive的请求是串行执行(非pipeline时),pipeline时有队首阻塞问题

每次都需要发送不必要的Header

不能双向通信

简单补充一下pipeline,HTTP1.1中允许多个请求复用连接,同时可以一口气将请求全部发出去,不用一个返回后再发送第二个,提升并发性。而服务端需要将请求的结果,按照pipeline中发送的顺序进行顺序返回,如果靠前的请求阻塞了,那么靠后请求返回就会被动等待。 HTTP2解决了这些问题,引入了新的机制: 在两端建立Header索引表,每次只发送索引,减小header体积

建立虚拟通道,将数据拆分成多个流,每个流有自己的ID和优先级,并且流可以双向传输,每个流可以进一步拆成多个帧。可以将多个请求切成不同的流发送,每个流可以独立返回,避开1.1的串行或队首阻塞问题。 同时,基于HTTP2的数据流机制,gRPC客户端和服务端可以实现批量操作优化,客户端可以攒一些请求,一口气发给服务端,服务端也可以批量返回结果,借此实现流式rpc。

通过对比我们发现grpc只是rpc实现方式中的一种框架或则叫方法,那么还有很多rpc框架,比如Java RMI、WebService的RPC风格、Hession、Thrift、REST API等。

延伸

RPC、RMI、SOAP、REST的区别

RMI(remote method invocation,面向对象的远程方法调用

RPC(remote procedure call,远程过程调用)

SOAP(simple object access protoal,简单对象访问协议)

REST(representational state transfer,表达性状态转移) 可以都理解为调用远程方法的一些通信技术“风格”: · RMI就好比它是本地工作,采用tcp/ip协议,客户端直接调用服务端上的一些方法。优点是强类型,编译期可检查错误,缺点是只能基于JAVA语言,客户机与服务器紧耦合。 · RPC是一个泛化的概念,严格来说一切远程过程调用手段都属于rpc范畴,包括rmi、hessian、soap、thrift、protobuf等等。 · SOAP是在XML-RPC基础上,使用标准的XML描述了RPC的请求信息(URI/类/方法/参数/返回值)。

因为XML-RPC只能使用有限的数据类型种类和一些简单的数据结构,SOAP能支持更多的类型和数据结构。优点是跨语言,非常适合异步通信和针对松耦合的C/S,缺点是必须做很多运行时检查。

· REST一般用来和SOAP做比较,它采用简单的URL方式来代替一个对象,优点是轻量,可读性较好,不需要其他类库支持,缺点是URL可能会很长,不容易解析。

参考文章:https://blog.csdn.net/qq_30505673/article/details/85220651

参考文章 :https://blog.csdn.net/u013952133/article/details/79256799

我知道答案,我要回答