Hystrix官方已中止维护,官方推荐使用Resilience4j来替代Hystrix实现服务治理,今天咱们看看如何使用Resilience4j。git
一、一款受 Hystrix 启发的轻量量级且易于使用的容错库
二、针对 Java 8 与函数式编程设计
三、github地址:https://github.com/resilience4j/resilience4j
四、核心组件:github
一、Resilience4j的circuitbreaker组件实现了断路器功能,他是基于内存的断路器,采用
ConcurrentHashMap来实现的。编程
二、断路器的功能主要是处理熔断,当客户端调用服务端出现问题时进行拦截,直接返回,再也不发送请求给服务端,减小下游服务的冲击。app
一、基于Eureka的服务注册和发现
二、提供服务的waiter-service
三、客户端调用customer-serviceide
3.一、断路器的配置:application.properties
规则取名为-order函数式编程
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.二、使用注解的方式实现断路器函数
@GetMapping("/getCoffee1") @io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker(name = "order") public Coffee getCoffee1() { Coffee list = coffeeService.getById(1l); log.info("Read coffee: {} coffee", list); return list; }
3.三、使用注册方式,实现断路器,短路以后默认返回空的listui
private CircuitBreaker circuitBreaker; public CustomerController(CircuitBreakerRegistry registry) { circuitBreaker = registry.circuitBreaker("order"); } @GetMapping("/getCoffee2") public List<Coffee> getCoffee2() { return Try.ofSupplier( CircuitBreaker.decorateSupplier(circuitBreaker, () -> coffeeService.getAll())) .recover(CircuitBreakerOpenException.class, Collections.emptyList()) .get(); }
3.四、关闭waiter-service,模拟服务宕机,展现效果设计
连续请求3次,服务调用失败code
失败超过50%,第4次触发短路器打开:
等待5秒钟,断路器尝试重连: