Citrix ADC

gRPC 桥接

当客户端通过 HTTP/1.1 协议发送请求时,Citrix ADC 设备支持通过 HTTP/1.1 协议桥接 gRPC 请求,这符合通过 HTTP/2 协议的 gRPC 服务器。同样,在反向桥接中,设备通过 HTTP/2 协议接收客户端 gRPC 请求,并根据 HTTP/1.1 协议的 gRPC 服务器为 gRPC 请求执行反向桥接。

grPC 桥接的工作原理

在这种情况下,Citrix ADC 设备可以无缝桥接在 HTTP/1.1 连接上接收的 gRPC 内容,然后通过 HTTP/2 将其转发到后端 gRPC 服务器。

grPC 端到端配置功能图

下图显示了 GrPC 桥接配置中组件如何相互交互。

  1. 发送 gRPC 请求时,Citrix ADC 设备将检查连接是否为 HTTP/1.1 且内容类型是应用程序 /grpc。HTTP/1.1 请求将转换为以下伪标头。
  2. 如 Content-Type 标头所示,在 HTTP/1.1. 连接上收到 gRPC 请求后,ADC 设备会通过 HTTP/2 将请求转换为 grPC,如下所示:
    :method: Method-name in HTTP/1.1 request
    :path: Path is HTTP/1.1 request
    content-type: application/grpc
  1. 根据策略评估,负载平衡虚拟服务器(将 gRPC 服务绑定到它)终止请求或通过 HTTP/2 帧将其转发到后端 gRPC 服务器。
  2. 在从 GrPC 服务器接收 HTTP/2 连接上的响应后,设备会缓冲,直到收到 HTTP/2 拖车,然后检查 GRPC 状态代码。如果 GrPC 错误状态为非零,设备将查找映射 HTTP 状态代码并发送合适的 HTTP/1.1 错误响应。

使用 CLI 配置 grPC 桥接

要配置 grPC 桥接,必须完成以下步骤:

  1. 在 HTTP/2 和 HTTP/2 直接启用的情况下添加 HTTP 配置文件
  2. 在 HTTP 参数中启用全局后端 HTTP/2 支持
  3. 添加 SSL/HTTP 类型的负载平衡虚拟服务器并设置 HTTP 配置文件
  4. 为 gRPC 端点添加服务并设置 HTTP 配置文件
  5. 将 gRPC 端点服务绑定到负载平衡虚拟服务器
  6. 将 gRPC 状态码映射到 HTTP 响应以获得非零 gRPC 状态
  7. 按时间和/或大小配置 grPC 缓冲

在启用 HTTP/2 和 HTTP/2 直接启用的情况下添加 HTTP 配置文件

要开始配置,必须在 HTTP 配置文件中启用 HTTP/2 功能。如果客户端发送 HTTP 1.1 请求,设备会桥接请求并将其转发到后端服务器。

在命令提示窗口中,键入:

add ns httpProfile <name> - http2 ( ENABLED | DISABLED ) [-http2Direct ( ENABLED | DISABLED )]

示例:

add ns httpProfile http2gRPC -http2Direct ENABLED -http2 ENABLED

在 HTTP 参数中启用全局后端 HTTP/2 支持

使用 Citrix ADC 命令行在服务器端全局启用 HTTP/2 支持。

在命令提示窗口中,键入:

set ns httpParam -http2ServerSide( ON | OFF )

示例:

set ns httpParam -http2ServerSide ON

添加 SSL/HTTP 类型的负载平衡虚拟服务器并设置 HTTP 配置文件

使用 Citrix ADC 命令界面添加负载平衡虚拟服务器

在命令提示窗口中,键入:

add lb vserver <name> <service type> [(<IP address>@ <port>)] [-httpProfileName <string>]

示例:

add lb vserver lb-grpc HTTP 10.10.10.10 80 -httpProfileName http2gRPC

注意:

如果您使用的是 SSL 类型的负载平衡虚拟服务器,则必须绑定服务器证书。请参阅 绑定服务器证书 主题了解更多信息。

为 gRPC 端点添加服务并设置 HTTP 配置文件

使用 Citrix ADC 命令界面添加带 HTTP 配置文件的 gRPC 服务。

在命令提示窗口中,键入:

add service <name> (<IP> | <serverName> ) <serviceType> <port> [-httpProfileName <string>]

示例:

add service svc-grpc 10.10.10.10 HTTP 80 -httpProfileName http2gRPC

将 gRPC 端点服务绑定到负载平衡虚拟服务器

使用 CLI 将 gRPC 端点服务绑定到负载平衡虚拟服务器。

在命令界面,键入:

bind lb vserver <name> <serviceName>

示例:

bind lb vserver lb-grpc svc-grpc

将 gRPC 状态码映射到 HTTP/1.1 响应中的 HTTP 状态码

在 gRPC 桥接场景中,gRPC 服务使用 gRPC 状态码来响应请求。设备将 grPC 状态代码映射到相应的 HTTP 响应代码和原因短语。映射是根据下面提供的表格完成的。Citrix ADC 设备在向客户端发送 HTTP/1.1 响应时会发送 HTTP 状态代码和原因短语。

