SpringCloud集成Resilience4j实现熔断器

前言 
在文章《小谈Springcloud中的几个主流熔断器》 , 我们介绍了SpingCloud架构中的几个主流熔断器 , 其中SpringCloud官方推荐的Resilience4j作为2020.x以后的新秀 , 远远没有hystrix有名 , 相关的文档也还不够多;今天这个文章就来讲讲SpringCloud如何使用Resilience4j实现熔断器;
 
Resilience4j 
resilience4j是一个轻量级、易于使用的容错库 , 其灵感来?.NETflixesilience4j是一个轻量级、易于使用的容错库 , 其灵感来自Netflix Hystrix , 但专为JAVA 8和函数式编程设计 。
 
Resilience4j提供高阶函数(decorators)来增强任何功能接口、lambda表达式或方法引用 , 包括断路器、速率限制器、重试或舱壁 。可以在任何函数接口、lambda表达式或方法引用上使用多个装饰器 。
 
Resilience4j非常轻量级 , 不仅可以在SpringCloud进行使用 , 还可以直接在自己的Java程序里通过Resilience4j的API实现Rate Limite的功能; 这点也是笔者非常认同的一点; 支持和扩展上更为方便; 今天的这个文章 , 重点还是介绍如何在SpringCloud里使用Resilicen4j
 
导入依赖包 
通过pom.xml引入对Resilience4j的依赖
 
<dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring-boot</artifactId></dependency>配置resilience4j
 
在项目的Applicaiton.yml里添加SpringCloud里resilience4j的相关配置
 
resilience4j.circuitbreaker:configs:default:registerHealthIndicator: trueslidingwindowsize: 10minimumNumberOfCalls: 5permittedNumberOfCallsInHalfOpenState: 3automaticTransitionFromOpenToHalfOpenEnabled: truewaitDurationInOpenState: 5sfailureRateThreshold: 50eventConsumerBufferSize: 10recordExceptions:- org.springframework.web.client.HttpServerErrorException- java.util.concurrent.TimeoutException- java.io.IOExceptionignoreExceptions:- com.kxblive.common.error.CustomExceptionshared:slidingWindowSize: 100permittedNumberOfCallsInHalfOpenState: 30waitDurationInOpenState: 1sfailureRateThreshold: 50eventConsumerBufferSize: 10ignoreExceptions:- com.kxblive.common.error.CustomExceptioninstances:backendA:baseConfig: defaultbackendB:registerHealthIndicator: trueslidingWindowSize: 10minimumNumberOfCalls: 10permittedNumberOfCallsInHalfOpenState: 3waitDurationInOpenState: 5sfailureRateThreshold: 50eventConsumerBufferSize: 10recordFailurePredicate: com.kxblive.common.error.FailureExceptionPredicateresilience4j.retry:configs:default:maxAttempts: 3waitDuration: 100retryExceptions:- org.springframework.web.client.HttpServerErrorException- java.util.concurrent.TimeoutException- java.io.IOExceptionignoreExceptions:- com.kxblive.common.error.CustomExceptioninstances:backendA:baseConfig: defaultbackendB:baseConfig: defaultresilience4j.bulkhead:configs:default:maxConcurrentCalls: 100instances:backendA:maxConcurrentCalls: 10backendB:maxWaitDuration: 10msmaxConcurrentCalls: 20resilience4j.thread-pool-bulkhead:configs:default:maxThreadPoolSize: 4coreThreadPoolSize: 2queueCapacity: 2instances:backendA:baseConfig: defaultbackendB:maxThreadPoolSize: 1coreThreadPoolSize: 1queueCapacity: 1resilience4j.ratelimiter:configs:default:registerHealthIndicator: falselimitForPeriod: 10limitRefreshPeriod: 1stimeoutDuration: 0eventConsumerBufferSize: 100instances:backendA:baseConfig: defaultbackendB:limitForPeriod: 6limitRefreshPeriod: 500mstimeoutDuration: 3sresilience4j.timelimiter:configs:default:cancelRunningFuture: falsetimeoutDuration: 2sinstances:backendA:baseConfig: defaultbackendB:baseConfig: default 
在这个配置中分别配置了circuitbeaker、retry、bulkhead、ratelimiter, timelimiter , thread-pool-bulkhead这些相关的熔断限流的相关项目 。引入resilience4j-spring-boot集成了circuitbeaker、retry、bulkhead、ratelimiter几个模块的功能 ,  提供相关的实现;我们可以根据业务的实际需要对这些相关项目进行具体配置修改;
 
开发上和使用Hystrix大致上一样; 不过注意调整一下自己的地方
 
feign契约只能用feign的 ,  不能用SpringMVC的契约 
feign契约只能用feign的 ,  不能用SpringMVC的契约;所以不能使用默认的方式 , 必须通过autoconfiguraiton进行修改
 
@Beanpublic Contract feignContract(){return new Contract.Default();}/**@Beanpublic Contract feignContract(){return new SpringMvcContract();}**/ 
使用标准Feign注解 
由于修改了feign的constract方式;所以默认的feign注解方式 , 不能使用SpringMVC的方式 , 必须使用Feign的标准方式
 


推荐阅读