如何测试 HTTP 代理上的 gRPC 流式传输

四路 gRPC 数据流穿过透明互联网网关并连接到分布式服务

一次成功的一元 RPC,不能证明代理能够稳定承载长连接 gRPC 流。gRPC 通常运行在 HTTP/2 上,生产链路还必须持续保持 TLS、ALPN、多路复用、流控、截止时间、取消与连接状态。短请求可能正常结束,而服务端流在暂停后、双向流发生背压时,或中间设备关闭空闲隧道时才暴露问题。

下面给出适用于 HTTP CONNECT 或 HTTPS 代理的可重复测试流程,覆盖一元、服务端流、客户端流与双向流,并明确禁止静默直连回退。只对已获授权的服务和代理基础设施执行测试。

先拆分传输层级

逐层记录:DNS 由谁解析、客户端到代理的 TCP、代理认证与 CONNECT 响应、隧道内到源站的 TLS、是否通过 ALPN 选择 h2、HTTP/2 连接和流、最终 gRPC 状态与 trailers。

不要把所有失败都归为“代理超时”。407 属于代理认证;TLS 告警发生在隧道建立后、gRPC 之前;UNAVAILABLE 可能是临时传输异常;DEADLINE_EXCEEDED 则可能表示链路可用但未在调用预算内完成。

若隧道成功但没有协商 HTTP/2,请使用代理 ALPN 协商审计

构造四类可控 RPC

使用确定性测试服务和不含个人信息的关联 ID:

  • 一元调用:一请求一响应,作为对照组;
  • 服务端流:一次请求后按固定节奏返回多条消息;
  • 客户端流:上传多条消息后返回汇总结果;
  • 双向流:客户端与服务端按各自节奏并行发送。

为每条消息记录序号、发送和接收时间、字节数及内容哈希。加入低于和高于预期空闲阈值的暂停;先测小消息,再测不超过服务文档上限的受控大消息。测试数据不得使用客户载荷,日志不得写入令牌、代理凭据或完整请求体。

建立无歧义基线

先让一元调用通过代理,确认目标证书、主机名、ALPN、HTTP/2 和 gRPC 状态。再逐一运行四类调用。通过标准是消息顺序、数量和哈希一致,trailers 完整,且没有直连。

同时加入负向对照:错误代理凭据必须在代理边界失败;不受信任的源站证书必须失败关闭;极短截止时间应返回预期结果;取消后应释放活动流;禁用直连时客户端不得绕过代理。

使用代理绕过审计证明成功结果确实来自指定链路。

安全测试空闲与保活

代理、负载均衡器或服务端可能关闭空闲长连接。先不修改保活参数,插入受控静默窗口,记录究竟由哪一层关闭。

如业务确需 HTTP/2 PING,应与服务端及所有中间设备协调间隔和无活动调用策略。不要设置激进的客户端 PING;过量 PING 可能被服务端以 GOAWAY 拒绝,也无法解决应用层停滞。

健康检查与保活不是一回事:健康 RPC 判断服务是否可用,传输 PING 判断 HTTP/2 连接是否响应,两者都不能证明业务消息持续推进,因此必须保留端到端序号与时延指标。

验证流控与背压

gRPC 流控用于避免快速发送方压垮慢速接收方。写入函数成功,不等于数据已经离开进程或抵达对端。

分级降低接收速度,观察队列深度、发送和接收时延、内存、流窗口和完成时间。正确结果是有界背压,而不是无限缓存或乱序。

再在同一 HTTP/2 连接上逐步增加并发流,记录协商上限、排队、RST_STREAM 和连接复用。可结合HTTP/2 代理连接复用审计区分健康多路复用与被迫重连。

记录关闭与恢复

在长流中一次只引入一种已授权故障:服务端有序下线、代理隧道关闭、网络中断、截止时间到期或客户端取消。分别捕获 GOAWAY、RST_STREAM、TLS 告警、TCP 关闭和最终 gRPC 状态。

不要自动重放所有中断调用。只有明确幂等的一元读取才适合有限重试;客户端流和双向流可能产生重复副作用,除非应用具有幂等键与可恢复协议。不得通过换线路或重试绕过限流、访问控制或服务端明确拒绝。

其他长连接协议可参考代理 WebSocket 长连接测试

验收清单

  • 四类 RPC 均使用目标代理,且没有直连回退;
  • TLS 身份与 ALPN 正确;
  • 两端消息顺序、数量和哈希一致;
  • trailers 与最终 gRPC 状态完整;
  • 已理解空闲行为,没有激进保活;
  • 流控使队列与内存保持在门槛内;
  • 并发流不超过协商容量;
  • 取消和截止时间能稳定释放资源;
  • GOAWAY、流重置与代理认证失败可以区分;
  • 仅对文档明确的安全操作重试;
  • 日志不含凭据、令牌和敏感载荷;
  • Global、North America、Europe 与 APAC 使用同一测试夹具和验收窗口。

常见问题

为什么一元调用正常,流式调用却失败?

一元调用可能在空闲计时、流控限制或连接下线事件出现前结束。长流才能暴露持续 HTTP/2 行为。

是否应该启用高频保活?

不应该。先测量真实空闲行为,再与服务端和中间设备协商保守参数;高频 PING 可能被拒绝。

UNAVAILABLE 一定是代理故障吗?

不一定。应结合 CONNECT、TLS、HTTP/2 帧和服务端日志定位。

失败的流可以自动重试吗?

仅在操作可证明安全时。状态变更流应采用幂等控制或应用层续传设计。

合规说明

仅测试自有或已获授权的基础设施、账号和服务。遵守服务条款、速率限制、数据保护和地区规则。不得使用代理隐藏被禁止的活动、规避控制或采集受限制数据。

内部参考依据:gRPC 文档《Keepalive》《Status Codes》《Flow Control》及《Default HTTP Proxy Mapper》,查阅日期 2026 年 9 月 17 日。