转码(transcode)指的是将 HTTP JSON 调用转换成 RPC,并将它们传递给 gRPC 服务的过程。当客户端应用程序不支持 gRPC,并且需要通过基于 HTTP 的 JSON 方式提供对 gRPC 服务的访问时,转码是非常有用的。有一个使用 C++ 语言编写的库支持 HTTP/JSON 转码,名为grpc-httpjson-transcoding,目前它用到了 Istio 和 Google Cloud 端点。
Envoy 代理也通过提供一个到 gRPC 服务的 HTTP/JSON 接口来支持转码。与 gRPC 网关类似,我们需要为 gRPC 服务提供带有 HTTP 映射的服务定义。它使用与 Google API 文档中所声明的相同的映射规则。因此,代码清单 8-1 所修改的服务定义也能用到 HTTP/JSON 转码中。
例如,ProductInfo 服务的 getProduct 方法定义在 .proto 文件中,其请求和响应类型如下所示:
rpc getProduct(google.protobuf.StringValue) returns (Product) {
option (google.api.http) = {
get:"/v1/product/{value}"
};
}
如果客户端通过 GET 方法对 URL http://localhost:8081/v1/product/2
调用该方法,那么代理服务器会创建一个值为 2 的google.protobuf.StringValue
,并使用它来调用 gRPC 方法getProduct()
。接下来,gRPC 后端会返回所请求的 ID 为 2 的Product,代理服务器会将其转换成 JSON 格式并返回给客户端。
我们讨论完了 HTTP/JSON 转码。8.3 节将讨论另一个重要的概念,叫作gRPC 服务器端反射。
文档更新时间: 2023-09-02 07:30 作者:Minho