spring boot 2 集成 resilience4j
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot 2 集成 resilience4j相关的知识,希望对你有一定的参考价值。
参考技术A resilience4j 是一款 java 平台轻量级容错库,支持熔断、限流、重试等功能。由于Netflix Hystrix 闭源,我们急需一款功能强大的容错工具库,来保护我们的环境。resilience4j 提供了spring boot 的starter,所以集成resilience4j很简单,但是也有一些坑。因此记录一下。github: https://github.com/resilience4j/resilience4j
官方文档: https://resilience4j.readme.io/docs/circuitbreaker
我使用的是resilience4j 最新版本 0.16.0,spring boot 2.1.6。
相关依赖
</dependencies>
配置resilience4j,在spring 中的application.yml 中增加如下配置:
resilience4j.circuitbreaker:
instances:
resilience4j.retry:
instances:
resilience4j.bulkhead:
instances:
resilience4j.thread-pool-bulkhead:
instances:
resilience4j.ratelimiter:
instances:
server:
port: 9090
resilience4j 的配置在0.16.0 发生了一下变化。网上一些文档都是基于0.13.0版本。还有0.16.0版本配置不能被IDEA 识别,也不能自动联想,所以使用0.16.0版本尽量参考官网的配置。
配置介绍
注解
@CircuitBreaker(name = "backendA")
code
@Retry(name = "backendA")
@CircuitBreaker(name = "backendA")
@RateLimiter(name = "backendA")
@Service
public class ServiceA
多次失败达到阈值之后,再调用会抛出异常
io.github.resilience4j.circuitbreaker.CallNotPermittedException: CircuitBreaker 'backendA' is OPEN and does not permit further calls
rest 调用返回结果:
这种情况可以配合spring aop,拦截异常,返回特性http 状态码或者信息,让前端捕获特定http 状态码,以此来呈现熔断之后的ui。
配置
注解
@RateLimiter(name = "backendA")
code
同上
达到限制时抛出异常
io.github.resilience4j.ratelimiter.RequestNotPermitted: RateLimiter 'backendA' does not permit further calls
经过试验,当@RateLimiter和@CircuitBreaker一起使用时,需要熔断器增加忽略RequestNotPermitted异常。否则会触发熔断。
ignoreExceptions:
其主要作用是限制并发次数
配置
注解
@Bulkhead(name = "backendA")
重试
配置
注解
@Retry(name = "backendA")
resilience4j 为我们提供了很棒的容错库,简单易用。
以上是关于spring boot 2 集成 resilience4j的主要内容,如果未能解决你的问题,请参考以下文章
Spring-boot 2.3.0.M4 JDK 11 集成 NoSuchBeanDefinitionException ...ConfigurationClassPostProcessor, ...
Spring Boot 2.6 + 集成 - internalPublisherAnnotationBeanPostProcessor 循环依赖