spring cloud 调用feign请求超时 feign.RetryableException: Read timed out executing POST

问题介绍:

服务之间调用报错超时,截取部分报错,Read timed out executing POST http://******

feign.RetryableException: Read timed out executing POST http://******
at feign.FeignException.errorExecuting(FeignException.java:67)
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:104)
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76)
at feign.ReflectiveFeign F e i g n I n v o c a t i o n H a n d l e r . i n v o k e ( R e f l e c t i v e F e i g n . j a v a : 103 ) a t c o m . s u n . p r o x y . FeignInvocationHandler.invoke(ReflectiveFeign.java:103) at com.sun.proxy. FeignInvocationHandler.invoke(ReflectiveFeign.java:103)atcom.sun.proxy.Proxy113.getBaseRow(Unknown Source)
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:704)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1569)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at feign.Client D e f a u l t . c o n v e r t R e s p o n s e ( C l i e n t . j a v a : 152 ) a t f e i g n . C l i e n t Default.convertResponse(Client.java:152) at feign.Client Default.convertResponse(Client.java:152)atfeign.ClientDefault.execute(Client.java:74)
原因及解决办法:

明显可以看到是http请求报错超时,feign的调用分两层,ribbon的调用和hystrix的调用,高版本的hystrix默认是关闭的,所以在application.properties配置文件中设置ribbon即可

#请求处理的超时时间
ribbon.ReadTimeout: 120000
#请求连接的超时时间
ribbon.ConnectTimeout: 30000
如果开启hystrix,hystrix的超时报错如下图:

FeignDemo#demo() timed-out and no fallback available。和ribbon超时报错还是有区别的

com.netflix.hystrix.exception.HystrixRuntimeException: FeignDemo#demo() timed-out and no fallback available.
at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:819)
at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:804)
at rx.internal.operators.OperatorOnErrorResumeNextViaFunction 4. o n E r r o r ( O p e r a t o r O n E r r o r R e s u m e N e x t V i a F u n c t i o n . j a v a : 140 ) a t r x . i n t e r n a l . o p e r a t o r s . O n S u b s c r i b e D o O n E a c h 4.onError(OperatorOnErrorResumeNextViaFunction.java:140) at rx.internal.operators.OnSubscribeDoOnEach 4.onError(OperatorOnErrorResumeNextViaFunction.java:140)atrx.internal.operators.OnSubscribeDoOnEachDoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87)
at rx.internal.operators.OnSubscribeDoOnEach D o O n E a c h S u b s c r i b e r . o n E r r o r ( O n S u b s c r i b e D o O n E a c h . j a v a : 87 ) a t c o m . n e t f l i x . h y s t r i x . A b s t r a c t C o m m a n d DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) at com.netflix.hystrix.AbstractCommand DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87)atcom.netflix.hystrix.AbstractCommandDeprecatedOnFallbackHookApplication 1. o n E r r o r ( A b s t r a c t C o m m a n d . j a v a : 1472 ) a t c o m . n e t f l i x . h y s t r i x . A b s t r a c t C o m m a n d 1.onError(AbstractCommand.java:1472) at com.netflix.hystrix.AbstractCommand 1.onError(AbstractCommand.java:1472)atcom.netflix.hystrix.AbstractCommandFallbackHookApplication 1. o n E r r o r ( A b s t r a c t C o m m a n d . j a v a : 1397 ) a t r x . i n t e r n a l . o p e r a t o r s . O n S u b s c r i b e D o O n E a c h 1.onError(AbstractCommand.java:1397) at rx.internal.operators.OnSubscribeDoOnEach 1.onError(AbstractCommand.java:1397)atrx.internal.operators.OnSubscribeDoOnEachDoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87)
at rx.observers.Subscribers$5.onError(Subscribers.java:230)
Caused by: java.util.concurrent.TimeoutException
at com.netflix.hystrix.AbstractCommand.handleTimeoutViaFallback(AbstractCommand.java:997)
at com.netflix.hystrix.AbstractCommand.access$500(AbstractCommand.java:60)
at com.netflix.hystrix.AbstractCommand$12.call(AbstractCommand.java:610)
at com.netflix.hystrix.AbstractCommand$12.call(AbstractCommand.java:601)
解决办法:

