ADC

gRPC 桥接

当客户机通过 HTTP/1.1 协议发送请求时,Citrix ADC 设备支持通过 HTTP/1.1 协议桥接 gRPC 请求,该协议符合 gRPC 服务器通过 HTTP/2 协议进行桥接。同样,在反向桥接中,设备通过 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 且内容类型是否为 application/grpc。HTTP/1.1 请求转换为以下伪标头。
  2. 在 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
<!--NeedCopy-->
  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 状态代码映射到非零 gRPC 状态的 HTTP 响应
  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 AD C 命令界面添加带有 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

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

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

gRPC 状态码 HTTP 响应状态码 HTTP 响应原因短语
OK = 0 200 正常
CANCELLED = 1 499 *
未知 = 2 500 内部服务器错误
INVALID_ARGUMENT = 3 400 请求错误
DEADLINE_EXCEEDED = 4 504 网关超时
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 未实施
内部 = 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

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

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

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

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

grPC 桥接全局后端 HTTP/2 启用负载均衡

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

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

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

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

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

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

    1. grpcHoldTimeout。输入在收到预告片之前缓冲 gRPC 数据包的时间(以毫秒为单位)。
    2. grpcHoldLimit。 输入在收到预告片之前缓冲 gRPC 数据包的最大大小(以字节为单位)。
  4. 单击“确定”关闭

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

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

gRPC 桥接