在看这篇文章前,先来看看作者所遇到的问题。理解问题形成的原因,从而深入理解http长连接与短连接的区别。
问题:
项目默认使用zuul进行请求转发(部分功能使用SimpleHostRoutingFilter进行http请求方式转发)。上线一段时间后,发现部分请求有部分失败情况。详情如下:
请求链路错误信息:noHttpResponeException,网上有很多解决方案及问题产生原因。现在想来他们的说法都很正确。
如:
1、服务端资源不足,导致客户端请求立即失败,解决方案重试几次。
2、客户端keep-alive时间大于服务端keep-alive时间
原因分析:
zuul请求转发使用SimpleHostRoutingFilter 其实还是使用原始httpClient方式进去请求,查询相关资料 HTTP1.1规定了默认保持长连接(HTTP persistent connection),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。关于三次握手和四次挥手这里不在叙述。
本案例中服务端使用的是短连接模式,而客户端使用长连接模式(默认方式),所以当服务端结束是,客户端任然使用该连接发送请求,从而出现noHttpResponeException异常。
解决方案:
一下几种解决方案都可以解决作者出现的问题。
1、重试方案:识别noHttpResponeException异常,进行重试操作
2、设置keep-alive方案
3、设置KeepAlive策略为不重用方案(作者采用的方案) ,即使用短连接模式(这里已经需要经过权衡取舍,原因是长连接与短连接各有优缺点)。