JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Spring Cloud Gateway核心过滤器之服务熔断降级

wys521 2024-11-17 16:59:13 精选教程 17 ℃ 0 评论

环境:SpringBoot2.4.13 + Spring Cloud Gateway3.0.1


概述

Spring Cloud CircuitBreaker GatewayFilter工厂使用Spring Cloud CircularBreaker API将网关路由包装在断路器中。Spring Cloud CircuitBreaker支持可与Spring Cloud Gateway一起使用的多个库。Spring Cloud支持开箱即用的Resilience4J

要启用Spring Cloud CircuitBreaker过滤器,需要在类路径上放置Spring-Cloud-starter-CircuitBreaker-recorator-resilence4j。以下示例配置Spring Cloud CircuitBreaker GatewayFilter:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
  <version>2.1.0</version>
</dependency>

配置示例

基于resilience4j的过滤器工厂SpringCloudCircuitBreakerResilience4JFilterFactory

spring:
  cloud:
    gateway:
      routes:
      - id: S001
        uri: http://localhost:9091
        filters:
        - CircuitBreaker=myCircuitBreaker

要配置断路器,请参阅正在使用的基础断路器实现的配置。

  • Resilience4J Documentation

https://cloud.spring.io/spring-cloud-circuitbreaker/reference/html/spring-cloud-circuitbreaker.html

Spring Cloud CircuitBreaker Filter还可以接受可选的fallbackUri参数。目前,仅支持转发:schemed URI。如果调用了回退,则将请求转发到URI匹配的控制器。以下示例配置了这种回退:

spring:
  cloud:
    gateway:
      routes:
      - id: S001
        uri: http://localhost:9091
        predicates:
        - Path=/api-1/**
        filters:
        - name: CircuitBreaker
          args:
            name: myCircuitBreaker
            fallbackUri: forward:/fallback

Controller

@RestController
@RequestMapping("/fallback")
public class FallbackController {
  @GetMapping("")
  public Object index() {
    return "fallback" ;
  }
}

通过Java代码配置

@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
  return builder.routes()
    .route("S001", r -> r.path("/api-1/**")
      .filters(f -> f.circuitBreaker(c -> c.name("myCircuitBreaker").fallbackUri("forward:/fallback"))
        .uri("http://localhost:9091")
    .build();
}

使用fallbackUri在网关应用程序中定义内部控制器或处理程序。但是,也可以将请求重新路由到外部应用程序中的控制器或处理程序,如下所示:

spring:
  cloud:
    gateway:
      routes:
      - id: ingredients
        uri: lb://order-service
        predicates:
        - Path=/api-a/**
        filters:
        - name: CircuitBreaker
          args:
            name: orderfallback
            fallbackUri: forward:/fallback
      - id: T001
        uri: http://localhost:9990
        predicates:
        - Path=/fallback

在此示例中,网关应用程序中没有回退端点或处理程序,而是跳到其它的路由下,这里是http://localhost:9990。

在请求被转发到回退的情况下,Spring Cloud CircuitBreaker 网关过滤器还提供导致该请求的Throwable。它作为ServerWebExchangeUtils.CIRCUITBEAKER_EXECUTION_EXCEPTION_ATTR属性添加到ServerWebExchange,可用于处理网关应用程序内的回退。

@RestController
public class FallbackController {
  @GetMapping("/fallback")
  public Mono<String> fallback(ServerWebExchange exchange) {
    Throwable t = exchange.getAttribute(ServerWebExchangeUtils.CIRCUITBREAKER_EXECUTION_EXCEPTION_ATTR) ;
    t.printStackTrace() ;
    return Mono.just(t.getMessage()) ;
  }
}

当接口调用超时,会执行上面的/fallback接口,如果通过上面的配置那么默认的超时时间是1s。我们可以自定义这个超时时间。

@Component
public class CustomCircuitBreakerConfig implements Customizer<ReactiveResilience4JCircuitBreakerFactory> {
  @Override
  public void customize(ReactiveResilience4JCircuitBreakerFactory tocustomize) {
    tocustomize.configure(builder -> {
      builder.timeLimiterConfig(
        TimeLimiterConfig
          .custom()
          .timeoutDuration(Duration.ofSeconds(5))
          .build()
      );
    }, "orderCircuitBreaker") ;
  }
}

在某些情况下,可能希望根据从它包裹的路由返回的状态码跳闸断路器。断路器配置对象接受状态代码列表,如果返回该状态代码,将导致断路器跳闸。在设置想要触发断路器的状态码时,可以使用带状态码值的整数或HttpStatus枚举的String表示。

spring:
  cloud:
    gateway:
      routes:
      - id: ingredients
        uri: lb://order-service
        predicates:
        - Path=/api-a/**
        filters:
        - name: CircuitBreaker
          args:
            name: myCircuitBreaker
            fallbackUri: forward:/fallback
            statusCodes:
              - 500

完毕!!!

Spring WebFlux请求处理流程
一文带你彻底理解Spring WebFlux的工作原理
Spring WebFlux中使用WebClient远程接口调用
Spring WebFlux使用函数式编程之HandlerFunction(1)
Spring WebFlux使用函数式编程之RouterFunction(2)
SpringBoot WebFlux整合Spring Security进行权限认证
SpringBoot WebFlux整合MongoDB实现CRUD及分页功能
Spring WebFlux核心处理组件DispatcherHandler
SpringBoot WebFlux整合R2DBC实现数据库反应式编程
Spring WebFlux使用函数式编程之Filtering Handler Functions

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表