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

本文目录

一、问题描述

二、问题原因

三、解决方案


一、问题描述

Spring Cloud项目,两个微服务之间调用报错超时,控制台抛出异常,截取部分报错:

feign.RetryableException: Read timed out executing POST http://back-control-engine/client/v1.0/robotClient/robotTest

Caused by: java.net.SocketTimeoutException: Read timed out

feign.RetryableException: Read timed out executing POST http://back-control-engine/client/v1.0/robotClient/robotTest
	at feign.FeignException.errorExecuting(FeignException.java:84)
	at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:113)
	at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:78)
	at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103)
	at com.sun.proxy.$Proxy234.robotTest(Unknown Source)
	at com.uiotsoft.back.brain.platform.business.service.impl.RobotClientServiceImpl.robotTest(RobotClientServiceImpl.java:28)
	at com.uiotsoft.back.brain.platform.controller.api.RobotClientController.voiceChatClient(RobotClientController.java:33)
	at com.uiotsoft.back.brain.platform.controller.api.RobotClientController$$FastClassBySpringCGLIB$$61a13ae5.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
	at com.uiotsoft.back.brain.platform.config.AopConfig.doAround(AopConfig.java:55)
	at sun.reflect.GeneratedMethodAccessor245.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
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:171)
	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:735)
	at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
	at feign.Client$Default.convertResponse(Client.java:143)
	at feign.Client$Default.execute(Client.java:68)
	at org.springframework.cloud.openfeign.ribbon.RetryableFeignLoadBalancer$1.doWithRetry(RetryableFeignLoadBalancer.java:114)
	at org.springframework.cloud.openfeign.ribbon.RetryableFeignLoadBalancer$1.doWithRetry(RetryableFeignLoadBalancer.java:94)
	at rx.Observable.unsafeSubscribe(Observable.java:10327)
	at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:94)
	at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:42)
	at rx.Observable.unsafeSubscribe(Observable.java:10327)
	at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
	at rx.Observable.subscribe(Observable.java:10423)
	at rx.Observable.subscribe(Observable.java:10390)
	at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:443)
	at rx.observables.BlockingObservable.single(BlockingObservable.java:340)
	at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:112)
	at org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient.execute(LoadBalancerFeignClient.java:83)
	... 132 common frames omitted

二、问题原因

这是一个http请求报错超时,因为feign的调用分为两层:Ribbon的调用和Hystrix的调用,所以我们在配置文件中添加超时配置即可。高版本的Hystrix默认是关闭的,可以不设置。

三、解决方案

所以在 application.yml 配置文件中设置 ribbon 即可:

ribbon:
    # 请求处理的超时时间
    ReadTimeout: 60000
    # 请求连接的超时时间
    ConnectTimeout: 60000

或者 在 application.properties 配置文件中设置 ribbon

# 请求处理的超时时间
ribbon.ReadTimeout: 60000
# 请求连接的超时时间
ribbon.ConnectTimeout: 60000

完结!

### 回答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时,可以通过增加超时时间、优化服务器性能、检查网络连接、以及捕获异常并重试等方式来解决这个问题。希望本回答对您有所帮助!
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

No8g攻城狮

向每一个努力改变现状的你致敬!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值