跳到主要内容
版本:3.9.x

代理 gRPC 流量

gRPC(Google Remote Procedure Call)是一个基于 HTTP/2 协议的开源、高性能的远程过程调用(RPC)框架。它使用 Protocol Buffers(protobuf)作为接口描述语言(IDL)。API7 企业版提供了包括协议转换、负载均衡、身份验证和授权等关键功能,极大地提升了 gRPC 的应用潜能。

本指南介绍了如何使用 API7 企业版代理 gRPC 服务的流量。

下面是一个交互式演示,提供了使用 API7 企业版代理 gRPC 流量的实际上手介绍。

前提条件

  1. 安装 API7 企业版
  2. (可选)如有需要,完成在 Kubernetes 上部署 API7 Ingress Controller
  3. 安装 gRPCurl,用于向 gRPC 服务发送请求以进行验证。

部署一个示例 gRPC Server

API7 提供了一个用于测试的示例 gRPC 服务。你可以根据你的 API7 安装环境,选择在 Docker 或 Kubernetes 中启动该服务。

启动服务

在 Docker 中启动一个示例 gRPC 服务,监听 50051 端口:

docker run -d \
--name grpc-service \
--network=api7-ee_api7 \
-p 50051:50051 \
--restart always api7/grpc-server-example:1.0.0

验证安装

通过列出所有可用的 gRPC 服务和方法,验证 gRPC 服务是否已成功启动:

grpcurl -plaintext 127.0.0.1:50051 list

你应该能看到以下输出:

grpc.reflection.v1alpha.ServerReflection
helloworld.Greeter
helloworld.TestImport

列出 helloworld.Greeter 服务的所有可用方法:

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

创建服务和路由

在本节中,你将创建一个服务并为其配置路由,将流量代理至示例 gRPC 服务。

创建服务

  1. 从侧边导航栏选择你的网关组下的 已发布服务(Published Services),然后点击 添加服务(Add Service)
  2. 选择 手动添加(Add Manually)
  3. 在对话框中,执行以下操作:
  • 名称(Name) 字段中,输入 grpc-example
  • 服务类型(Service Type) 字段中,选择 HTTP(七层代理)
  • 上游协议(Upstream Scheme) 字段中,选择 gRPC
  • 如何寻找上游(How to find the upstream) 字段中,选择 使用节点(Use Nodes)
  • 点击 添加节点(Add Node)
  • 添加节点(Add Node) 对话框中,执行以下操作:
    • 主机(Host) 字段中,输入你的私有 IP 地址,如 192.168.2.103
    • 端口(Port) 字段中,输入 50051
    • 权重(Weight) 字段中,使用默认值 100
  • 点击 添加(Add)

创建路由

  1. 在你刚才创建的服务中,点击 添加路由(Add Route)
  2. 在对话框中,执行以下操作:
  • 名称(Name) 字段中,输入 helloworld.Greeter
  • 路径(Path) 字段中,输入 helloworld.Greeter/SayHello
  • 方法(Methods) 字段中,选择 GETPOST
  • 点击 添加(Add)

更新 API7 网关以允许 HTTP/2

默认情况下,API7 网关实例支持 9443 端口上基于 TLS 加密的 HTTP/2。对于未加密的 HTTP/2 流量,你可以在网关配置中新增一个端口。

在本节中,你将更新 API7 网关的配置和部署,使其能够在 9081 端口上支持未加密的 HTTP/2。

由于 Docker 不支持在容器运行时更新端口映射,你需要首先移除在安装过程中启动的 api7-ee-gateway-1 网关容器。

接下来,在 Docker 中启动一个新的网关实例。在运行生成的部署命令之前,添加 -p 9081:9081 标志。修改后的命令应该类似于:

docker run -d -e API7_CONTROL_PLANE_ENDPOINTS='["https://<YOUR_IP_ADDR>:7943"]' \
-e API7_GATEWAY_GROUP_SHORT_ID=default \
-e API7_CONTROL_PLANE_CERT="-----BEGIN CERTIFICATE-----
<CERT_CONTENT>
-----END CERTIFICATE-----
" \
-e API7_CONTROL_PLANE_KEY="-----BEGIN PRIVATE KEY-----
<PRIVATE_KEY_VALUE>
-----END PRIVATE KEY-----
" \
-e API7_CONTROL_PLANE_CA="-----BEGIN CERTIFICATE-----
<CERT_CONTENT>
-----END CERTIFICATE-----
" \
-e API7_CONTROL_PLANE_SNI="api7ee3-dp-manager" \
-p 9080:9080 \
-p 9081:9081 \
-p 9443:9443 \
api7/api7-ee-3-gateway:<VERSION>

运行命令以启动网关。

网关运行后,更新网关配置,使其允许在 9081 端口上使用 HTTP/2:

docker exec <api7-ee-gateway-container-name> /bin/sh -c "echo '
nginx_config:
error_log_level: warn

apisix:
node_listen:
- port: 9080
enable_http2: true
- port: 9081
enable_http2: true
' > /usr/local/apisix/conf/config.yaml"

重新加载容器以使配置更改生效:

docker exec <api7-ee-gateway-container-name> apisix reload

验证配置

这里下载 helloworld.proto 文件。

本示例使用 helloworld.proto 文件来确保 gRPCurl CLI 工具的请求和响应格式与 gRPC 服务定义一致。

如果你已经在 Docker 中安装了网关实例并使用控制台或 ADC 进行配置,请向路由发送请求:

grpcurl -plaintext \
-proto helloworld.proto \
-d '{"name":"API7"}' \
"127.0.0.1:9081" \
"helloworld.Greeter.SayHello"

你应该能看到以下输出:

{
"message": "Hello API7"
}

其他资源