Spring Cloud Gateway+Resilience4j纯配置实现熔断器不触发如何解决
问题排查&解决方案
1. 核心错误:CircuitBreaker过滤器参数名拼写错误
Spring Cloud Gateway的CircuitBreaker过滤器的fallback配置参数为驼峰格式fallbackUri,你当前配置中写的是全小写fallbackuri,Spring Boot配置大小写敏感,参数名错误会导致降级规则完全不生效。
修正后的路由过滤器配置示例:
filters: - name: CircuitBreaker args: name: loginCircuitBreaker fallbackUri: forward:/loginServiceFallBack # 注意U为大写
两个路由的CircuitBreaker配置都需要做对应修改。
2. 缺少TimeLimiter配置
Resilience4j的熔断逻辑默认和TimeLimiter组件绑定工作,你当前仅配置了CircuitBreaker规则,未配置TimeLimiter规则,默认超时时间为1秒,未显式绑定的情况下会导致熔断触发逻辑异常,需要补充TimeLimiter配置:
resilience4j: timelimiter: configs: default: timeoutDuration: 5000 # 可根据业务需求调整超时时间,单位毫秒 instances: loginCircuitBreaker: baseConfig: default registerCircuitBreaker: baseConfig: default
3. 降级接口请求方法不兼容
你当前的降级接口使用@GetMapping注解,仅支持GET请求,如果下游服务的请求为POST、PUT、DELETE等其他方法,触发降级转发时会直接返回405状态码,表现为降级未触发。将降级接口改为支持所有请求方法即可:
@RequestMapping("/loginServiceFallBack") public String loginServiceFallBack() { return "Login Service is taking longer than expected to respond." + " Please check back in sometime "; } @RequestMapping("/registerServiceFallBack") public String registerServiceFallBack() { return "Register Service is taking longer than expected to respond." + " Please check back in sometime."; }
4. 降级路径被路由规则拦截
需要确保/loginServiceFallBack、/registerServiceFallBack两个路径没有被其他路由规则匹配转发到下游服务,网关优先匹配路由规则,如果被转发到下游就无法访问本地的降级Controller。可以将降级路径的路由优先级设为最高,或者确保现有路由规则不会匹配到这两个路径。
5. 可选:配置熔断触发的状态码范围
默认CircuitBreaker仅捕获5xx服务异常、连接超时、服务下线等场景,如果你需要捕获4xx类状态码触发熔断,可以补充如下配置:
spring: cloud: gateway: filter: circuit-breaker: statusCodes: - BAD_GATEWAY - SERVICE_UNAVAILABLE - GATEWAY_TIMEOUT - INTERNAL_SERVER_ERROR # 按需添加需要触发熔断的HTTP状态码
冗余依赖清理
你当前pom中引入了两份CircuitBreaker依赖,Spring Cloud Gateway是响应式框架,仅需保留响应式依赖即可,阻塞式依赖可以删除:
<!-- 可删除,为阻塞式服务的CircuitBreaker依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId> </dependency>
内容的提问来源于stack exchange,提问作者Soumav
相关产品推荐
相关产品推荐

