项目中远程接口调用如何应用断路器
环境:SpringBoot2.3.12.RELEASE + Spring Cloud Hoxton.SR12简介
Spring Cloud 断路器提供了不同断路器实现之间的抽象。它提供了在应用程序中使用的一致API,让开发人员选择最适合应用程序需求的断路器实现。
Spring Cloud支持以下断路器实现: Resilience4J Sentinel Spring Retry 阻塞式应用
要在代码中创建断路器,可以使用CircuitBreakerFactory API。当你在类路径中包含Spring Cloud Circuit Breaker starter时,将自动为你创建实现此API的bean。下面的例子展示了如何使用这个API的一个简单例子: org.springframework.cloud spring-cloud-starter-circuitbreaker-resilience4j 或者(反应式) org.springframework.cloud spring-cloud-starter-circuitbreaker-reactor-resilience4j
简单API应用@Service public static class UsersService { private RestTemplate rest; private CircuitBreakerFactory cbFactory; public DemoControllerService(RestTemplate rest, CircuitBreakerFactory cbFactory) { this.rest = rest; this.cbFactory = cbFactory; } public Users getUser() { return cbFactory.create("remoteUser").run(() -> rest.getForObject("/100", Users.class), throwable -> "用户用户信息失败"); } }
CircuitBreakerFactory.create API创建一个名为CircuitBreaker 的类实例。run方法接受一个Supplier 和一个Function 。Supplier 是你要包装在断路器中的代码。Function 是在断路器跳闸时运行的后备功能。Function 被传递导致触发回退的Throwable 。如果你不想提供一个回退,你可以选择排除它。反应式应用
如果Project Reactor位于类路径上,你还可以为响应式代码使用ReactiveCircuitBreakerFactory 。下面的例子展示了如何做到这一点:@Service public static class DemoControllerService { private ReactiveCircuitBreakerFactory cbFactory; private WebClient webClient; public DemoControllerService(WebClient webClient, ReactiveCircuitBreakerFactory cbFactory) { this.webClient = webClient; this.cbFactory = cbFactory; } public Mono getUser() { return webClient.get().uri("/100").retrieve().bodyToMono(Users.class).transform( it -> cbFactory.create("remoteUser").run(it, throwable -> return Mono.just("获取用户失败"))); } }
ReactiveCircuitBreakerFactory.create API创建一个名为ReactiveCircuitBreaker 的类实例。run方法将一个Mono 或Flux 包在一个断路器中。你可以选择配置一个回退函数,该函数将在断路器被触发并传递导致故障的Throwable时被调用。配置
你可以通过创建Customizer 类型的bean来配置断路器。Customizer 接口有一个方法(称为customize),它接受对象进行自定义。
有关如何自定义给定实现的详细信息,请参阅以下文档:
Resilience4J:
https://docs.spring.io/spring-cloud-commons/spring-cloud-circuitbreaker/current/reference/html/spring-cloud-circuitbreaker.html#configuring-resilience4j-circuit-breakers
Sentinel:
https://github.com/alibaba/spring-cloud-alibaba/blob/2.2.x/spring-cloud-alibaba-docs/src/main/asciidoc/circuitbreaker-sentinel.adoc#circuit-breaker-spring-cloud-circuit-breaker-with-sentinel%E2%80%94%E2%80%8Bconfiguring-sentinel-circuit-breakers
Spring Retry:
https://docs.spring.io/spring-cloud-circuitbreaker/docs/current/reference/html/spring-cloud-circuitbreaker.html#configuring-spring-retry-circuit-breakers
一些 CircuitBreaker 实现,如Resilience4JCircuitBreaker ,在每次调用CircuitBreaker#run 时调用自定义方法。它可能是低效的。在这种情况下,你可以使用CircuitBreaker#once 方法。
下面的例子展示了io.github.resilience4j.circuitbreaker.CircuitBreaker 的方法。断路器消耗事件。Customizer.once(circuitBreaker -> { circuitBreaker.getEventPublisher() .onStateTransition(event -> log.info("{}: {}", event.getCircuitBreakerName(), event.getStateTransition())); }, CircuitBreaker::getName)
完毕!!!
Spring Cloud Sentinel 熔断降级
Spring Cloud Sentinel 流控限流
Spring Cloud Sentinel 基础配置
Spring MVC 异步请求方式
Spring中字段格式化的使用详解
SpringBoot WebFlux整合Spring Security进行权限认证
Spring 自定义Advisor以编程的方式实现AOP
Spring Security权限控制系列(七)
Spring Security权限控制系列(一)
Spring Security权限控制系列(五)
Spring Security权限控制系列(六)
Spring Security权限控制系列(二)
Spring Security权限控制系列(三)
Spring Security权限控制系列(四)
Spring Cloud Function 快速入门