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
测试要点:固定延迟用于验证超时硬边界;可变延迟用于验证重试退避算法和熔断器状态机转换。
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 混合故障的自动化验证要点
- 时序验证:确认延迟先于中断执行,客户端感知到完整等待时间后再收到错误。
- 重试行为:混合故障下重试可能触发多次延迟+中断,需验证重试次数和退避间隔。
- 回滚触发:混合故障应能触发熔断器或降级策略,自动化测试需断言回滚路径被正确调用。
- 百分比叠加:延迟和中断的百分比独立生效,需验证组合命中率是否符合预期。
4.4 故障场景选择矩阵
根据测试目标选择合适的故障类型组合,以下矩阵帮助快速决策:
| 测试目标 | 推荐故障类型 | 验证重点 |
|---|---|---|
| 超时重试逻辑 | 固定延迟 + HTTP 504 | 重试次数、退避间隔、最终回滚 |
| 熔断器状态转换 | 可变延迟 + HTTP 503 | 熔断阈值、半开探测、恢复时间 |
| gRPC 错误处理 | 固定延迟 + gRPC 14 | 状态码映射、错误传播、降级路径 |
| 限流降级 | HTTP 429 | 限流阈值、降级响应、回滚触发 |
| 复合异常 | 延迟 + 中断混合 | 时序、组合命中率、回滚护栏联动 |
关键原则:所有故障注入场景必须设计对应的自动化回滚护栏测试用例。延迟故障验证超时回滚,中断故障验证错误回滚,混合故障验证复合回滚路径。每个场景的百分比、延迟时长、状态码都应作为参数化输入,确保回滚护栏在不同故障强度下均能正确触发。