如何在 Apinto 实现 HTTP 与 gRPC 的协议转换(上)

lxf2023-05-06 03:35:02

如何在 Apinto 实现 HTTP 与 gRPC 的协议转换(上)


什么是 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 多协议支持的基础上,发布了 HTTPgRPC 插件:(eolinker.com:apinto:http_to_grpc)


在 Apinto 上 HTTP 转 gRPC 插件

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

如何在 Apinto 实现 HTTP 与 gRPC 的协议转换(上)

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

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


配置 Protocol Buffer

1. 创建示例文件 msg.proto

如何在 Apinto 实现 HTTP 与 gRPC 的协议转换(上)

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

2. 创建示例文件 service.proto

如何在 Apinto 实现 HTTP 与 gRPC 的协议转换(上)

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


配置服务端程序

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

如何在 Apinto 实现 HTTP 与 gRPC 的协议转换(上)

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

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

如何在 Apinto 实现 HTTP 与 gRPC 的协议转换(上)

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

如何在 Apinto 实现 HTTP 与 gRPC 的协议转换(上)

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

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

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

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

如何在 Apinto 实现 HTTP 与 gRPC 的协议转换(上)

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

4. 编译 gRPC 服务器程序

如何在 Apinto 实现 HTTP 与 gRPC 的协议转换(上)

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

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