事情的经过是这样的

公司绝大多数应用都是springboot+tomcat提供web接口的服务,彼此之间使用httpclient调用,一直以来大家相安无事。直到决策引擎将Tomcat替换为netty,秀了一把webflux开始,我们的服务在空闲的时候就出现Connection Reset的问题。

连接池

我们常说的http连接是依托TCP而建立的。HTTP是应用层协议,TCP是传输层协议。TCP就是单纯的建立连接、传输数据。HTTP建立连接是非常繁琐和耗性能的,需要经过TCP的三次挥手和四次握手,如果对于同一个请求地址能省去这个过程,对服务性能将是极大的提升。

为了解决上面这个问题,http1.1中增加了kepp-alive来保证我们每次http请求的时候,不用重新建立连接。为了提升系统的性能,我们采用池化技术。对象池通过复用对象来减少的创建、垃圾回收的开销。连接池通过复用TCP的连接来减少创建和释放连接的时间。线程池通过复用线程来提高系统的并发能力。

连接池一般对外提供获得连接、归还连接的接口给客户端使用,并暴露最小空闲连接数、最大连接数等可配置参数,在内部则实现连接建立、连接心跳保持、连接管理、空闲连接回收、连接可用性检测等功能。

连接池示意图