servlet容器有哪些-日常开发常用且可直接部署运行的服务器容器
做JavaWeb开发的初期,一直搞不清servlet容器有哪些,总把服务器和容器概念混为一谈,部署项目时随便选一个工具,结果频繁出现端口冲突、适配报错、运行异常的问题。折腾了大半个月,挨个实操测试过后,才彻底分清市面上主流的servlet容器,也摸透了每一款的适用场景。
最先接触的是Tomcat,也是绝大多数初学者入门、中小型项目开发的首选容器。当时初学JavaWeb,课本和网课清一色都用它,安装配置的流程最简单,轻量化不占内存,对新手极其友好。标准版的Tomcat完美适配servlet规范,能够完整解析和运行servlet程序,不用额外配置复杂参数,解压安装、配置环境变量、修改端口号,三步就能直接启动项目。之前做课程设计、小型后台项目,全程用Tomcat部署,从来没出现过适配bug,唯一的问题就是高并发场景下性能偏弱,大型项目集群部署时会显得吃力。
很多人不知道Jetty其实也是主流servlet容器,最开始我甚至以为它只是一个小众的辅助工具。偶然一次迭代老项目,接手的老旧后台系统,用的就是Jetty容器。上手之后发现它的优势特别明显,体积比Tomcat更小,启动速度快得离谱,修改代码后热部署效率极高。当时做频繁的代码调试,每次改完配置不用重启服务,几秒就能刷新页面查看效果,大幅节省了调试时间。它同样完整支持servlet所有规范,兼容性完全够用,只是社区生态不如Tomcat成熟,网上的报错解决方案相对少,遇到冷门问题只能自己排查。
试过好几次Resin容器,是在企业实习接触到的商用级servlet容器。和开源免费的Tomcat、Jetty不一样,Resin主打高性能、高稳定性,适配企业级大型web项目。当时公司的核心业务系统部署在Resin上,日常百万级访问量也能稳定承载,不会出现卡顿、请求超时的情况。它对servlet、jsp的解析精度更高,自带安全防护、负载均衡的基础功能,不用额外集成插件。唯一的短板就是商用版需要付费,免费版功能阉割严重,个人开发基本不会用到,只适合企业商用场景。
有段时间贪图便捷,直接用了JBoss内嵌的servlet容器做测试。很多人误以为JBoss是独立服务器,其实它底层依托自研的servlet容器运行web程序,完整兼容servlet规范。当时为了省去单独部署容器的步骤,直接用JBoss部署整合项目,整体适配度很高,不用调整项目结构。但弊端特别突出,整体体量太大,启动速度极其缓慢,电脑配置一般的话,启动一次要等待好几分钟,而且冗余功能太多,单纯运行servlet项目完全大材小用,后续就再也没用来做日常开发。
undertow是后来接触微服务项目时用到的容器,算是新生代的高性能servlet容器。之前做SpringBoot微服务开发,默认替换掉了内置的Tomcat,改用undertow。它的非阻塞IO特性特别适配高并发微服务场景,资源占用极低,吞吐量大,应对瞬时大量请求的能力远超传统容器。测试过同样的接口并发请求,undertow的响应速度明显更快,报错率更低。唯一的不足就是配置逻辑和Tomcat差异较大,习惯了传统容器的配置方式,刚上手会有点不适应,需要重新熟悉参数配置规则。
市面上没有绝对完美的servlet容器,每一款的定位和适配场景都截然不同。
现在做小型项目、日常学习调试,依旧会优先打开Tomcat进行部署测试。