什么是 gRPC

 像 gRPC 是由 google 开发的一个高性能、通用的开源 RPC 框架,主要面向移动应用开发且基于 HTTP/2 协议标准而设计,同时支持大多数流行的编程语言。

gRPC 基于 HTTP/2 协议传输,而 HTTP/2 相比 HTTP1.x ,有以下优势:

  1. 采用二进制格式传输协议,支持多路复用;
  2. 支持通过同一个连接发送多个并发的请求,支持流式传输;
  3. 服务器可以对客户端的一个请求发送多个响应;
  4. 对消息头进行了压缩传输,能够节省消息头占用的网络流量。
    gRPC 使用 Protocol Buffers 作为序列化协议。

但同时,gRPC 也有自身的局限性:

1. 浏览器支持有限:

当下,不可能直接从浏览器调用 gRPC 服务。gRPC 大量使用 HTTP/2 功能,没有浏览器提供支持 gRPC 客户机的 Web 请求所需的控制级别。例如,浏览器不允许调用者要求使用的 HTTP/2 ,或者提供对底层 HTTP/2 框架的访问。

2. 不是人类可读的:

HTTP API 请求以文本形式发送,可以由人读取和创建。默认情况下, gRPC 消息使用 protobuf 编码。虽然 protobuf 的发送和接收效率很高,但它的二进制格式是不可读的。protobuf 需要在 *.proto 文件中指定的消息接口描述才能正确反序列化。需要额外的工具来分析线路上的 Protobuf 有效负载,并手工编写请求。

若需要将内部 gRPC 作为接口开放给外部用户或浏览器调用,则需要有第三方代理解决 HTTP 协议转换成 gRPC 协议的问题。

为此,我们在 Apinto 多协议支持的基础上,发布了 HTTP 转 gRPC 插件:(eolinker.com:apinto:http_to_grpc)

在 Apinto 上 HTTP 转 gRPC 插件

Apinto 通过插件的方式支持 HTTP 协议转换成 gRPC 协议请求,在http_to_grpc 插件中完成了 HTTP 客户端 与 gRPC`Server` 通讯时的协议转换及数据编解码工作,其通讯的过程如下:

grpc流式传输有什么好处 grpc流式的传输性能_http

 

接下来通过一个完整的示例向大家演示怎样构建一个 HTTP请求,并通过 Apinto 进行 HTTP协议 转换成 gRPC协议请求。在以下的示例中,我们会将 Go 作为 gRPC`Server 服务端处理程序,使用 Eolink 作为 HTTP 客户端,发起 HTTP` 请求。

以下示例可以在 Apinto 仓库中获取。

配置 Protocol Buffer

1. 创建示例文件 msg.proto

grpc流式传输有什么好处 grpc流式的传输性能_grpc流式传输有什么好处_02

 该文件定义了示例消息类型,我们在这里定义了一个 HelloRequest 和 HelloResponse 的 message。
 

2. 创建示例文件 service.proto

grpc流式传输有什么好处 grpc流式的传输性能_grpc流式传输有什么好处_03

 该文件定义了服务 Hello,引入了第一步创建的文件 msg.proto,定义了四个方法,包含了一元 RPC、客户端流、服务端流、双向流四种 gRPC 通信模式。

配置服务端程序

1. 创建自动生成 gRPC 文件脚本(grpc.sh)

grpc流式传输有什么好处 grpc流式的传输性能_开源_04

 该脚本将生成 gRPC 客户端/服务端调用相关代码,并将其存储到 demo_service目录下。

执行 grpc.sh,生成服务端 Go 原始消息和服务/客户端存根。

grpc流式传输有什么好处 grpc流式的传输性能_gRPC_05

2. 实现服务端处理程序接口

grpc流式传输有什么好处 grpc流式的传输性能_gRPC_06

 上述代码重新定义了 Hello 方法:

将 HelloRequest 中的 name 字段通过 HelloResponse 的 msg 字段封装成hello,%s 的结果返回

将请求的 Header 作为 gRPC 响应的 Trailer 头部返回
 

3. 定义 gRPC 服务端入口文件

grpc流式传输有什么好处 grpc流式的传输性能_开源_07

 在此处,gRPC 服务端开启了 gRPC 反射,配置 Apinto 网关时,可选择绑定具体的 Protobuf 资源,也可以直接启用反射,动态获取 gRPC 服务端的 Protobuf 信息。
 

4. 编译 gRPC 服务器程序

grpc流式传输有什么好处 grpc流式的传输性能_http_08

 上文介绍了如何构造 gRPC 示例服务器,下文将使用该示例服务器,结合 Apinto-Dashboard 来演示如何将 HTTP 协议转成 gRPC 。

更多使用方式可到我们的 Github 进一步了解:https://github.com/eolinker/apinto