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的依赖
io.github.resilience4j resilience4j-spring-boot
配置resilience4j
在项目的applicaiton.yml里添加SpringCloud里resilience4j的相关配置
resilience4j.circuitbreaker: configs: default: registerHealthIndicator: true slidingWindowSize: 10 minimumNumberOfCalls: 5 permittedNumberOfCallsInHalfOpenState: 3 automaticTransitionFromOpenToHalfOpenEnabled: true waitDurationInOpenState: 5s failureRateThreshold: 50 eventConsumerBufferSize: 10 recordExceptions: - org.springframework.web.client.HttpServerErrorException - java.util.concurrent.TimeoutException - java.io.IOException ignoreExceptions: - com.kxblive.common.error.CustomException shared: slidingWindowSize: 100 permittedNumberOfCallsInHalfOpenState: 30 waitDurationInOpenState: 1s failureRateThreshold: 50 eventConsumerBufferSize: 10 ignoreExceptions: - com.kxblive.common.error.CustomException instances: backendA: baseConfig: default backendB: registerHealthIndicator: true slidingWindowSize: 10 minimumNumberOfCalls: 10 permittedNumberOfCallsInHalfOpenState: 3 waitDurationInOpenState: 5s failureRateThreshold: 50 eventConsumerBufferSize: 10 recordFailurePredicate: com.kxblive.common.error.FailureExceptionPredicate resilience4j.retry: configs: default: maxAttempts: 3 waitDuration: 100 retryExceptions: - org.springframework.web.client.HttpServerErrorException - java.util.concurrent.TimeoutException - java.io.IOException ignoreExceptions: - com.kxblive.common.error.CustomException instances: backendA: baseConfig: default backendB: baseConfig: default resilience4j.bulkhead: configs: default: maxConcurrentCalls: 100 instances: backendA: maxConcurrentCalls: 10 backendB: maxWaitDuration: 10ms maxConcurrentCalls: 20 resilience4j.thread-pool-bulkhead: configs: default: maxThreadPoolSize: 4 coreThreadPoolSize: 2 queueCapacity: 2 instances: backendA: baseConfig: default backendB: maxThreadPoolSize: 1 coreThreadPoolSize: 1 queueCapacity: 1 resilience4j.ratelimiter: configs: default: registerHealthIndicator: false limitForPeriod: 10 limitRefreshPeriod: 1s timeoutDuration: 0 eventConsumerBufferSize: 100 instances: backendA: baseConfig: default backendB: limitForPeriod: 6 limitRefreshPeriod: 500ms timeoutDuration: 3s resilience4j.timelimiter: configs: default: cancelRunningFuture: false timeoutDuration: 2s instances: backendA: baseConfig: default backendB: 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进行修改
@Bean public Contract feignContract(){ return new Contract.Default(); } /** @Bean public Contract feignContract(){ return new SpringMvcContract(); } **/
使用标准Feign注解
由于修改了feign的constract方式;所以默认的feign注解方式,不能使用SpringMVC的方式,必须使用Feign的标准方式
// after Hystrix is removed from SpringCloud2021.0.1, the fallback is ineffective //@FeignClient(name = "${codeman.service.name:codeman}", url = "${codeman.service.address:}", fallback = CodeManFallbackImpl.class) public interface CodeManFeign extends CodeManService { @RequestLine("GET /codeman/info/version") public String getVersion(); @RequestLine("GET /codeman/info/author") public String getAuthor(); @RequestLine("GET /codeman/info/author/{userid}") //对应请求方式和路径 public String requestLine(@Param("userid") String userid); }
通过上面的代码可以看到在Feign的定义接口里, 不再使用SpringMVC里的标准Post/Get/Delete/Request等; 而是使用Feign标准的注解RequestLine;这个估计大多数做过Feign的朋友,还不知道这个才是Feign的标准Annotation; 由于上一步,我们修改了Consract不再使用SpringMVCConstract;所以Post/Get/Delete/Request等这些在SpringMVC里的Annotation不能使用;必须替换;
业务调用
上一段代码,我们定义出了RPC的remote调用接口;在service层,我们使用已定义的Feign接口,完成业务上的调用;
@Component public class CodeManServiceImpl implements CodeManService{ //@Autowired //CodeManFeign codeManFeign; @Value("${codeman.service.address:http://${codeman.service.name:codeman}}") private String url; @Value("${codeman.service.name:codeman}") private String name; CircuitBreaker circuitBreaker; CodeManFeign codeManFeign; @PostConstruct public void init(){ circuitBreaker = CircuitBreaker.ofDefaults("backendA"); FeignDecorators decorators = FeignDecorators.builder() .withFallback(new CodeManFallbackImpl(), FeignException.class) .build(); codeManFeign = Resilience4jFeign.builder(decorators).target(new Target.HardCodedTarget<>(CodeManFeign.class, name, url)); } @Override public String getVersion() { return codeManFeign.getVersion(); } @Override public String getAuthor() { return codeManFeign.getAuthor(); } @Override public String requestLine(String userid) { return codeManFeign.requestLine(userid); } }
上面的业务调用的代码;和我们经常使用OpenFeign进行调用上有点差别;在与对CodeManFeign的IOC的获取上;可以看到代码里
注释掉了通过IOC的方式
//@Autowired
//CodeManFeign codeManFeign;
而是通过
@PostConstruct
public void init(){
}
的方式,在init里通过FeignDecorators.builder()去实例化了Resilience4jFeign.builder(decorators).target()的方式去实例化了这个; 这里也是不解的地方;为什么不去类似Hystrix的哦方式。在Feign接口定义的时候,也去做一些绑定,而是要手工在这里通过API进行绑定; 对这个不解:个人的感觉;可能还是在产品设计的时候,让这个设置更加的细化吧。
在我们自己的项目里,在这里是自己做了处理的,其实这个处理的目的就省略掉Init里的代码
定义Fallback的实现
public class CodeManFallbackImpl implements CodeManService { @Override public String getVersion() { return "N/A"; } @Override public String getAuthor() { return "SpringCloud"; } @Override public String requestLine(String userid){ return "Kill team‘s poison"; } }
通过以上的步骤,就可以实现Resilience4j的熔断器的实现了。 题外话,由于我们自己的项目都是使用的springcloud来实现微服务;并且都是在springcloud的基础上结合公司项目的特点,封装了自己的springcloud的开发框架,在springcloud的ioc是个好东西,但是在spring里的ioc到处都是,不仅增加了调试问题和追踪问题的复杂程度;而且更让人不放心的就是ioc都是使用反射或者动态代理的方式进行处理的, 这样的实现方式真的存在着很大的隐患;不过由于我们使用SpringCloud实现的微服务大多数都是来处理业务应用,反射的性能低下相对于业务应用往往性能的瓶颈而言,基本上都可以忽略不计了,这样的隐患也就藏起来了。 当然在学习了go语言以后,深深地体会到了,做服务和做业务对设计模式的取舍点的不同;
结束语
本文主要介绍的是在SpringCloud微服务开发中,如何使用Resilience4j实现熔断器功能的实现方式; 也可以直接通过resilience4j的API,在自己的Java程序里实现熔断器功能, 说实在的,SpringCloud的微服务体系真的和Service Mesh的体系一比较,真的就是一个小孩和大人的比较,熔断是业务需求吗,既然不是,为什么springCloude的开发中,微服务的代码却要揉入熔断器的开发代码; 别扭吧; 这就是Service Mesh为什么会是未来的原因。
美国西部自驾游03休息了几小时一睁眼已经到中午了,今天计划去的几个点看样也要缩水。抓紧折腾了午饭急忙出发。房东提供的厨房真是一应俱全,非常感谢!昨天没注意,这车才跑了15000英里,还是辆准新车,看
第二十一天,坐船离开海南了进海南四天半,围着整个海岛转了一圈,海景看的够多了,热带风景也领略过了,该走了。风景嘛,很美,但同样的景色看多了,感觉看不出来美了,有点审美疲劳的感觉,以至于后来两天再看到类似的风
来自南西伯利亚山区的涅涅茨人布里亚特西部,只能通过伊尔库茨克地区通金斯基和奥金斯基地区进入,被认为是KhongODor的遗产布里亚特4个主要部落中最小的(占总人口的6)和最年轻的部落。而且最孤立的一个Ekhi
罕见!阳西沙扒湾爆发级蓝眼泪震撼刷屏近几日,素有马尔代夫复制版的沙扒湾海滩,蓝眼泪闪现在人们的视野,引来一批又一批的游人来到海边打卡观赏。相信很多人最近都被这样的一种奇观刷屏,它比起冰瀑更加梦幻,比起海市蜃楼更加诗意
驰骋西域22天自驾环北疆中疆(9)霍尔果斯口岸自驾去霍尔果斯口岸要带上护照,通关的人要办边境通行证(不是边境证),一张展开有16K大小的纸,我们是带着护照去的,所以海关看了护照,问了下来做什么就直接放行了,霍
接触一场外太空的探索之旅,一个意外的发现有句话是这样说的我们既要仰望星空,也要脚踏实地。星空,带给人太多神秘的感觉,那是一个未知的世界,凡是未知的,必能引起人们的好奇,也能激发人类的探索欲,对外太空的探索,从未停止过脚步
北京五环边的桃花源,最佳观赏期已到来,漫山遍野美如画作者萧汉三月,是属于桃花的季节,北京很多地方可见灼灼芳华。微风拂过,花香迎面扑来,好一股自然清新的气息。桃花怒放,仿佛落下了层层胭脂云,粉红色的花一朵挨一朵,挤满整个枝丫,像一群顽
来云南必打卡的9款特色小吃,其中第五道,被誉为面食界的天花板云南最有特色的9种小吃,道道绝味,闻名中国,吃完想定居说起云南,不自觉会想起干净的山水,清幽的小巷,淳朴的民风,到处洋溢着一种静谧的美,置身在这片土地上,仿佛如仙境一般,不仅景色优
贵州4大委屈酒,曾跟茅台肩并肩,如今走出省外无人问津走遍大地神州,醉美多彩贵州。贵州,简称黔或贵,地处中国西南腹地,与四川重庆云南湖南和广西接壤,是中国西南的重要交通枢纽。不仅如此,贵州还是世界知名的旅游目的地和旅游大省,除了我们熟
泰山景区20日0时起暂停开放2022年3月19日,泰山景区管委会发布关于泰山景区暂停开放的通告。根据当前疫情防控的需要,为切实保障市民游客的安全与健康,自2022年3月20日0时起,泰山景区(含岱庙红门宫等全
千元搞定露营装备!快收藏这份傻瓜式入门指南(附亲子露营地推荐)文丨团妈成都的春日真是太绝了!上周团妈才带大家看了油菜花,这周各地的樱花就绚烂盛开,随着和煦春风,轻轻飘落在肩头,生活中多了一些诗意,又平添了几分惬意。趁着天气还没有热到不想出门,
由李少莉副局长引起的话题,咱也来念叨两句这几天,关于李副局长的议论甚嚣尘上,连国外媒体也有所报道。其实,李少莉副局长确实有点危险,这不是耸人听闻。说实话,截止目前,还没看到过哪个发言人短期内容貌变化有那么大的,整张脸蕴含
李少莉为何遭到全网批评?3万元耳钉不算事,我来说说真正的原因李少莉可能怎么也想不到,自己会因为妆容过于精致而被送上热搜,继而遭到全网批评。很多网友都说李少莉作为国家公职人员,妆容穿戴过于精致奢华,一对耳钉3万元,一条丝巾4千元,还有时尚的发
男人为什么喜欢刚刚好的女人?一个女人要想命好,内心变得强大,关键就在于三个字刚刚好。无论生活是平淡,还是激昂,都要用自己的态度,活出不一样的精彩。那么,如何做一个刚刚好的女人,让你男人更珍惜你更懂你?吕泉幸福
李少莉因戴3万耳钉被换下,新发言人张晓莺打扮朴素赢得好评新的发言人是张晓莺,她的压力一定很大,有很多人总是拿她和李少莉比,这个时候又盼望着能出现一位穿着打扮很优雅大气的发言人了。看她们两个人的打扮,就好像从一个极端到了另外一个极端。有的
不到2000元入手红米K40S,换新手机吗?红米K40S背面造型设计整体简约,配合特色的方形与圆形的对撞设计,后摄整个模组呈二段阶梯状,下半部分是补光灯和48MPOIS标志,有亮黑银迹幽芒幻镜四种配色,机身厚度约7。7mm,
能握手会拥抱,还帮你穿衣服,为啥人形机器人的触觉很重要?今年10月初马斯克发布的人形机器人赚足了一波眼球,不过大家的讨论集中在机器人长得像不像人,忽略了一个人类都拥有但是大部分机器人尚不具备的能力,那就是触觉。触觉是人类感受世界的接口之
双十一换机一加篇骁龙8年度旗舰仅2999起,还有多款千元水桶机很多人手机已经用得非常卡顿了,但是没有及时关注手机市场,不了解目前安卓平台已经更新到哪一阶段了。目前最新的骁龙旗舰处理器是骁龙8Gen1,年度机皇华为Mate50Pro三星Gala
我国生物化学领域第一位女性院士她接续方心芳先生人民的需求就是科研方向的衣钵,一生致力于工业微生物领域的科学研究与技术研发,是我国酶工业领域的先驱。她主导研发的黑曲酶菌种生产酶制剂,每年可为国家节约资金近两亿元粮
电竞引发LED显示屏行业新一轮竞争随着电竞行业的发展,从小型企业参与再上升到国家甚至世界型的比赛,到2018年成为电竞元年。伴随着电竞行业比赛的盛行,LED显示屏厂家又看到新的蓝海市场,近年来用于大型电竞比赛的LE
1毛钱撬动上亿元收入快递电子面单变广告位一张巴掌大小的快递面单,也能成为快递企业网点老板的增收来源。近日,北京商报记者注意到,趁着双11大促流量,快递企业在面单上为客户打起了二维码小广告,连一些快递网点也趁机接起了定制面
郑州需要富士康,富士康也需要郑州从来没有像现在这样,华尔街分析师屏住呼吸等待着富士康的最新消息。鸿海方面已经发出声明,称郑州园区正持续落实防疫措施,力求顺利排除状况,让当地厂区维持正常生产。近期,由于众所周知的事