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。
如果服务在恢复期间发生故障,熔断器将再次断开。
如果服务在整个恢复期间都正常运行,熔断器将闭合。