4. 故障注入场景设计:延迟、中断与混合故障

Envoy 故障注入的核心在于通过 fault Filter 在请求路径中插入可控异常。本章将三类基础故障场景拆解为可测试、可回滚的原子单元,并给出对应的自动化验证断言。

4.1 延迟故障场景

延迟故障模拟上游服务响应缓慢或网络拥塞,用于验证超时重试、熔断和回滚逻辑。Envoy 支持两种延迟模式:固定延迟 和 可变延迟。

4.1.1 固定延迟

所有匹配请求都增加一个恒定值的延迟。适用于测试超时阈值边界和重试次数耗尽场景。

参数 类型 说明 典型值
fixed_delay Duration 注入的固定延迟时长 5s
percentage Percentage 触发延迟的请求比例 100
# 固定延迟 5s,命中所有请求
fault:
  delay:
    fixed_delay: 5s
    percentage:
      numerator: 100
      denominator: HUNDRED

4.1.2 可变延迟

延迟时长在指定范围内随机分布,更贴近真实网络抖动。用于测试自适应重试和负载均衡器的鲁棒性。

参数 类型 说明 典型值
header_delay Header 通过请求头动态指定延迟范围 x-envoy-fault-delay-request
percentage Percentage 触发延迟的请求比例 50
# 可变延迟:通过请求头控制延迟时长
fault:
  delay:
    header_delay:
      header_name: x-envoy-fault-delay-request
      default_value: 3s
    percentage:
      numerator: 50
      denominator: HUNDRED
测试要点:固定延迟用于验证超时硬边界;可变延迟用于验证重试退避算法和熔断器状态机转换。
延迟故障场景对比 固定延迟 所有匹配请求 +5s 恒定延迟时长 测试超时硬边界 重试次数耗尽验证 配置: fixed_delay: 5s 可变延迟 请求头动态控制延迟 随机范围抖动 测试退避算法 熔断器状态机转换 配置: header_delay 两种延迟模式均需配合超时重试护栏进行自动化回滚验证

4.2 中断故障场景

中断故障直接拒绝请求,返回指定错误码。Envoy 支持 HTTP 状态码和 gRPC 状态码两种中断方式,用于验证客户端错误处理、降级和回滚路径。

4.2.1 HTTP 状态码中断

返回标准 HTTP 错误码,常见于 RESTful 服务测试。

状态码 含义 典型测试场景
500 Internal Server Error 服务端崩溃、数据库故障
503 Service Unavailable 熔断触发、流量过载
429 Too Many Requests 限流降级验证
504 Gateway Timeout 上游超时回退
# 中断故障:返回 HTTP 503
fault:
  abort:
    http_status: 503
    percentage:
      numerator: 100
      denominator: HUNDRED

4.2.2 gRPC 状态码中断

返回 gRPC 标准错误码,适用于微服务间 gRPC 通信的故障注入。

状态码 gRPC 码 典型测试场景
14 UNAVAILABLE 服务不可用、连接断开
4 DEADLINE_EXCEEDED 超时触发回滚
2 UNKNOWN 未预期错误处理
# 中断故障:返回 gRPC UNAVAILABLE
fault:
  abort:
    grpc_status: 14
    percentage:
      numerator: 100
      denominator: HUNDRED
注意:gRPC 中断故障需要客户端正确解析 gRPC 状态码,否则可能被误判为 HTTP 错误。自动化测试中应同时验证状态码和错误消息体。

4.3 混合故障场景

混合故障将延迟与中断组合注入,模拟真实分布式系统中的复合异常。Envoy 允许在同一个 fault 配置中同时定义 delay 和 abort,执行顺序为:先延迟,后中断。

4.3.1 延迟 + HTTP 中断

# 混合故障:延迟 3s 后返回 HTTP 503
fault:
  delay:
    fixed_delay: 3s
    percentage:
      numerator: 100
      denominator: HUNDRED
  abort:
    http_status: 503
    percentage:
      numerator: 100
      denominator: HUNDRED

4.3.2 延迟 + gRPC 中断

# 混合故障:延迟 2s 后返回 gRPC UNAVAILABLE
fault:
  delay:
    fixed_delay: 2s
    percentage:
      numerator: 50
      denominator: HUNDRED
  abort:
    grpc_status: 14
    percentage:
      numerator: 50
      denominator: HUNDRED

4.3.3 混合故障的自动化验证要点

  • 时序验证:确认延迟先于中断执行,客户端感知到完整等待时间后再收到错误。
  • 重试行为:混合故障下重试可能触发多次延迟+中断,需验证重试次数和退避间隔。
  • 回滚触发:混合故障应能触发熔断器或降级策略,自动化测试需断言回滚路径被正确调用。
  • 百分比叠加:延迟和中断的百分比独立生效,需验证组合命中率是否符合预期。
混合故障执行流程 请求进入 Envoy 延迟注入 (固定/可变) 中断注入 (HTTP/gRPC) 错误响应返回客户端 自动化验证要点 1. 延迟时长精确性 2. 中断状态码正确性 3. 执行顺序:先延迟后中断 4. 回滚护栏触发状态

4.4 故障场景选择矩阵

根据测试目标选择合适的故障类型组合,以下矩阵帮助快速决策:

测试目标 推荐故障类型 验证重点
超时重试逻辑 固定延迟 + HTTP 504 重试次数、退避间隔、最终回滚
熔断器状态转换 可变延迟 + HTTP 503 熔断阈值、半开探测、恢复时间
gRPC 错误处理 固定延迟 + gRPC 14 状态码映射、错误传播、降级路径
限流降级 HTTP 429 限流阈值、降级响应、回滚触发
复合异常 延迟 + 中断混合 时序、组合命中率、回滚护栏联动
关键原则:所有故障注入场景必须设计对应的自动化回滚护栏测试用例。延迟故障验证超时回滚,中断故障验证错误回滚,混合故障验证复合回滚路径。每个场景的百分比、延迟时长、状态码都应作为参数化输入,确保回滚护栏在不同故障强度下均能正确触发。