gRPC status-code HTTP 响应状态码 HTTP 响应原因短语
OK = 0 200 确定
CANCELLED = 1 499 *
UNKNOWN = 2 500 内部服务器错误
INVALID_ARGUMENT = 3 400 错误的请求
DEADLINE_EXCEEDED = 4 504 Gateway Timeout
NOT_FOUND = 5 404 *
ALREADY_EXISTS = 6 409 冲突
PERMISSION_DENIED = 7 403 禁止
UNAUTHENTICATED = 16 401 未授权
RESOURCE_EXHAUSTED = 8 429 *
FAILED_PRECONDITION = 9 400 错误的请求
ABORTED = 10 409 冲突
OUT_OF_RANGE = 11 400 错误的请求
UNIMPLEMENTED = 12 501 Not Implemented
INTERNAL = 13 500 内部服务器错误
UNAVAILABLE = 14 503 服务不可用
DATA_LOSS = 15 500 内部服务器错误

按时间和/或大小配置 grPC 缓冲

Citrix ADC 设备会缓冲来自后端服务器的 gRPC 响应,直到收到响应拖车。这打破了双向 gRPC 调用。此外,如果 gRPC 响应很大,它会消耗大量内存来完全缓冲响应。为了解决此问题,gRPC 桥接配置已增强,以根据时间和/或大小限制缓冲。如果缓冲区大小或时间限制超过阈值,则设备将停止缓冲并将响应转发给客户端,即使触发任何一个限制(在配置的缓冲区大小内未收到拖车或发生配置的超时)。因此,配置的策略及其表达式(基于 grpc-status 代码)无法按预期工作。

要通过 CLI 按时间和/或大小限制 gRPC 缓冲,您可以配置何时添加新的 HTTP 配置文件或在修改现有配置文件时进行配置。

在命令提示窗口中,键入:

add ns httpProfile http2gRPC [-grpcHoldLimit <positive_integer>] [-grpcHoldTimeout <positive_integer>]

set ns httpProfile http2gRPC [-grpcHoldLimit <positive_integer>] [-grpcHoldTimeout <positive_integer>]

其中,

grpcholdlimit。在收到拖车之前,允许缓冲 gRPC 数据包的最大大小(字节)。您可以同时配置参数和任何参数。

默认值:131072 最小值:0 最大值:33554432

grpcholdtimeout。在收到拖车之前允许缓冲 gRPC 数据包的最长时间(以毫秒为单位)。该值应为 100 的倍数。 默认值:1000 最小值:0 最大值:180000

示例:

add httpprofile http2gRPC -grpcholdlimit 1048576 -grpcholdtimeout 5000 set httpprofile http2gRPC -grpcholdlimit 1048576 -grpcholdtimeout 5000

使用 GUI 配置 grPC 桥接

完成以下步骤以使用 Citrix ADC GUI 配置 gRPC 桥接。

在 HTTP/2 和 HTTP/2 直接启用的情况下添加 HTTP 配置文件

  1. 导航到系统 > 配置文件,然后单击 HTTP 配置文件
  2. 在 HTTP 配置文件中选择 HTTP/2

gRPC bridging add HTTP profile with http2 parameter

在 HTTP 参数中启用全局后端 HTTP/2 支持

  1. 导航到系统”>“设置”>“HTTP 参数
  2. 配置 HTTP 参数页中,选择服务器端上的 HTTP/2选项。
  3. 单击确定

gRPC bridging global back-end HTTP/2

添加 SSL/HTTP 类型的负载平衡虚拟服务器并设置 HTTP 配置文件

  1. 导航到 流量管理 > 负载平衡 > 虚拟服务器
  2. 单击添加为 GRPC 通信创建负载平衡虚拟服务器。
  3. 负载平衡虚拟服务器页中,单击 概要文件
  4. 配置文件部分中,选择配置文件类型为 HTTP。
  5. 单击确定,然后单击完成

gRPC bridging global back-end HTTP/2 enable load balancing

为 grPC 端点添加服务并设置 HTTP 配置文件

  1. 导航到流量管理”>“负载平衡”>“服务”
  2. 单击添加为 GRPC 通信创建应用程序服务器。
  3. 负载平衡服务页面中,转到概要文件部分。
  4. 配置文件下,为 GRPC 端点添加 HTTP 配置文件
  5. 单击确定,然后单击完成

grPC 桥接添加 grpc 端点的服务

将 gRPC 端点的服务绑定到负载平衡虚拟服务器

  1. 导航到 流量管理 > 负载平衡 > 虚拟服务器
  2. 单击添加为 GRPC 通信创建负载平衡虚拟服务器。
  3. 负载平衡虚拟服务器 页面中,单击 服务和服务组 部分。
  4. 负载平衡虚拟服务器服务绑 定”页中,选择要绑定的 GRPC 服务。
  5. 单击关闭,然后单击完成

gRPC bridging bind service for gRPC endpoint

使用 GUI 按时间和大小配置 grPC 缓冲

  1. 导航到系统 > 配置文件,然后单击 HTTP 配置文件
  2. 在 HTTP 配置文件中选择 HTTP/2
  3. 在 “ 配置 HTTP 配置文件 ” 页中,设置以下参数:

    1. grpcholdTimeout。输入在收到拖车之前缓冲 gRPC 数据包的时间(以毫秒为单位)。
    2. grpcholdLimit。输入最大大小(以字节为单位)以缓冲 gRPC 数据包,直到收到拖车。
  4. 单击确定关闭

gRPC 按时间和大小进行桥接缓冲

有关绑定服务和负载平衡虚拟服务器的 GUI 详细程序,请参阅 负载平衡 主题。

gRPC 桥接