前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud openFeign远程调用超时解决办法

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

作者头像
猫头虎
发布2024-04-07 20:49:12
7240
发布2024-04-07 20:49:12
举报
文章被收录于专栏:用户11053981的专栏

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

摘要:

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

引言:

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

解决方法:

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

正文

问题

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

代码语言:javascript
复制
com.netflix.hystrix.exception.HystrixRuntimeException: XXXService#login(RequestObject) timed-out and no fallback available.
原因

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

代码语言:javascript
复制
feign:
  hystrix:
    # 启用fegin断路器
    enabled: true

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


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

代码语言:javascript
复制
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的重试时间)。

配置步骤配置步骤:
代码语言:javascript
复制
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的配置:

代码语言:javascript
复制
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”:[链接]
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SpringCloud openFeign远程调用超时解决办法
  • 摘要:
  • 引言:
  • 解决方法:
  • 正文
    • 问题
      • 原因
        • 配置步骤配置步骤:
          • 解决
            • 总结:
              • 参考资料:
              相关产品与服务
              负载均衡
              负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档