添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Ribbon与OpenFeign的超时设置(解决RetryableException: Read timed out executing问题)

feign.RetryableException: Read timed out executing GET http://CLOUD-PAYMENT-SERVICE/payment/feign/timeOut
	at feign.FeignException.errorExecuting(FeignException.java:213)
	at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:115)
	at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:80)
java.net.SocketTimeoutException: Read timed out

OpenFeign的超时设置

default 默认是全局的,将 default 换成某个服务的名称可以设置单个服务的超时时间

##设置feign客户端的超时时间
#建立连接所用的时间,适用于网络状况正常的情况下,两端连接所需要的时间
feign.client.config.default.connectTimeout: 8000
#指建立连接后从服务端读取到可用资源所用的时间
feign.client.config.default.readTimeout: 8000

Ribbon的超时设置

#请求连接的超时时间(ms),限制20秒内必须请求到服务,并不限制服务处理的返回时间(缺省时默认1000ms)
ribbon.ConnectTimeout: 20000
#请求处理的超时时间(ms),下级服务响应最大时间,超出时间消费方(路由也是消费方)返回timeout(缺省时默认1000ms)
ribbon.ReadTimeout: 20000
ribbon.SocketTimeout: 20000
#同一台实例最大重试次数,不包括首次调用(对当前实例的重试次数)
ribbon.MaxAutoRetries: 0
#重试负载均衡其他的实例最大重试次数,不包括首次调用(切换实例的重试次数)
ribbon.MaxAutoRetriesNextServer: 0
#是否所有操作都重试
ribbon.OkToRetryOnAllOperations: false
#单独设置某个服务的超时时间,会覆盖其他的超时时间限制,服务的名称以注册中心页面显示的名称为准,超时时间不可大于断路器的超时时间
#service-a.ribbon.ReadTimeout: 50000
#service-a.ribbon.ConnectTimeout: 50000

FeignRibbon 的超时时间只会有一个生效,规则:如果没有设置过 feign 超时,也就是等于默认值的时候,就会读取 ribbon 的配置,使用 ribbon 的超时时间和重试设置。否则使用 feign 自身的设置。两者是二选一的,且 feign 优先。

未配置 Feign 的超时时间时, 使用 Ribbon 的配置(未配置Ribbon时, 使用其默认超时时间1s); 否则使用 Feign 的配置.

怎么看当前请求的超时

源码跟踪参考微服务系列:Spring Cloud 之 Feign、Ribbon、Hystrix 三者超时时间配置

feign.Request 中可以发现 OpenFeign 的默认的 connectTimeout 是 10 秒,readTimeout 是 60 秒。
在这里插入图片描述
其实 OpenFeign 集成了 RibbonRibbon 的默认连接超时时间、读取超时时间都是 1 秒,源码在RibbonClientConfiguration#ribbonClientConfig
在这里插入图片描述
org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer#execute如图打断点即可看到本次请求的超时时间.
在这里插入图片描述

  1. 【推荐】微服务系列:Spring Cloud 之 Feign、Ribbon、Hystrix 三者超时时间配置
  2. Ribbon的超时和重试机制
本文简要介绍了微服务架构的关键组件。Nacos是服务发现与配置管理平台,支持服务注册、发现和集配置管理。结合Ribbon,实现客户端负载均衡,并可通过自定义策略调整负载均衡行为。Feign简化了HTTP客户端开发,并支持日志、超时配置和认证逻辑的定制。Nacos配置心允许动态更新配置信息。Sentinel提供流量控制和熔断降级功能,确保系统稳定。Seata解决了微服务场景下的分布式事务一致问题。这些组件共同构建了一个强大、灵活的微服务生态系统。 在使用Spring Cloud 的时候,都用到Ribbon做负载均衡,使用Feign 简化web 服务调用,在使用的过程,网络服务是不稳定,所有要设置超时时间,避免服务端响应慢影响调用的服务,网络可能偶尔不稳定,重试机制能增加成功的几率。feign.client.config.user-service.connect-timeout=1000 #tcp连接超时时间1s以内。feign.client.config.user-service.read-timeout=2000 # 设置读取时间为2s。 在很多功能都需要调用多个服务才能完成某一项功能,一个成熟的微服务集群,内部调用必然依赖一个好的 RPC 框架,比如:基于 Http 协议的Feign,基于私有 tcp 协议的Dubbo1. Feign 是什么Feign 是Spring Cloud Netflix组件的轻量级Restful的 HTTP 服务客户端,实现了负载均衡和 Rest 调用的开源框架,封装了Ribbon和RestTemplate, 实现了WebService的面向接口编程,进一步降低了项目的耦合度。 经过修改 ribbon.ReadTimeout 的值,可以发现确实是该配置影响的,将其变大确实可以满足需求,但由于该配置文件是全局配置,影响较大,想请问大家有没有其他解决方案,如将某一接口排除在外,或者通过其他配置问题背景 最近公司项目有个功能需进行三层Feign调用,且还要调外部接口,延迟挺大,造成Feign一直提示Read timed out executing POST。 feign.RetryableException: Read timed out executing POST http://****** at feign.FeignException.errorExecuting... 最近在学习springcloud微服务,在使用openfeign时,需要使用ribbon组件的ConnectTimeOut和ReadTimeOut功能,代码示下: @GetMapping(value = "/payment/feign/timeOut") public String paymentTimeOut(){ //设定暂停3秒,openFeign默认等待时间一秒 TimeUnit.SECONDS.sleep(3 这是由于OpenFeign集成的Ribbon默认设置超时时间为1秒。我们可以通过修改超时时间来避免出现这个异常。项目使用了openFeign作为微服务调用方式,使用过程由于一个接口响应较慢,出现了。 his application has no explicit mapping for /error, so you are seeing this as a fallback. Wed Apr 14 23:42:54 CST 2021 There was an unexpected error (type=Internal Server Error, status=500). Read timed ou.