grpc-transcode
grpc-transcode 插件用于在 HTTP 请求和 gRPC 请求及其对应响应之间进行转换。
启用该插件后,APISIX 接收客户端的 HTTP 请求,将其转换后转发到上游 gRPC 服务。APISIX 收到 gRPC 响应后,会将响应转换回 HTTP 响应并发送给客户端。
示例
前提条件
- 对于需要认证的 Admin API 示例,请将管理员角色的密钥导出为
ADMIN_API_KEY。该密钥在deployment.admin.admin_key中配置。Docker 快速入门会关闭此认证以便本地评估;生产环境中应保持启用。
以下命令假设网关位于 Docker 快速入门所使用的 apisix-quickstart-net 网络中。对于其他部署,请将示例服务器连接到该网关可访问的网络。
以下示例演示了如何在不同场景下配置 grpc-transcode 插件。
要跟随示例操作,请在 Docker 中启动一个示例 gRPC 服务器:
docker run -d \
--name grpc-example-server \
--network apisix-quickstart-net \
-p 50051:50051 \
api7/grpc-server-example:1.0.2
在 HTTP 和 gRPC 请求之间转换
以下示例演示了如何在 APISIX 中配置 protobuf,并使用 grpc-transcode 插件在 HTTP 和 gRPC 请求之间进行转换。
- Admin API
- ADC
- Ingress Controller
创建一个 proto 资源来存储 protobuf:
curl "http://127.0.0.1:9180/apisix/admin/protos" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "echo-proto",
"content": "syntax = \"proto3\";
package echo;
service EchoService {
rpc Echo (EchoMsg) returns (EchoMsg);
}
message EchoMsg {
string msg = 1;
}"
}'
创建一个启用 grpc-transcode 插件的路由:
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "grpc-transcode-route",
"methods": ["GET"],
"uri": "/echo",
"plugins": {
"grpc-transcode": {
"proto_id": "echo-proto",
"service": "echo.EchoService",
"method": "Echo"
}
},
"upstream": {
"scheme": "grpc",
"type": "roundrobin",
"nodes": {
"grpc-example-server:50051": 1
}
}
}'
❶ proto_id:定义 gRPC 服务的 proto 对象的 ID
❷ service:要交互的 gRPC 服务
❸ method:要使用的 gRPC 方法
为了验证,向路由发送一个带有 EchoMsg 中定义的参数的 HTTP 请求:
curl "http://127.0.0.1:9080/echo?msg=Hello"
你应该收到以下响应:
{"msg":"Hello"}
ADC 目前不支持配置 proto 资源,因此无法仅使用 ADC 完成此示例。
Ingress Controller 目前不支持配置 proto 资源,因此无法使用 Ingress Controller 资源完成此示例。
使用 .pb 文件配置 Protobuf
以下示例演示了如何在 APISIX 中使用 .pb 文件配置 protobuf,并使用 grpc-transcode 插件在 HTTP 和 gRPC 请求之间进行转换。
如果你的 proto 文件包含导入,或者你想要组合多个 proto 文件,可以使用 protoc 工具生成 .pb 文件,并在 APISIX 中使用它,步骤如下。
- Admin API
- ADC
- Ingress Controller
将 protocol buffer 定义保存到名为 echo.proto 的文件中:
syntax = "proto3";
package echo;
service EchoService {
rpc Echo (EchoMsg) returns (EchoMsg);
}
message EchoMsg {
string msg = 1;
}
使用 protoc 工具生成 .pb 文件,并将其输出到名为 echo_proto.pb 的新文件中:
protoc --include_imports --descriptor_set_out=echo_proto.pb echo.proto
将 .pb 文件从二进制转换为 base64 并在 APISIX 中进行配置:
curl "http://127.0.0.1:9180/apisix/admin/protos" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
--data-binary @- <<EOF
{
"id": "echo-proto",
"content" : "$(base64 -w0 /path/to/echo_proto.pb)"
}
EOF
创建一个启用 grpc-transcode 插件的路由:
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "grpc-transcode-route",
"methods": ["GET"],
"uri": "/echo",
"plugins": {
"grpc-transcode": {
"proto_id": "echo-proto",
"service": "echo.EchoService",
"method": "Echo"
}
},
"upstream": {
"scheme": "grpc",
"type": "roundrobin",
"nodes": {
"grpc-example-server:50051": 1
}
}
}'
为了验证,向路由发送一个带有 EchoMsg 中定义的参数的 HTTP 请求:
curl "http://127.0.0.1:9080/echo?msg=Hello"
你应该收到以下响应:
{"msg":"Hello"}
ADC 目前不支持配置 proto 资源,因此无法仅使用 ADC 完成此示例。
Ingress Controller 目前不支持配置 proto 资源,因此无法使用 Ingress Controller 资源完成此示例。