feign.hystrix.enabled: true
hystrix 熔断机制
hystrix:
shareSecurityContext: true
command:
default:
circuitBreaker:
sleepWindowInMilliseconds: 100000
forceClosed: true
execution:
isolation:
thread:
timeoutInMilliseconds: 600000

### 回答1: feign.retryableexception: read timed out executing post 是一个错误提示,意思是在执行 post 请求时读取超时了。可能是因为网络连接不稳定或者服务器响应时间过长导致的。建议检查网络连接和服务器状态,或者尝试增加请求超时时间。 ### 回答2: "feign.retryableexception: read timed out executing post" 这个错误信息通常是由于Feign客户端在执行POST请求时,读取响应超时了而导致的。Feign客户端是一个服务消费者,它能够通过像发送HTTP请求一样发送请求到服务提供方,并获取到响应结果。在Feign中,当执行POST请求时,客户端会等待服务提供方响应的结果,当等待的时间超过了指定的时间,就会出现"read timed out executing post"这个错误信息。 这个问题一般会发生在网络环境比较复杂或者网络质量比较差的情况下。解决这个问题的方法有以下几种: 一、增加连接超时时间和读取超时时间。可以通过配置Feign客户端的连接超时时间和读取超时时间来解决这个问题。例如,将连接超时时间设置为30秒,读取超时时间设置为60秒,以防止由于响应慢而出现timeout异常。 二、检查网络和服务提供方是否正常。timeout异常有可能是服务提供方出现问题导致的,因此我们需要检查服务提供方是否可用,网络是否稳定,防止因网络问题而出现的timeout异常。 三、设计前端重试机制。对于网络环境不稳定的场景,我们可以设计前端重试机制来解决这个问题。例如,当出现timeout异常时,可以让客户端重试一定次数,或者等待一段时间再进行下一次尝试。 在实际的开发中,我们应该根据实际的需求和环境去选择合适的解决方案,以保证系统的可靠性和稳定性。 ### 回答3: Feign是一个使用Java编写的HTTP客户端框架,它可以帮助我们在客户端中定义我们的API接口,同时也可以处理服务器的返回结果。在使用Feign时,有时会遇到一个错误,即“feign.retryableexception: read timed out executing post”。这个错误通常是由服务器响应过慢或者网络故障引起的。如果我们在使用Feign时遇到了这个错误,可以通过以下几种方式来解决: 第一种方法是增加超时时间。在Feign中,默认的超时时间是10秒钟,如果服务器响应时间超过了这个时间,就会抛出“read timed out”异常。可以通过在@FeignClient注解中设置connectTimeout和readTimeout参数来增加超时时间,例如: @FeignClient(name = "service", url = "http://localhost:8080", connectTimeout = 5000, readTimeout = 5000) 这个示例将连接超时时间和读取超时时间都设置为5秒钟。 第二种方法是检查服务器的响应时间。如果服务器响应时间过长,也会导致Feign超时并抛出异常。可以通过使用类似curl或者Postman这样的工具,来测试服务端的响应时间,并对服务器性能进行优化。 第三种方法是检查网络连接。如果网络连接不稳定,也可能导致Feign超时并抛出异常。可以通过ping命令或者其他网络连接测试工具来检查网络连接质量。 最后,还可以通过捕获异常并重试来解决这个问题。可以在Feign调用的方法中,使用try-catch语句捕获Feign.RetryableException异常,并进行重试操作。可以使用Spring Retry等框架来实现重试机制。 总结来说,Feign.retryableexception: read timed out executing post这个错误通常是由服务器响应过慢或者网络故障引起的。在使用Feign时,可以通过增加超时时间、优化服务器性能、检查网络连接、以及捕获异常并重试等方式来解决这个问题。希望本回答对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值