网站首页 > 精选教程 正文
环境: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
猜你喜欢
- 2024-11-17 SpringCloudAlibabaSentinel熔断限流
- 2024-11-17 2022届秋招Java岗高频面试题盘点,老司机也未必全会,真的太卷了
- 2024-11-17 2022春招,Java面试项目推荐,15个项目吃透两个offer拿到手软
- 2024-11-17 微服务网关如何防止雪崩?阿里开源项目之Sentinel限流、熔断
- 2024-11-17 SpringCloud之Hystrix服务降级
- 2024-11-17 分布式服务限流降级熔断解决方案Nacos之Dashboard界面配置含义
- 2024-11-17 2022年腾讯首发Java岗分布式面试真题,助力金三银四我是认真的
- 2024-11-17 一个可供参考的Java高并发异步应用案例--转
- 2024-11-17 面试官:聊聊服务熔断降级Sentinel
- 2024-11-17 2019年高级Java程序员面试题汇总,含个人答案总结
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)