断路器可保护系统免于将请求堆叠到不正常的服务(导致级联故障)的麻烦。
为了评估您的系统是否健康,断路器不断监控服务。
CircuitBreaker仅分析将其加入到中间件链之后发生的情况。之前发生的事情对其状态没有影响。
CircuitBreaker仅影响使用它的路由器。不使用CircuitBreaker的路由器将不受其状态的影响。
每个路由器最终将获得其自己的给定断路器的实例。
如果两个不同的路由器引用相同的断路器定义,则它们每个将获得一个实例。这意味着一个断路器可以断开,而另一个断路器保持闭合:它们的状态不共享。
这是预期的行为,我们希望您能够定义使服务正常运行的原因,而不必为每个路由声明断路器。
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: latency-check
spec:
circuitBreaker:
expression: LatencyAtQuantileMS(50.0) > 100
断路器有三种可能的状态:
闭合时,断路器仅收集指标以分析请求的行为。
在指定的时间间隔(checkPeriod
),它将评估expression
以确定其状态是否必须更改。
打开后,后备机制将在FallbackDuration
期间接管正常的服务调用。在此持续时间之后,它将进入恢复状态。
在恢复时,断路器将逐步将请求再次发送到服务(以线性方式恢复RecoveryDuration
)。
可以指定一个expression
,一旦匹配,该表达式将触发断路器(并应用后备机制而不再调用服务)。
expression
可以检查三种不同的指标:
NetworkErrorRatio
ResponseCodeRatio
LatencyAtQuantileMS
NetworkErrorRatio
如果希望断路器以30%的网络错误率触发,则表达式将为NetworkErrorRatio() > 0.30
。
ResponseCodeRatio
可以根据给定范围的状态码的比率来触发断路器。
ResponseCodeRatio
接受四个参数,from
,to
,dividedByFrom
,dividedByTo
。
将要计算的操作是sum(to
-> from
)/ sum(dividedByFrom
-> dividedByTo
)。
如果sum(
dividedByFrom
->dividedByTo
)等于0,则ResponseCodeRatio
返回0。from
是包括在内,to
是唯一的。
例如,如果25%的请求返回5XX状态(在请求中返回的状态码为0到5XX),则ResponseCodeRatio(500,600,0,600) > 0.25
表达式将触发断路器。
LatencyAtQuantileMS
当给定比例的请求变得太慢时,可以触发断路器。
例如,当中位数等待时间(分位点50)达到100毫秒(MS)时,表达式LatencyAtQuantileMS(50.0)> 100
将触发断路器。指定一个分位点,50表示中位数,即有一半的请求都处于这个状态。
必须提供分位数点的浮点数形式(后跟.0)。
可以在表达式中使用运算符组合多个指标。支持的操作包括:AND(&&),OR(||)。
例如,ResponseCodeRatio(500, 600, 0, 600) > 0.30 || NetworkErrorRatio() > 0.10
表示当30%的请求返回5XX状态码或者网络错误率达到10%时触发断路器。
支持的操作符列表:
>
)>=
)<
)<=
)=
)!=
)后备机制向客户端返回HTTP 503 Service Unavailable
(而不是调用目标服务),无法修改这个值。
用于评估expression
并确定断路器状态是否必须更改的时间间隔。默认情况下,CheckPeriod
为100ms,无法修改这个值。
默认情况下,FallbackDuration
是10秒,无法修改这个值。
恢复模式的持续时间(恢复状态)。
默认情况下,RecoveringDuration
是10秒,无法修改这个值。