Hystrix官方已停止维护,官方推荐使用Resilience4j来替代Hystrix实现服务治理,今天我们看看如何使用Resilience4j。
介绍
1,一款受Hystrix启发的轻量量级且易于使用的容错库
2,针对Java 8与函数式编程设计
3, github地址:https://github.com/resilience4j/resilience4j
4核心组件:
如何基于Resilience4j实现断路器
断路器
1, Resilience4j的断路器组件实现了断路器功能,他是基于内存的断路器,采用
ConcurrentHashMap来实现的。
2,断路器的功能主要是处理熔断,当客户端调用服务端出现问题时进行拦截,直接返回,不再发送请求给服务端,减少下游服务的冲击。
实验环境
1,基于尤里卡的服务注册和发现
2,提供服务的服务员的服务
3,客户端调用客服
关键代码
1,启动服务员的服务和客服服务,分别注册到尤里卡,这里不再介绍,可以参考之前的博客。
2,服务员的服务作为服务提供方,不涉及到配置代码
3,关键代码在客户端客服
3.1,断路器的配置:application.properties
规则取名为顺序
<代码> resilience4j.circuitbreaker.backends.order.failure-rate-threshold=50 resilience4j.circuitbreaker.backends.order.wait-duration-in-open-state=5000 resilience4j.circuitbreaker.backends.order.ring-buffer-size-in-closed-state=5 resilience4j.circuitbreaker.backends.order.ring-buffer-size-in-half-open-state=3 resilience4j.circuitbreaker.backends.order.event-consumer-buffer-size=10 代码>
3.2,使用注解的方式实现断路器
<代码> @GetMapping (“/getCoffee1”) @io.github.resilience4j.circuitbreaker.annotation。断路器(name="秩序") 公众咖啡getCoffee1 () { 咖啡=coffeeService.getById列表(1升); log.info(“读咖啡:{}咖啡”,列表); 返回列表; }代码>
3.3,使用注册方式,实现断路器,短路之后默认返回空的列表
<代码>私人断路器断路器; 公共CustomerController (CircuitBreakerRegistry registry) { 断路器=registry.circuitBreaker(“订单”); } @GetMapping ("/getCoffee2”) 公共ListgetCoffee2 () { 返回Try.ofSupplier ( CircuitBreaker.decorateSupplier(断路器, ()→coffeeService.getAll ())) .recover (CircuitBreakerOpenException。类,Collections.emptyList ()) . get (); }代码>
3.4,关闭服务员的服务,模拟服务宕机,展示效果
连续请求3次,服务调用失败
失败超过50%,第4次触发短路器打开:
等待5秒钟,断路器尝试重连: