天天看点

feign调用超时的解决方案开场白问题描述解决方案总结

feign调用超时的解决方案开场白问题描述解决方案总结

开场白

生活是美好的,咱们无论什么时候得充满信心,对未来充满希望,并以平衡为美

对于咱们的技术架构也是一样,也是一样,要做到技术对业务的平衡,并不能因为某项技术好就使用它,要从业务、公司发展及他因素寻找平衡点。

异中求同,折中冲突,乃万事万物生存之道。-赫拉克利特

问题描述

有时候有这样的需求,客户端通过feign的client进行调用服务的接口,进行跑数据,但是这个跑数据是批量跑,需要耗费很长的时间进行返回数据,而又不能让客户端进行断掉,同时不能通过改变全局配置来进行接口的超时设置。

解决方案

方案描述

针对上面提出的问题,如果通过全局配置会影响全局接口的调用,因为其他接口延长了超时时间,那就会导致很多接口执行很长时间,其他接口阻塞的情况,同时也不会收到很好的效果,会报如下的异常:

feign.FeignException: status 500 reading

2020-10-23 11:40:26,042 ERROR [XNIO-2 task-57] [n.c.r.f.r.e.BusinessExceptionHandler:63] - Startup-21dd19f6d329451d - [5000][Startup-21dd19f6d329451d]系统异常! Broken pipe

java.io.IOException: Broken pipe

at sun.nio.ch.FileDispatcherImpl.writev0(Native Method)

at sun.nio.ch.SocketDispatcher.writev(SocketDispatcher.java:51)

上面的异常明显是客户端超时断开连接,服务端相应失败

feign:

client:

config:

support-ms-app:

connectTimeout: 5000

readTimeout: 5000000

上面的配置没有生效,其实负载均衡有个优先级关系,先是熔断器》rabbion>feign,配置了上面的不管用,但是这样做是不对的,会影响其他接口的超时情况,这个时候我们要选择一种折中的方案,来解决问题,那就是重新写一个调用模板bean,设置超时时间,虽然花点时间进行编程,但是这样做及不影响原来的程序,而且能够把数据逻辑跑完整。

方案实现

### 定义一个配置类,并并配置bean
@Configuration           

应用配置类的bean,进行测试

总结