Spring cloud gateway熔断不重试问题
·
场景
在SCG中配置默认重试和熔断规则如下,当调用超时接口时未触发重试规则进行重试,直接使用了熔断规则返回熔断信息。
spring:
cloud:
gateway:
httpclient:
connect-timeout: 1000 #连接超时时间 ,动态
response-timeout: 3s #请求读取超时时间,动态
default-filters:
- name: Retry #重试
args:
retries: 1 #重试次数
series: #不指定错误码系列
statuses: BAD_GATEWAY,INTERNAL_SERVER_ERROR,SERVICE_UNAVAILABLE #500,502状态重试
methods: GET,POST # 只有get和post接口重试
- name: CircuitBreaker #注释后动态关闭
args:
name: cacheCustomizer
fallbackUri: forward:/cache/broken
分析
分析源码可知,SCG是针对每一个路由创建一个filter队列,并依安装先进后出的执行filter,当熔断filter优先于重试filter时,就会出现直接返回熔断信息的情况。
解决方案
将Retry规则放于CircuitBreaker规则下面,这样就会优先执行Retry,然后执行CircuitBreaker。
spring:
cloud:
gateway:
httpclient:
connect-timeout: 1000 #连接超时时间 ,动态
response-timeout: 3s #请求读取超时时间,动态
default-filters:
- name: CircuitBreaker #注释后动态关闭
args:
name: cacheCustomizer
fallbackUri: forward:/cache/broken
- name: Retry #重试
args:
retries: 1 #重试次数
series: #不指定错误码系列
statuses: BAD_GATEWAY,INTERNAL_SERVER_ERROR,SERVICE_UNAVAILABLE #500,502状态重试
methods: GET,POST # 只有get和post接口重试
扩展
Spring Cloud gateway的其他filter也是如此,所以配置项的先后顺序很重要。
更多推荐


所有评论(0)