内容提要
文章介绍Spring Boot整合Web容器的方法:通过Maven排除Tomcat依赖并引入Jetty,实现嵌入式容器。对比两者,Jetty更轻量、省内存、高效且可插拔扩展,适合分布式环境;Tomcat支持企业级高级特性但通常用不到。作者建议选用Jetty。
延伸解读
嵌入式容器的价值主要在DevOps便利性
文章指出,嵌入式Web容器与非嵌入式容器的差别并非性能或稳定性,而是更便于DevOps。这意味着选择Jetty或Tomcat时,若团队的基础设施和部署流程尚未标准化,嵌入式容器带来的运维简化可能有限。作者也提到大公司因历史包袱普及新标准较慢,因此技术选型需结合公司实际的基础设施成熟度,而非单纯追求新技术。
Jetty与Tomcat的选型依据
文章对比表显示,Jetty在轻量、省内存、快速高效、可插拔性和可扩展性上占优,适合分布式环境;Tomcat则支持企业级高级特性,但一般用不到且收费。作者建议选用Jetty,并提到Google App Engine选择Jetty,使其在云环境下成为默认选择。读者可据此评估自身项目是否依赖Tomcat的高级特性,否则Jetty是更轻量的替代。
依赖排除是整合的关键步骤
文章强调,在Spring Boot中整合Jetty需在引入spring-boot-starter-web时显式排除spring-boot-starter-tomcat,再引入spring-boot-starter-jetty。同时提醒统一版本,并列出五个建议显式引入的jar包,其中两个测试依赖的scope为test。这提示开发者,依赖冲突仍是痛点,手动管理关键依赖可避免容器冲突和版本不一致问题。
Q&A
Spring Boot 如何将默认的 Tomcat 容器替换为 Jetty?
在 Maven 的 pom.xml 中,先引入 spring-boot-starter-web 依赖,并在其中通过 <exclusions> 排除 spring-boot-starter-tomcat,然后单独添加 spring-boot-starter-jetty 依赖。这样即可使用 Jetty 作为嵌入式 Web 容器。
Jetty 和 Tomcat 主要有哪些区别?
Jetty 更轻量、节省内存、快速高效,且具有更好的可插拔性和可扩展性,更适合分布式环境;Tomcat 则支持一些企业级应用的高级特性,但这些特性一般用不到,且用到时可能收费。
为什么作者建议使用 Jetty 而不是 Tomcat?
因为 Jetty 更轻量、节省内存、高效且可插拔扩展,能满足分布式环境的需求;而 Tomcat 的企业级高级特性通常用不到,且可能收费。此外,Google App Engine 选择了 Jetty,使其在云环境下成为默认选择。
嵌入式 Web 容器和非嵌入式 Web 容器有什么差别?
嵌入式 Web 容器更便于 DevOps,但并没有性能和稳定性的差别。非嵌入式容器通常是公司统一的标准,在大公司中普及新标准较慢,因为存在历史包袱。
Spring Boot 项目通常需要显式引入哪些依赖?
一般需要显式引入 5 个 jar 包:spring-boot-autoconfigure、spring-boot-starter-web(需排除 logging 和 tomcat)、spring-boot-starter-jetty,以及测试用的 spring-boot-test 和 spring-boot-starter-test(注意统一版本)。
Spring Boot 的核心理念是什么?
Spring Boot 的理念是“约定大于配置”,通过标准化、流程化、工具化来降低复杂度,让开发者更少感知框架的存在,从而简化 Java 开发。