场景

在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也是如此,所以配置项的先后顺序很重要。

更多推荐