第一步:添加依赖
https://blog.csdn.net/goldenfish1919/article/details/108192745从
从版本3.0.1 release开时,Hystrix 从spring Cloud Netflix 移除。
1: circuitbreaker 断路器; 熔断机制; 断路开关;
circuit [?s??k?t] 环行; 环行路线; 电路; 线路; 巡回赛;
2: resilience4j [r??z?li?ns] 可以实现熔断机制之,可以使用reactive 反应式编程。也可以使用非反应式编程。
-
org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j
- non-reactive applications -
org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j
- reactive applications
3: 与spring gateway 集成
spring:
cloud:
gateway:
httpclient:
connect-timeout: 5000
response-timeout: 5s
ssl:
close-notify-flush-timeout-millis: 3000
close-notify-read-timeout-millis: 0
handshake-timeout-millis: 10000
useInsecureTrustManager: true
routes:
# mms
# dseCallback
- id: dseCallback_route
predicates:
- Path=/one/**
uri: https://httpbin.org/
filters:
- args:
name: myCircuitBreaker
fallbackUri: http://127.0.0.1/get
name: CircuitBreaker
- StripPrefix=1
可以看出,在延迟情况下,会使用fallbackUri中的路径。
curl http://127.0.0.1:8080/one/delay/1
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 507 100 507 0 0 97 0 0:00:05 0:00:05 --:--:-- 127{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "0",
"Forwarded": "proto=http;host=\"127.0.0.1:8080\";for=\"127.0.0.1:64562\"",
"Host": "httpbin.org",
"User-Agent": "curl/7.77.0",
"X-Amzn-Trace-Id": "Root=1-612337f6-21e016c8485d317635383176",
"X-Forwarded-Host": "127.0.0.1:8080",
"X-Forwarded-Prefix": "/one"
},
"origin": "127.0.0.1, 183.230.102.102",
"url": "https://127.0.0.1:8080/delay/1"
}
liujianping@DESKTOP-JR50M1H MINGW32 /d/lianxi
$ curl http://127.0.0.1:8080/one/delay/1000
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 238 100 238 0 0 38 0 0:00:06 0:00:06 --:--:-- 59{"args":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip","Host":"httpbin.org","User-Agent":"ReactorNetty/1.0.9","X-Amzn-Trace-Id":"Root=1-6123383d-6811ed7c2132cc3e01d62f7f"},"origin":"183.230.102.102","url":"https://httpbin.org/get"}
1: 自定义配置,超时设置,这里定义的是请求超时,一但超时,进入降级模式。默认为1
@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(2)).build()).build());
}
配置属性 | 默认值 | 描述 |
failureRateThreshold | 50 | 以百分率形式配置失败率阈值。失败率大于等于阈值时,CircuitBreaker转变为打开状态,并使调用短路。 |
slowCallRateThreshold | 100 | 以百分率形式配置慢调用率阈值。当调用执行的时长大于slowCallDurationThreshold时,CircuitBreaker会认为调用为慢调用。当慢调用占比大于等于此阈值时,CircuitBreaker转变为打开状态,并使调用短路。 |
slowCallDurationThreshold | 60000 [ms] | 配置调用执行的时长阈值。当超过这个阈值时,调用会被认为是慢调用,并增加慢调用率。 |
permittedNumberOfCallsInHalfOpenState | 10 | 当CircuitBreaker是半开状态时,配置被允许的调用次数。 |
slidingWindowType |
COUNT_BASED /TIME_BASED |
配置滑动窗口类型。当CircuitBreaker关闭时,这种类型的滑动窗口会记录调用结果。滑动窗口要么是基于计数的,要么是基于时间的。若滑动窗口为COUNT_BASED,则最近slidingWindowSize次的调用会被记录和统计。若滑动窗口为TIME_BASED,则最近slidingWindowSize秒中的调用会被记录和统计。 |
slidingWindowSize | 100 | 配置滑动窗口的大小。当CircuitBreaker关闭后用于记录调用结果。 |
minimumNumberOfCalls | 10 | 配置最小调用次数。在CircuitBreaker计算错误率前,要求(在每滑动窗口周期)用到这个值。例如,若minimumNumberOfCalls是10,为计算失败率,则最小要记录10个调用。若只记录了9个调用,即使9个都失败,CircuitBreaker也不会打开。 |
waitDurationInOpenState | 60000 [ms] | CircuitBreaker状态从打开转化为半开时,需要等待的时长。 |
automaticTransitionFromOpenToHalfOpenEnabled | false | 如果为true,则CircuitBreaker会自动从打开状态转化为半开状态。不需要另外的调用来触发这种转换。 |
recordExceptions | empty | 这个异常列表用来存放被当作失败的异常,这些异常发生时会增加失败率。任何异常,只要不是在ignoreExceptions中被明确忽略的,如果匹配或继承自异常列表中的异常,都会当作失败。若设置了异常列表,不在异常列表中的异常,只要不在ignoreExceptions中存在,都会当作成功。 |
ignoreExceptions | empty | 这个异常列表用来存放可忽略的异常,这些异常即不当作成功也不当作失败。任何异常,只要匹配或继承自此异常列表中的异常,都不会当作成功或失败,即使recordExceptions中存在这个异常。 |
recordException |
throwable -> true 所有异常默认都当作失败。 |
这是一个定制的Predicate,会评估是否把异常当作失败。除非异常在ignoreExceptions中存在,不然,只有Predicate必须返回true时,才把异常当作失败;只有Predicate必须返回false时,才把异常当作成功。 |
ignoreException |
throwable -> false 所有异常默认都不会被忽略。 |
这是一个定制的Predicate,会评估异常是否应该被忽略,而不是把它当作失败或成功。如果应忽略此异常,则Predicate必须返回true。如果把异常当作失败,则Predicate必须返回false。 |
英 |