OpenFeign 实践之 FeignClient 超时设置

简介: OpenFeign 实践之 FeignClient 超时设置

一、问题描述:


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


1、批量发邮件


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


3、同步调用支付接口


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


image.png


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


  1. 由于被调用方处理的时间比较长, 调用方可以选择增加等待时间


  1. 修改被调用方的处理逻辑,优化设计。


  1. 修改调用放的处理逻辑,修改直接调用为,隐式调用。


问题不在发散,我就想做一条咸鱼,保证服务不报错,我们就直接改 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);
}


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


三、总结:


还有一点我门需要注意,该配置不支持热更新,如果我们修改超时时间过后,需要重启服务。 如果我们不重启的,可以修改配置, 实现


feign.client.refresh-enabled=true


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


相关文章
|
监控 druid Java
Spring Boot 3 集成 Druid 连接池详解
在现代的Java应用中,使用一个高效可靠的数据源是至关重要的。Druid连接池作为一款强大的数据库连接池,提供了丰富的监控和管理功能,成为很多Java项目的首选。本文将详细介绍如何在Spring Boot 3项目中配置数据源,集成Druid连接池,以实现更高效的数据库连接管理。
13647 2
Spring Boot 3 集成 Druid 连接池详解
|
数据安全/隐私保护
SpringSecurity利用@PreAuthorize注解自定义权限校验
利用@PreAuthorize注解自定义权限校验
3928 0
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
36985 1
|
存储 监控 Java
OpenFeign请求拦截器组件RequestInterceptor原理与使用场景
该文章讲述了OpenFeign中的请求拦截器组件RequestInterceptor的原理及其常见使用场景。
OpenFeign请求拦截器组件RequestInterceptor原理与使用场景
|
Java 微服务 Spring
【Spring Cloud】spring cloud 调用feign请求超时 feign.RetryableException: Read timed out executing POST
【Spring Cloud】spring cloud 调用feign请求超时 feign.RetryableException: Read timed out executing POST
3146 0
|
数据采集 Java Linux
Java“Broken Pipe”解决
Java中遇到“Broken Pipe”错误通常是因为Socket连接被远程主机关闭,而本地程序仍在尝试写入数据。解决方法包括:1. 检查网络连接和防火墙设置;2. 增加超时设置;3. 使用异常处理捕获并重试。
3635 4
|
前端开发 API 微服务
SpringCloud微服务之间使用Feign调用不通情况举例
SpringCloud微服务之间使用Feign调用不通情况举例
2789 2
|
前端开发 小程序 Java
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
本文详细介绍了如何在SpringBoot项目中统一处理接口返回结果及全局异常。首先,通过封装`ResponseResult`类,实现了接口返回结果的规范化,包括状态码、状态信息、返回信息和数据等字段,提供了多种成功和失败的返回方法。其次,利用`@RestControllerAdvice`和`@ExceptionHandler`注解配置全局异常处理,捕获并友好地处理各种异常信息。
8627 1
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
|
存储 应用服务中间件 PHP
设置nginx中文件上传的大小限制度
设置nginx中文件上传的大小限制度

热门文章

最新文章