项目中远程接口调用如何应用断路器

环境:SpringBoot2.3.12.RELEASE + Spring Cloud Hoxton.SR12


简介

Spring Cloud 断路器提供了不同断路器实现之间的抽象。它提供了在应用程序中使用的一致API,让开发人员选择最适合应用程序需求的断路器实现。

Spring Cloud支持以下断路器实现:

阻塞式应用

要在代码中创建断路器,可以使用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和一个FunctionSupplier是你要包装在断路器中的代码。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方法将一个MonoFlux包在一个断路器中。你可以选择配置一个回退函数,该函数将在断路器被触发并传递导致故障的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 快速入门

展开阅读全文

页面更新:2024-05-10

标签:断路器   反应式   应用程序   路径   函数   例子   接口   权限   代码   方法   项目   系列

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top