- 最近在使用SpringCloudZuul网关时,报错 “Read timed out”
Caused by: java.lang.RuntimeException: java.net.SocketTimeoutException: Read timed out
at rx.exceptions.Exceptions.propagate(Exceptions.java:57) ~[rxjava-1.3.8.jar!/:1.3.8]
at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:463) ~[rxjava-1.3.8.jar!/:1.3.8]
at rx.observables.BlockingObservable.single(BlockingObservable.java:340) ~[rxjava-1.3.8.jar!/:1.3.8]
at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:112) ~[ribbon-loadbalancer-2.2.5.jar!/:2.2.5]
... 135 common frames omitted
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.8.0_211]
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[na:1.8.0_211]
at java.net.SocketInputStream.read(SocketInputStream.java:171) ~[na:1.8.0_211]
at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[na:1.8.0_211]
查询资料后,发现:
ribbon.ConnectTimeout的配置值小于hystrix.command.default.execttion.isolation.thread.timeoutInMilliseconds,有可能会报错NUMBEROF_RETRIES_NEXTSERVER_EXCEEDED。
当ribbon.ReadTimeout的配置值小于hystrix.command.default.execttion.isolation.thread.timeoutInMilliseconds配置值的时候,也有可能会返回NUMBEROF_RETRIES_NEXTSERVER_EXCEEDED错误。
- springCloud通过网关服务访问分布式内部服务,如果需要自定义访问超时时间:
- 由于网关内部是通过ribbon来进行服务负载,所有需要配置ribbon
#服务名
rcmd-service-data:
ribbon:
# Max number of retries on the same server (excluding the first try)
MaxAutoRetries: 1
# Max number of next servers to retry (excluding the first server)
MaxAutoRetriesNextServer: 2 #当允许在其他服务器上重试的时候,会调用IRule.choose选择可用服务实例中的其他一台服务实例进行调用
# Whether all operations can be retried for this client
OkToRetryOnAllOperations: true #默认为false,则只允许GET请求被重试
ReadTimeout: 5000
ConnectTimeout: 2000
- 也可以正对某些响应状态码进行重试(当调用rcmd-service-data返回404,502的时候,进行重试,其他状态码不重试):
rcmd-service-data:
ribbon:
retryableStatusCodes: 404,502
- 此时并非结束(ribbon内部优惠构造hystrix command来执行请求(所以我们常说ribbon的超时时间设置要大于等于hystrix 超时时间,不然导致command还没执行完,ribbon却超时了)
# ribbon总的超时时间 = (1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout
# 如果超时了,但是熔断机制还没有超时,则zuul会异常
hystrix.command.eureka-consumer.execution.isolation.thread.timeoutInMilliseconds=21000
至此整个网关超时配置已经配置差不多,更详细的源码分析在下方链接
😁 作者:Teddy (公众号:鸡仓故事汇)
ok!到这里就大功告成,小编(Teddy)在这里先感谢大家的到来。
虽然不是太详细,小编已经很努力,给小编来个一键三连(点赞,关注,收藏),小编会越来越努力。。。