SpringCloud openFeign远程调用超时解决办法

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁
🦄 博客首页——猫头虎的博客🎐
🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐
🌊 《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大小厂~💐

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

SpringCloud openFeign远程调用超时解决办法

摘要:

本文探讨了在使用Spring Cloud OpenFeign进行远程调用时可能出现的超时问题,并提供了解决超时问题的方法。通过合理的配置和设置,开发人员可以有效地解决由于网络延迟等原因导致的远程调用超时情况,确保系统的稳定性和可靠性。

引言:

Spring Cloud OpenFeign是一种用于简化微服务架构下远程服务调用的框架。然而,在实际使用中,由于网络延迟、服务端响应时间等原因,远程调用可能会出现超时问题,导致系统性能下降甚至崩溃。为了解决这一问题,本文将介绍一些方法来有效地应对Spring Cloud OpenFeign远程调用超时的情况,确保系统的稳定运行。

解决方法:

  1. 设置超时时间: 在OpenFeign的配置文件中,可以通过设置连接超时和读取超时等参数来限制远程调用的时间。通过适当调整这些参数,可以避免长时间等待远程服务响应的情况。
  2. 使用熔断机制: 可以结合Hystrix等熔断机制,在远程调用失败或超时时进行降级处理,返回默认值或错误信息,避免因单个远程服务故障而影响整个系统。
  3. 优化网络通信: 可以通过优化网络配置、使用负载均衡等手段,减少网络延迟,提升远程调用的性能和稳定性。

正文

问题

在使用openFein进行远程调用的时候,调用超时,报错信息如下:

com.netflix.hystrix.exception.HystrixRuntimeException: XXXService#login(RequestObject) timed-out and no fallback available.

原因

OpenFeign 内部集成了HytrixRibbon 组件,当设置了

feign:
  hystrix:
    # 启用fegin断路器
    enabled: true

,相当于启用了断路器,那么调用的超时时间将会按照 RibbonHytrix 的较小者去配置。


补充: 在引入了openFein组件后,可以配置的内容如下所示:

1. hystrix可配置的部分:

hystrix.command.default.execution.timeout.enable=true //为false则超时控制有ribbon控制,为true则hystrix超时和ribbon超时都是用,但是谁小谁生效,默认为true

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000//熔断器的超时时长默认1秒,最常修改的参数

circuitBreaker.requestVolumeThreshold=20 //触发熔断的最小请求次数,默认为20

circuitBreaker.sleepWindowInMilliseconds=5000 //休眠时长,默认为5秒

circuitBreaker.errorThresholdPercentage=50 //触发熔断的失败请求最小占比,默认50%

2. ribbon可配置的部分:

ribbon.ReadTimeout=1000 //处理请求的超时时间,默认为1秒

ribbon.ConnectTimeout=1000 //连接建立的超时时长,默认1秒

ribbon.MaxAutoRetries=1 //同一台实例的最大重试次数,但是不包括首次调用,默认为1次

ribbon.MaxAutoRetriesNextServer=0 //重试负载均衡其他实例的最大重试次数,不包括首次调用,默认为0次

ribbon.OkToRetryOnAllOperations=false //是否对所有操作都重试,默认false

 3. Feign可配置的部分:

feign.hystrix.enable=false //feign是否启用断路器,默认为false

Ribbon的注意事项:

  1. Ribbon的超时有2个:连接超时和处理超时,默认都是1秒。
  2. Ribbon的默认重试也有2个:同一实例的重试次数和负载均衡的不同实例的重试次数,默认为1次和0次。

也就是说,如果只有一个实例,连接超时重试1次,处理超时也重试1次。即:实际Ribbon的超时时间是 1秒×2+1秒×2=4秒。

  1. Ribbon默认GET请求不论是连接失败还是处理失败都会重试,而对于非GET请求只对连接失败进行重试。

结论:配置Hystrix的timeoutInMillisecond要大于Ribbon的 ( ConnectTimeout + ReadTimeout ) × 2。目的就是保证在熔断之前完成远程调用(包括Ribbon的重试时间)。

配置步骤配置步骤:

1. 开启Feign的Hystrix开关

feign:
  hystrix:
    enabled: true
2. 设置Hystrix超时时长

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 15000
3. 配置ribbon的连接时长和服务响应时长

ribbon:
  ConnectTimeout: 2000
  ReadTimeout: 5000

解决

版本说明:SpringBoot:2.3.3.Release, OpenFeign: 2.2.7.Release
配置以下Feign的配置:

feign:
  hystrix:
    # 启用fegin断路器
    enabled: true
    strategy:
      custom: true  # 自定义feign熔断策略
  httpclient:
    enabled: true
  okhttp:
    enabled: false

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 15000

ribbon:
  ConnectTimeout: 2000
  ReadTimeout: 5000

问题解决,远程调用微服务成功。

总结:

Spring Cloud OpenFeign作为微服务架构下的远程调用框架,在实际应用中可能会面临远程调用超时的问题。为了应对这一问题,本文介绍了设置超时时间、使用熔断机制和优化网络通信等方法。通过合理的配置和技术手段,可以有效地解决远程调用超时问题,提升系统的可靠性和性能。

参考资料:

  1. Spring Cloud OpenFeign官方文档:[链接]
  2. “Spring Microservices in Action” by John Carnell, Manning Publications, 2017.
  3. “Mastering Spring Cloud” by Thomas Uphill, Packt Publishing, 2020.
  4. “Spring Cloud for Microservices Compared to Kubernetes” by Richard Chesterwood, Apress, 2021.
  5. “Netflix Open Source Software Center - Hystrix”:[链接]

在这里插入图片描述

原创声明

======= ·

  • 原创作者: 猫头虎

作者wx: [ libin9iOak ]

学习复习

本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任

未经许可,禁止商业用途。

如有疑问或建议,请联系作者。

感谢您的支持与尊重。

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫头虎

一分也是爱,打赏博主成就未来!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值