使用 API7 企业版代理 gRPC 服务
Google Remote Procedure Call(gRPC)是基于 HTTP/2 协议的开源高性能远程过程调用(Remote Procedure Call,RPC)框架。gRPC 使用 Protocol Buffers(protobuf)作为接口描述语言(Interface Description Language,IDL)。API7 企业版提供协议转换、负载均衡、身份验证和授权等关键功能,增强了 gRPC 的潜力。
本指南介绍如何使用 API7 企业版代理 gRPC 服务。
前提条件
- 安装 API7 企业版。
- 安装 gRPCurl,将请求发送到 gRPC 服务器进行验证。
部署示例 gRPC 服务器
启动示例 gRPC 服务器。
API7 提供了一个 gRPC 服务示例,用于测试。你可以使用以下命令在端口
50051
上启动示例 gRPC 服务器的 Docker 实例grpc-service
:docker run -d --name grpc-service -p 50051:50051 --restart always api7/grpc-server-example:1.0.0
列出可用的 gRPC 服务和方法,验证 gRPC 服务器是否启动成功:
gRPC 服务
grpcurl -plaintext 127.0.0.1:50051 list
你应该看到以下输出:
grpc.reflection.v1alpha.ServerReflection
helloworld.Greeter
helloworld.TestImportgRPC 方法
grpcurl -plaintext 127.0.0.1:50051 list helloworld.Greeter
你应该看到以下输出:
helloworld.Greeter.GetErrResp
helloworld.Greeter.Plus
helloworld.Greeter.SayHello
helloworld.Greeter.SayHelloAfterDelay
helloworld.Greeter.SayHelloBidirectionalStream
helloworld.Greeter.SayHelloClientStream
helloworld.Greeter.SayHelloServerStream
更新 API7 网关实例
默认情况下,API7 网关实例在端口 9443
上支持 TLS 加密的 HTTP/2。在本教程中,你可以添加端口 9081
,支持不加密的 HTTP/2,然后将端口 9081
映射到主机上的同一端口。
apisix:
node_listen:
- port: 9080
enable_http2: false
- port: 9081
enable_http2: true
在 api7-ee
目录下重新运行 docker-compose up -d
命令,更新 API7 网关配置。
创建服务和路由
本示例创建一个名为 grpc-example
的服务和一个名为 helloworld.Greeter
的路由。
- 打开 API7 控制台。
- 创建服务。
- 从左侧导航栏中选择服务,然后单击新增服务。
- 选择手动新增,弹出新增服务对话框。
- 在新增服务对话框中,执行以下操作:
- 在名称字段中,输入
grpc-example
。 - 在上游 Scheme 字段中,选择
gRPC
。
- 在名称字段中,输入
- 单击新增。
- 创建路由。
- 单击上一步中创建的服务,然后单击添加路由。弹出新增路由对话框。
- 在新增路由对话框中,执行以下操作:
- 在路由名称字段中,输入
ghelloworld.Greeter
。 - 在路径字段中,输入
/helloworld.Greeter/SayHello
。 - 在 HTTP 方法字段中,选择
GET
和POST
。
- 在路由名称字段中,输入
- 单击新增。
发布服务
- 从左侧导航栏中选择服务,然后选择
grpc-example
服务并单击立即发布。 - 选择
缺省网关组
,然后单击下一步。 - 在弹出的对话框中,执行以下操作:
- 在新版本字段中,输入
1.0.0
。 - 在如何找到上游字段中,选择
使用节点
。
- 在新版本字段中,输入
- 单击新增节点,弹出新增节点对话框,如下所示:
- 在新增节点 对话框中,执行以下操作:
- 在主机 字段中,输入你本机的 IP 地址。
- 在端口 字段中,输入
50051
。 - 在权重 字段中,使用默认值
100
。
- 单击新增。
- 确认服务信息,然后单击发布。
验证 gRPC 服务
本示例通过 helloworld.proto
文件确保 gRPCurl
CLI 工具将请求和响应格式与 gRPC 服务定义保持一致。你可以在此处找到 helloworld.proto
示例文件。
grpcurl -plaintext -proto helloworld.proto -d '{"name":"apisix"}' 127.0.0.1:9081 helloworld.Greeter.SayHello # Replace 127.0.0.1 to your local host IP address
你应该看到以下输出:
{
"message": "Hello apisix"
}
相关主题
如需了解如何使用 grpc-transcode
插件在 RESTful HTTP 请求和 gRPC 请求之间进行转换,请参阅相关文档(即将推出)。