Spring Boot 项目在生产环境中通常不直接部署在传统意义上的“应用服务器”(如 Tomcat、WebLogic、WebSphere)上,而是采用更现代、轻量、灵活的部署方式。以下是主流实践和常见部署环境:
✅ 主流生产部署方式(推荐)
-
独立可执行 JAR 包 + 内嵌容器(最常用)
- Spring Boot 默认打包为
fat jar(含内嵌 Tomcat/Jetty/Undertow),通过java -jar app.jar直接启动。 - 部署环境:
- Linux 服务器(物理机或虚拟机):如 CentOS/RHEL、Ubuntu/Debian,配合
systemd管理进程(自动启停、日志、重启策略)。 - 容器化平台(最主流):
- ✅ Docker + Kubernetes(K8s):行业标准。JAR 打包为 Docker 镜像,由 K8s 编排调度、扩缩容、服务发现、健康检查等。
- ✅ Docker Swarm / OpenShift(次选,但 K8s 占绝对主导)。
- Linux 服务器(物理机或虚拟机):如 CentOS/RHEL、Ubuntu/Debian,配合
- ✅ 优势:部署简单、环境一致、与云原生生态无缝集成、易于 CI/CD。
- Spring Boot 默认打包为
-
云平台托管服务(Serverless 或 PaaS)
- AWS Elastic Beanstalk / AWS ECS / AWS EKS
- Azure App Service(支持 Java Spring Boot 原生部署)
- Google Cloud Run(无服务器,自动扩缩容,基于容器)
- 阿里云 EDAS / SAE(Serverless 应用引擎) / 容器服务 ACK
- ✅ 优势:免运维底层基础设施,聚焦业务;天然支持监控、日志、灰度发布等。
-
传统 WAR 包部署(已逐渐淘汰,仅遗留系统使用)
- 将 Spring Boot 项目打包为
WAR,部署到外部 Servlet 容器中(如 Tomcat 9+/Jetty 10+)。 - ⚠️ 注意:需继承
SpringBootServletInitializer并重写configure(),且需禁用内嵌容器(server.port=0+spring.main.web-application-type=SERVLET)。 - ❗ 不推荐新项目采用:失去 Spring Boot 的内嵌容器优势(如快速启动、配置简化、actuator 集成等),增加运维复杂度。
- 将 Spring Boot 项目打包为
🚫 不推荐的部署方式(生产慎用)
- 直接在 Windows 服务器上运行(稳定性、安全性和运维生态弱于 Linux);
- 使用开发工具(如 IDEA 内置 Maven 运行)直接上线;
- 未做 JVM 调优、日志隔离、健康检查、优雅停机等生产就绪配置。
✅ 生产就绪必备配套(无论部署在哪)
| 类别 | 关键实践 |
|---|---|
| 进程管理 | systemd(Linux)、Supervisor(备选)、K8s liveness/readiness probes |
| JVM 调优 | 合理设置 -Xms/-Xmx、GC 策略(如 G1)、启用 GC 日志 |
| 配置管理 | 外部化配置(application-prod.yml + --spring.config.location),或接入 Nacos/Apollo/Consul |
| 监控告警 | Actuator + Prometheus + Grafana + AlertManager;或云厂商 APM(如 SkyWalking、Arthas) |
| 日志 | 输出到文件(Logback/Log4j2)+ ELK/Splunk,避免仅输出到控制台 |
| 安全 | HTTPS(TLS 终止在 Nginx/ALB/K8s Ingress)、禁用敏感端点(如 /actuator/env)、最小权限原则 |
✅ 总结一句话:
现代 Spring Boot 生产部署首选「Docker 容器化 + Kubernetes 编排」,运行于 Linux 云服务器(公有云/私有云);次选云厂商 PaaS(如 Azure App Service、阿里云 SAE);传统 WAR + 外置 Tomcat 仅适用于特殊合规或遗留场景,不建议新项目采用。
如需,我可为你提供:
systemd服务配置模板- Dockerfile 最佳实践(多阶段构建、非 root 用户)
- Kubernetes Deployment + Service YAML 示例
- 生产级
application-prod.yml配置参考
欢迎继续提问! 😊
CLOUD技术博