跳到正文
Træfɪk

Circuit Breaker

HTTP 熔断器避免向不健康的服务持续堆积请求,从而防止级联故障。

系统健康时,断路器处于闭合状态(正常运行)。 系统不健康时,断路器断开,请求不再转发,而是由回退机制处理。

为了判断系统是否健康,熔断器会持续监控服务。

熔断器只分析中间件链中位于自身位置之后发生的情况。自身位置之前发生的情况不会影响其状态。

每个路由器都会获得指定熔断器的独立实例。 一个熔断器实例可以处于断开状态,而另一个仍然闭合;实例之间不共享状态。

这是预期行为:你可以定义什么情况下服务算健康,而无需为每条路由单独声明熔断器。

配置示例

# Latency Check
http:
  middlewares:
    latency-check:
      circuitBreaker:
        expression: "LatencyAtQuantileMS(50.0) > 100"
# Latency Check
[http.middlewares]
  [http.middlewares.latency-check.circuitBreaker]
    expression = "LatencyAtQuantileMS(50.0) > 100"
# Latency Check
labels:
  - "traefik.http.middlewares.latency-check.circuitbreaker.expression=LatencyAtQuantileMS(50.0) > 100"
{
  //..
  "Tags" : [
    "traefik.http.middlewares.latency-check.circuitbreaker.expression=LatencyAtQuantileMS(50.0) > 100"
  ]
}
# Latency Check
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: latency-check
spec:
  circuitBreaker:
    expression: LatencyAtQuantileMS(50.0) > 100

配置选项

字段 说明 默认值 必填
expression 打开熔断器的条件。满足条件后,使用回退机制代替调用服务。
更多信息见此处。
"" 否
checkPeriod 熔断器处于待命状态时,连续两次检查熔断条件的时间间隔。 100ms 否
fallbackDuration 熔断器跳闸后,在尝试恢复之前等待的时长。 10s 否
recoveryDuration 熔断器进入恢复状态后,尝试恢复的持续时长。 10s 否
responseCode 熔断器断开时返回的状态码。 503 否

expression 表达式

expression 选项可以检查三种不同的指标:

指标 说明 示例
NetworkErrorRatio 触发熔断的网络错误比例。 NetworkErrorRatio() > 0.30 在网络错误比例达到 30% 时打开熔断器。
ResponseCodeRatio 触发熔断的状态码比例。
更多信息见下文。
ResponseCodeRatio(500, 600, 0, 600) > 0.25 在返回 0 至 5XX 状态码的请求中,有 25% 返回 5XX 状态码时打开熔断器。
LatencyAtQuantileMS 指定分位数处的延迟,单位为毫秒;当一定比例的请求变得过慢时触发熔断。
分位数只接受浮点数(末尾带 .0)。
LatencyAtQuantileMS(50.0) > 100 在延迟中位数(第 50 分位数)达到 100ms 时打开熔断器。

ResponseCodeRatio 状态码比例

  • 接受四个参数:from、to、dividedByFrom、dividedByTo。
  • 执行的计算为 sum(to -> from) / sum (dividedByFrom -> dividedByTo)。如果 sum (dividedByFrom -> dividedByTo) 等于 0,ResponseCodeRatio 返回 0。
  • 包含 from,不包含 to。

使用多个指标

可以在 expression 中使用运算符组合多个指标。

支持的运算符为:

  • 与(&&)
  • 或(||)

例如,ResponseCodeRatio(500, 600, 0, 600) > 0.30 || NetworkErrorRatio() > 0.10 会在 30% 的请求返回 5XX 状态码,或网络错误比例达到 10% 时触发熔断器。

运算符

支持以下运算符:

  • 大于(>)
  • 大于等于(>=)
  • 小于(<)
  • 小于等于(<=)
  • 等于(==)
  • 不等于(!=)

回退机制

默认情况下,回退机制向客户端返回 HTTP 503 Service Unavailable,而不调用目标服务。
可以配置响应状态码。

状态

熔断器有三种可能的状态:

  • Closed(闭合,服务正常运行)。
  • Open(断开,回退机制接管服务)。
  • Recovering(恢复中,熔断器逐步向服务发送请求,尝试恢复正常运行)。

Closed(闭合)

断路器闭合时,熔断器仅收集指标,用于分析请求行为。

每隔指定时间(checkPeriod),熔断器会计算 expression,决定是否需要改变状态。

Open(断开)

断路器断开时,回退机制接管正常的服务调用,持续时间为 FallbackDuration。 回退机制向客户端返回 HTTP 503(或 ResponseCode)。 经过这段时间后,进入恢复状态。

Recovering(恢复中)

恢复期间,熔断器以线性递增的数量向服务发送请求,持续时间为 RecoveryDuration。 如果服务在恢复期间发生故障,熔断器将再次断开。 如果服务在整个恢复期间都正常运行,熔断器将闭合。


版权所有 © 头文件软件工作室

文档由 HeadFile Studio 翻译。

Traefik v3.7 中文快照 · 原文版权归 Traefik Labs 及贡献者所有 · MIT 许可证