在Spring Boot项目中,选择应用服务器是一个常见问题。但需要明确的是:Spring Boot默认推荐使用内嵌(Embedded)服务器,而不是传统的独立应用服务器。
以下是详细分析和建议:
✅ 推荐方案:使用内嵌服务器(Embedded Server)
Spring Boot 默认支持以下几种内嵌服务器:
| 服务器 | 说明 |
|---|---|
| Tomcat (默认) | Spring Boot 默认集成的内嵌服务器,稳定、易用、社区支持好 |
| Jetty | 轻量级,适合高并发、低资源消耗场景(如微服务) |
| Undertow | 由JBoss开发,性能优秀,尤其适合高吞吐量场景 |
示例:切换为 Jetty
<!-- pom.xml -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
</dependencies>
❌ 传统独立应用服务器(如 Tomcat、WebLogic、WebSphere)
虽然可以将 Spring Boot 打成 WAR 包部署到外部服务器,但这不是推荐做法,原因如下:
- 违背了“约定优于配置”和快速启动的设计理念
- 部署复杂,需要额外管理服务器生命周期
- 容器化(Docker/K8s)时不如内嵌服务器方便
- 微服务架构中不利于独立部署和扩展
仅在以下情况考虑使用:
- 公司强制要求统一部署在 WebLogic/WebSphere 上
- 已有遗留系统依赖特定应用服务器功能
- 需要共享同一个 JVM 实例运行多个应用(节省资源)
如果必须使用,需:
public class MyApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(MyApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
并打包为 war 文件。
🚀 推荐选择总结
| 场景 | 推荐服务器 |
|---|---|
| 普通 Web 应用 / REST API | ✅ 内嵌 Tomcat(默认,最稳妥) |
| 高并发、低延迟服务 | ✅ Undertow 或 Jetty |
| 微服务架构 | ✅ 内嵌服务器 + Docker 容器化 |
| 企业级传统环境(强依赖) | ⚠️ 外部 Tomcat/WebLogic(非首选) |
🔚 结论
Spring Boot 项目应优先选择内嵌服务器(如 Tomcat、Jetty 或 Undertow),避免使用传统的独立应用服务器,除非有特殊企业约束。
这样能充分发挥 Spring Boot “开箱即用、快速部署、易于容器化”的优势。
如有特殊需求,再考虑 WAR 部署模式。
CDNK博客