我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Feign Client 超时时间配置不生效的解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Feign Client 超时时间配置不生效的解决

Feign Client 超时时间配置不生效

解决方案

Feign Client 的 connectTimeout 和 readTimeout 需要同时配置:


feign.client.config.my-api.connectTimeout = 10000
feign.client.config.my-api.readTimeout = 600000

如果只配置了 readTimeout 或 connectTimeout 的其中一条,配置不生效。

问题描述

Feign Client 配置如下:


feign.client.config.default.connectTimeout = 3000
feign.client.config.default.readTimeout = 3000
feign.client.config.my-api.readTimeout = 600000

默认超时时间配置了 3 秒。

由于 my-api 的响应数据较大,于是配置了 10 分钟超时时间。

执行后发现,my-api 请求仍然 3 秒后就抛出如下异常:


Caused by: feign.RetryableException: Read timed out executing POST http://my-api
 at feign.FeignException.errorExecuting(FeignException.java:67)
 at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:104)
 at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76)
 at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:108)
 at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)
 at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)
 at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)

Feign Client的各种超时时间设置

在Spring Cloud微服务架构中,大部分公司都是利用Open Feign进行服务间的调用,而比较简单的业务使用默认配置是不会有多大问题的,但是如果是业务比较复杂,服务要进行比较繁杂的业务计算,那后台很有可能会出现Read Timeout这个异常,因此定制化配置超时时间就有必要了。

1. Feign Client Configuration


# 默认开启
feign.httpclient.enabled=false
# 默认关闭
feign.okhttp.enabled=true
# 默认关闭
feign.hystrix.enabled=false
# 默认关闭
feign.sentinel.enabled=true
# default context 连接超时时间
feign.client.config.default.connectTimeout = 5000
# default context 读超时时间
feign.client.config.default.readTimeout = 10000
# 设置重试处理器,默认直接抛出异常
# feign.client.config.default.retryer = Class<Retryer>
# 设置日志级别,默认NONE
# feign.client.config.default.loggerLevel = FULL

2. Hystrix Configuration


# 全局设置超时:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 30000

hystrix在ribbon的外层处理。

3. Ribbon Configuration


# 连接超时时间,默认为1秒,该值会被FeignClient配置connectTimeout覆盖
ribbon.ConnectTimeout=5000
# 读超时时间,默认为1秒,该值会被FeignClient配置readTimeout覆盖
ribbon.ReadTimeout=5000
# 最大重试次数
ribbon.MaxAutoRetries=1

当Ribbon调用接口发送连接异常或者超时异常时会触发Ribbon 的重试机制。

4. OkHttp Client Configuration

所设置的连接时间和超时时间最后会动态设置到OkHttpClient中,最底层也就是Socket的连接时间和读超时时间。也就是说,直接配置OkHttpClient是无效的。

解决方案:添加OkHttp Client的请求Interceptor,动态设置超时时间。


@Bean("okHttpClient")
public OkHttpClient okHttpClient(ConnectionPool connectionPool) {
 return new OkHttpClient().newBuilder().connectionPool(connectionPool)
             // 改值在FeignClient体系中会被动态覆盖
   .connectTimeout(6, TimeUnit.SECONDS)
             // 改值在FeignClient体系中会被动态覆盖
   .readTimeout(VmcConstants.TEN_SECONDS, TimeUnit.SECONDS)
             // 添加拦截器,支持动态设置超时时间
   .addInterceptor(new OkHttpClientDynamicTimeoutInterceptor())
            .eventListener(eventListener())
   .build();
}

5. 小结一下吧

1.如何配置好Hystrix和Ribbon的超时时间呢?

其实是有套路的,因为Feign的请求:其实是Hystrix+Ribbon。Hystrix在最外层,然后再到Ribbon,最后里面的是http请求。所以说。Hystrix的熔断时间必须大于Ribbon的 ( ConnectTimeout + ReadTimeout )。而如果Ribbon开启了重试机制,还需要乘以对应的重试次数,保证在Ribbon里的请求还没结束时,Hystrix的熔断时间不会超时。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Feign Client 超时时间配置不生效的解决

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Springboot2 session设置超时时间无效的解决方法

本篇内容介绍了“Springboot2 session设置超时时间无效的解决方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题:今天项目
2023-06-20

设置session过期时间不生效怎么解决

如果设置session过期时间不生效,可能是由于以下原因:1. 服务器配置问题:检查服务器的session配置是否正确。确保session的过期时间设置正确,并且服务器支持session过期时间的功能。2. 代码逻辑问题:检查代码中是否有其
2023-08-17

springboot配置mybatis的sql执行超时时间怎么解决

这篇“springboot配置mybatis的sql执行超时时间怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“spr
2023-07-04

springboot配置mybatis的sql执行时间超时如何解决

这篇文章主要介绍“springboot配置mybatis的sql执行时间超时如何解决”,在日常操作中,相信很多人在springboot配置mybatis的sql执行时间超时如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法
2023-07-06

解读springboot配置mybatis的sql执行超时时间(mysql)

这篇文章主要介绍了解读springboot配置mybatis的sql执行超时时间(mysql),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-12

Docker下MySQL配置文件不生效的解决方法(超全面!)

目录问题描述解决思路1. 查看mysql配置文件位置my.cnf配置详解2. 确认docker映射的文件(本人就在这一步踩坑了!!!)3. 将宿主机上的mysql配置文件映射到docker中4. 修改配置文件5. 重启Docker容器6.j
Docker下MySQL配置文件不生效的解决方法(超全面!)
2024-09-26

nginx设置超时时间的问题及解决方案

nginx超时设置常见问题包括启动超时、读写超时、keepalive超时和发送超时。优化超时设置的最佳实践包括识别关键请求、使用合理默认值、根据负载调整超时、使用keepalive连接和监视超时错误。具体示例包括增加启动超时、调整读写超时、优化keepalive超时和减少发送超时。
nginx设置超时时间的问题及解决方案
2024-04-02

怎么解决php.ini设置时区不生效问题

这篇文章主要介绍“怎么解决php.ini设置时区不生效问题”,在日常操作中,相信很多人在怎么解决php.ini设置时区不生效问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决php.ini设置时区不生
2023-06-25

解决Springboot配置excludePathPatterns不生效的问题

这篇文章主要介绍了解决Springboot配置excludePathPatterns不生效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

Redis的setNX分布式锁超时时间失效-1问题及解决

这篇文章主要介绍了Redis的setNX分布式锁超时时间失效-1问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-09

Redis的setNX分布式锁超时时间失效 -1问题及解决

目录Redis setNX分布式锁超时时间失效 -1使用SETNX加锁使用 RedisTemplate 操作Redhttp://www.cppcns.comis解决死锁Redis分布式锁,超时问题的处理分布式可能会出现的超时问题总结Redi
2023-01-09

vue配置代理vue.config.js后不生效的解决(小坑)

这篇文章主要介绍了vue配置代理vue.config.js后不生效的解决(小坑),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录