0
点赞
收藏
分享

微信扫一扫

gRPC初探

前序

RPC是一种远程程序调用方案(Remote Procedure Call ),即客户端服务调用远程服务器上的程序或者服务,包括通信协议与序列化协议,在传输层及以上使用。

HTTP作为一种应用层的通信协议,也可以被用于实现RPC.

RPC协议与HTTP协议的区别

1、RPC是一种API,HTTP是一种无状态的网络协议。RPC可以基于HTTP协议实现,也可以直接在TCP协议上实现。

2、RPC主要是用在大型网站里面,因为大型网站里面系统繁多,业务线复杂,而且效率优势非常重要的一块,这个时候RPC的优势就比较明显了。

3、HTTP开发方便简单、直接。开发一个完善的RPC框架难度比较大。

4、HTTP发明的初衷是为了传送超文本的资源,协议设计的比较复杂,参数传递的方式效率也不高。开源的RPC框架针相对于HTTP灵活度更高,可以省去不必要的字段,对远程调用协议上的效率会比HTTP快很多。

5、HTTP需要事先通知,修改Nginx/HAProxy配置。RPC能做到自动通知,不影响上游。

6、HTTP大部分是通过Json来实现的,字节大小和序列化耗时都比Thrift要更消耗性能。RPC,可以基于Thrift实现高效的二进制传输。

gRPC协议实现原理

gRPC是一种由Google开发的开源通信协议,是RPC框架的一种,其它的RPC框架有Dubbo、Thrift、Hprose等。

通常使用HTTP REST传输数据,并在两个服务之间进行序列化和反序列化操作,传统的REST接口采用JSON,XML或者其它的一些格式作为数据载体,这种设计在大型数据流量中会使得服务运行缓慢,内存占用较高且传输过程没有压缩。

而gRPC的序列化方式是采用protobuf格式的,与传统REST接口的JSON等有很多优点,缺点是易读性差。

protobuf优点包括:相同的有效带宽中,同一数据包传输次数更多;数据越小,序列化越快;跨平台、可多语言开发不受限制;可利用proto工具生成各语言代码,非常方便。

json是文本文件,基于字符;protobuf是二进制编码,基于值。

与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

gRPC初探_数据

gRPC使用流程

  1. 定义标准的proto文件
  2. 生成标准代码
  3. 服务端使用生成的代码提供服务
  4. 客户端使用生成的代码调用服务

代码生成

  1. 所有gRPC框架都为代码生成提供了一流的支持。gRPC开发的核心文件是*.proto文件 ,它定义了gRPC服务和消息的约定。根据这个文件,gRPC框架将生成服务基类,消息和完整的客户端代码。
  2. 通过在服务器和客户端之间共享*.proto文件,可以从端到端生成消息和客户端代码。客户端的代码生成消除了客户端和服务器上的重复消息,并为您创建了一个强类型的客户端。无需编写客户端代码,可在具有许多服务的应用程序中节省大量开发时间。

严格的规范

  1. 不存在具有JSON的HTTP API的正式规范。开发人员不需要讨论URL,HTTP动词和响应代码的最佳格式。(想想,是用Post还是Get好?使用Get还是用Put好?一想到有选择恐惧症的你是不是又开了纠结,然后浪费了大量的时间)
  2. 该gRPC规范是规定有关gRPC服务必须遵循的格式。gRPC消除了争论并节省了开发人员的时间,因为gPRC在各个平台和实现之间是一致的。

  1. HTTP/2为长期的实时通信流提供了基础。gRPC通过HTTP/2为流媒体提供一流的支持。
  2. 一元(没有流媒体): 简单rpc 这就是一般的rpc调用,一个请求对象对应一个返回对象。客户端发起一次请求,服务端响应一个数据,即标准RPC通信。
  3. 服务器到客户端流:客户端流式rpc 客户端传入多个请求对象,服务端返回一个响应结果。应用场景:物联网终端向服务器报送数据。
  4. 客户端到服务器流:服务端流式rpc 一个请求对象,服务端可以传回多个结果对象。服务端流 RPC 下,客户端发出一个请求,但不会立即得到一个响应,而是在服务端与客户端之间建立一个单向的流,服务端可以随时向流中写入多个响应消息,最后主动关闭流,而客户端需要监听这个流,不断获取响应直到流关闭。应用场景举例:典型的例子是客户端向服务端发送一个股票代码,服务端就把该股票的实时数据源源不断的返回给客户端。
  5. 双向流媒体:双向流式rpc 结合客户端流式rpc和服务端流式rpc,可以传入多个对象,返回多个响应对象。应用场景:聊天应用。

protobuf

  • protobuf 即 Protocol Buffers,是一种轻便高效的结构化数据存储格式,与语言、平台无关,可扩展可序列化
  • Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。json、xml都是基于文本格式,protobuf 是以二进制方式存储的,占用空间小,但也带来了可读性差的缺点。
  • protobuf 在通信协议和数据存储等领域应用广泛。例如著名的分布式缓存工具 Memcached 的 Go 语言版本groupcache 就使用了 protobuf 作为其 RPC 数据格式。
  • Protobuf 在 .proto 定义需要处理的结构化数据,可以通过 protoc 工具,将 .proto 文件转换为 C、C++、Golang、Java、Python 等多种语言的代码,兼容性好,易于使用


举报

相关推荐

0 条评论