1.场景
最近一直在关注springboot项目优化的问题,其中,最关注的就是内存开销,和吞吐量问题!遇到最多的问题就是Tomcat线程限制(处理器数的200~250倍),和链接数问题导致的并发问题,而影响后台服务器端(或者应用程序)性能!
考虑到tomcat的分配连接(socket)机制:每接入服务器接口,都会分配一条线程去处理对应的业务,以及包括但不限与数据库线程连接池的开销,对我们项目的性能,以及(硬件)环境都将是一个极大的考验。当然也可以通过优化配置解决部分,配置tomcat的初始线程,闲置线程,最大线程等;但由于tomcat的BIO处理机制,根本性的限制了tomcat应对高并发问题不具有优势!
后经了解,springboot内嵌有三种服务器(容器)供开发者选择,分别是:tomcat,jetty,undertow;
2.tomcat,jetty,undertow已有资料对比
对比类型1:undertow更优秀
SpringBoot服务器压测对比(jetty、tomcat、undertow)_springboot 压测_Coding工匠的博客-优快云博客
Tomcat vs Jetty vs Undertow性能对比 - 腾讯云开发者社区-腾讯云
Undertow,Tomcat和Jetty服务器之间的区别_tomcat jetty undertow_hp碰碰的博客-优快云博客
结论:整体Undertow 更优异
对比类型2:tomcat更优秀
java - 别再误人子弟了-tomcat、undertow、jetty性能对比 - Spring Boot从入门到精通 - SegmentFault 思否
结论:整体tomcat优于undertow
3.疑惑
三种容器的对比,两种不同的结论!而百度引擎中多数文章都在说undertow如何吊打tomcat,各种测试截图,也是有理有据!而对应tomcat更优秀的结论也是有图有真相!事实究竟如何?
4.连接器机制
Tomact的连接器与业务深度绑定(BIO),一个用户接入服务器就是一条线程。
Jetty和Undertow的连接器不直接进行绑定(NIO),而是由连接器分配业务线程,业务处理完毕,线程空置,可再重新复用。可参考undertow服务器分析_进入Undertow Web服务器
同时,Undertow的垃圾回收(GC)配置和最小化按需加载模块,也是其在处理并发问题中表现优异的重要原因。
IO与NIO区别_io和nio的区别_Leida_hzm的博客-优快云博客
Java NIO: 单线程管理多个连接(jetty/undertow)
Java IO: 一个典型的IO服务器设计- 一个连接通过一个线程处理(tomcat)
5.结论
不能说tomcat不优秀,很多的对比样例中我们也看到的,一些追求效率和物理开销允许的的情况下,还是比较推荐tomcat的。而springcloud、springboot 微服务成为趋势的情况下,undertow的替代tomcat也将成为一种趋势!同时也不排除有比undertow更优秀的服务器(容器出现)。