OpenFegin 实践之 FeignClient 超时设置

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、问题描述:

如果我们线上有一些同步请求的接口比如:

1、批量发邮件

2、一次执行上万的数据处理

3、同步调用支付接口

如果我们有以上的操作可能出现下面的异常

image-20220326125823278.png

其实这里有两种解决方案:

  1. 由于被调用方处理的时间比较长, 调用方可以选择增加等待时间
  2. 修改被调用方的处理逻辑,优化设计。
  3. 修改调用放的处理逻辑,修改直接调用为,隐式调用。

问题不在发散,我就想做一条咸鱼,保证服务不报错,我们就直接改 feign 的等待时间即可

二、解决方法:

在解决方法的部分,我们还是先贴出部分已有的代码和逻辑,来回应一下当前的场景。

部分代码

1、Feign 接口定义如下:

@FeignClient(name = "payment-service", path = "/payment")
public interface PaymentFeign {
​
    @PostMapping("/create")
    PaymentVo create(@RequestBody @Validated PaymentDto paymentDto);
}
复制代码

2、调用代码如下:

    @Autowired
    private PaymentFeign paymentFeign;
​
    @GetMapping("/create")
    public OrderVo create(@Validated OrderDto orderDto) {
        log.info("uri:/order/create lang:{}", LocaleContextHolder.getLocale().getLanguage());
        // 忽略逻辑代码 N 行
        paymentFeign.create(paymentDto);
        log.info("uri:/order/create paymentFegin.create cost: {} ms", System.currentTimeMillis() - start);
        return orderVo;
    }
复制代码

3、feign 超时配置

feign:
  client:
    config:
      default:
        # 日志级别
        loggerLevel: full
        # 超时设置 1.5 秒超时
        connectTimeout: 1500
        readTimeout: 1500
  # 断路器
  circuitbreaker:
    enabled: true
复制代码

一句话概括上面的代码:我在 xxx/create 接口中调用了, /payment/create 且我设置了, feign 的超时时间为 1.5s。但是由于 /payment/create 调用过程中超时,返回了 TimeOut。

解决方案

方案一:

增加 feign 的默认超时时间,为 5s

feign:
  client:
    config:
      default:
        # 日志级别
        loggerLevel: full
        # 超时设置 5 秒超时
        connectTimeout: 5000
        readTimeout: 5000
  # 断路器
  circuitbreaker:
    enabled: true
复制代码

方案二:

指定feign 接口的 contextId 设置当前 feign 的超时时间为 5s.

feign:
  client:
    config:
      default:
        # 日志级别
        loggerLevel: full
        # 超时设置
        connectTimeout: 1500
        readTimeout: 1500
      payment-core:
        connectTimeout: 5000
        readTimeout: 5000
  # 断路器
  circuitbreaker:
    enabled: true
复制代码

PaymentFeign 设置上 contextId 属性

@FeignClient(name = "payment-service", contextId = "payment-core",  path = "/payment")
public interface PaymentFeign {
​
    @PostMapping("/create")
    PaymentVo create(@RequestBody @Validated PaymentDto paymentDto);
}
复制代码

这样做,我们就可以减少影响,减少下游的影响。

三、总结:

参考地址资料: spring-cloud-openfeign

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享