前言
在文章《小谈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的标准方式
推荐阅读
- Spring、SpringBoot和SpringCloud的基础入门
- 冰箱旁边安装集成灶可以吗 冰箱可以放集成灶旁边吗?
- 原木奶油风厨房装修,为什么一定要用集成灶
- 单点登录CAS集成原理和应用验证
- 教你怎么从集成显卡切换到独立显卡 笔记本如何切换独立显卡
- 「Harmony OS」「JAVA UI」鸿蒙应用如何集成OKHttp网络三方库
- 集成灶哪个品牌好 集成灶排名
- SpringCloud gateway自定义请求的 httpClient
- 集成电路|女生读职高学什么专业更好找工作呢?
- 不要买集成灶 为什么不建议安装集成灶