一、原因
我们在使用Spring Cloud的Ribbon或Feign来实现服务调用的时候,第一次请求经常会经常发生超时报错,而之后的调用就没有问题了。造成第一次服务调用出现失败的原因主要是Ribbon进行客户端负载均衡的Client并不是在服务启动的时候就初始化好的,而是在调用的时候才会去创建相应的Client,所以第一次调用的耗时不仅仅包含发送HTTP请求的时间,还包含了创建RibbonClient的时间,这样一来如果创建时间速度较慢,同时设置的超时时间又比较短的话,很容易就会出现上面所描述的显现。
二、Ribbon timeout默认值
在
RibbonClientConfiguration 类中,Ribbon
的默认timeout
时间默认设置为1秒
public class RibbonClientConfiguration { public static final int DEFAULT_CONNECT_TIMEOUT = 1000; public static final int DEFAULT_READ_TIMEOUT = 1000; public static final boolean DEFAULT_GZIP_PAYLOAD = true; @RibbonClientName private String name = "client"; @Autowired private PropertiesFactory propertiesFactory; public RibbonClientConfiguration() { } }
DEFAULT_READ_TIMEOUT默认设置为1秒,如果第一次请求响应时间超过了1秒,就会产生超时错误,我们可以在application.yml文件中做如下设置:
#建议3-5秒
ribbon:
ReadTimeout: 5000
ConnectTimeout: 5000
#Ribbon的饥饿加载(eager-load)模式
eager-load:
#开启Ribbon的饥饿加载模式
enabled: true
#指定需要饥饿加载的客户端名称、服务名
clients: spring-application-name服务名称
在Eclipse
或者Intellij IDEA
里,这两个timeout
时间属性是不会有提示的,这个很正常。不是所有的属性,IDE
都能正常提示的,不过没关系,不影响使用的。只要你配置了,Ribbon
就好按照你配置的来。
三、feign请求超时问题 (断点调试经常遇到 )
解决办法如下:
开启hystrix,配置hystrix的超时时间
#feign客户端启动hystrix断路保护
feign: hystrix: enabled: true hystrix: command: default: execution: isolation: thread: #断路器超时时间 默认1秒,首次访问时间比较长,容易造成访问超时的问题,这边设置成5秒以解决该问题 timeoutInMilliseconds: 60000