在微服务和分布式里,容错是要考虑的,通常会有两种处理方式,
- 一种是重试机制,对于可预期短暂的问题,可以采取重度机制,第一次不成功,再试一次可能就成功了
- 对于更长时间的故障问题,重试再多次也无法解决的,就可以使用断路器模式了
断路器模式是将受保护的服务封装到可以监控故障的断路器对象里面,当故障达到一定的值,断路器将会跳闸。
断路器的状态机
可以理解熔断为我们生活中的保险丝,是对电路的保护,当服务中某个单元发生故障,通过断路器监控,直接切掉主逻辑的调用。熔断是对服务的保护。
下面的例子, 当传number是偶数,成功, 当 number是奇数时,失败。 当失败到一定设置频率,这个方法就算传的是偶数也会失败。
下面三个参数是控制断路的关键参数。
circuitBreaker.sleepWindowInMilliseconds:10s 该属性用来设置当断路器打开之后的休眠时间窗。这里给的10s,默认值 5000 毫秒,休眠时间窗结束之后,会将断路器设置为"半开"状态(上面图中的half open),尝试熔断的请求命令,如果依然失败就将断路器继续设置为"打开"状态,如果成功就设置为"关闭"状态。
circuitBreaker.errorThresholdPercentage :60 ,设置打开回路并启动回退逻辑的错误比率。 默认是50%,这里设置的60%,也就是10次访问有6次异常,就打开断路器。
circuitBreaker.requestVolumeThreshold:10 设置在一个滚动窗口中,打开断路器的最少请求数。例如:默认值 20 的情况下,如果滚动时间窗(默认值 10秒)内仅收到19个请求,即使这19个请求都失败了,断路器也不会打开。
在一定时间内,用户请求超过一定的比例失败时(timeout, failure, reject),断路器就会打开;短路器打开后所有请求直接走fallback
参数设置
|
名称 |
类型 |
含义 |
默认值 |
|---|---|---|---|
| circuitBreakerEnabled | Boolean | 是否启用断路器 | true |
| circuitBreakerErrorThresholdPercentage | Integer | 错误百分比,超过该值打开断路器 | 50 |
| circuitBreakerForceClosed | Boolean | 强制断路器打开 | false |
| circuitBreakerForceOpen | Boolean | 强制短路器关闭 | false |
| circuitBreakerRequestVolumeThreshold | Integer | 10s中内最少的请求量,大于该值,断路器配置才会生效 | 20 |
| circuitBreakerSleepWindowInMilliseconds | Integer | 短路器打开后多长时间尝试关闭(Half open) | 5s |