Spring Boot 项目在生产环境中通常不直接部署在传统意义上的“应用服务器”(如 Tomcat、WebLogic、WebSphere)上,而是采用更现代、轻量、云原生友好的部署方式。以下是主流且推荐的生产部署模式:
✅ 1. 独立可执行 JAR 包 + 内嵌容器(最主流)
- Spring Boot 默认打包为
jar(使用spring-boot-maven-plugin),内嵌 Tomcat/Jetty/Undertow。 - 部署方式:直接通过
java -jar myapp.jar启动,无需额外安装和配置外部 Web 容器。 - ✅ 优势:
- 简单、一致、易容器化(Docker 友好)
- 版本隔离(每个应用自带容器,避免冲突)
- 易于 CI/CD、滚动升级、健康检查(配合 Actuator)
- 🌐 生产实践中常配合:
- 进程管理工具:
systemd(Linux)、supervisord或pm2(较少见)确保开机自启、崩溃重启; - 反向X_X:Nginx(处理 HTTPS、负载均衡、静态资源、限流、缓存等),Spring Boot 应用只暴露内部端口(如
8080); - 安全加固:禁用 HTTP(强制 HTTPS)、设置 JVM 参数(内存、GC)、启用 Actuator 端点保护(如
/actuator/health,/actuator/metrics需认证)。
- 进程管理工具:
✅ 2. 容器化部署(云原生标准)
- 打包为 Docker 镜像 → 推送至私有/公有镜像仓库 → 部署到:
- Kubernetes(K8s)集群(最主流):自动扩缩容、服务发现、滚动更新、健康探针(Liveness/Readiness)、日志/监控集成(Prometheus + Grafana);
- Docker Swarm / OpenShift / Rancher 等编排平台;
- ✅ 示例 Dockerfile(精简、多阶段构建):
FROM eclipse-temurin:17-jre-jammy COPY target/myapp.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-Xms512m", "-Xmx1024m", "-jar", "/app.jar"]
✅ 3. 云平台托管服务(免运维)
- AWS Elastic Beanstalk / ECS / EKS
- Azure App Service (with Java SE runtime) 或 AKS
- Google Cloud Run(无服务器,自动扩缩容)或 GKE
- 阿里云 EDAS / SAEC / ACK、腾讯云 TKE / SCF
→ 这些平台底层仍运行容器或 JVM,但开发者只需上传 JAR/WAR 或镜像,平台负责部署、监控、伸缩、日志收集等。
⚠️ 不推荐(或已淘汰)的方式:
- ❌ 传统 WAR 包部署到外部 Tomcat/WebLogic:
Spring Boot 官方明确建议优先使用内嵌容器;WAR 部署失去“开箱即用”优势,增加运维复杂度,且与云原生理念背道而驰(除非遗留系统强依赖特定容器特性)。 - ❌ 裸机直接运行 jar 无任何进程管理/监控:缺乏高可用保障,不符合生产规范。
🔑 生产环境关键补充实践:
| 维度 | 推荐方案 |
|---|---|
| 配置管理 | 外部化配置:application-prod.yml + 环境变量 / Config Server(Spring Cloud Config) / Nacos / Apollo |
| 日志 | Logback + 异步输出 → 输出到文件 + 控制台(供容器采集)→ 接入 ELK 或 Loki/Promtail |
| 监控告警 | Spring Boot Actuator + Micrometer → Prometheus 抓取 → Grafana 展示 + Alertmanager 告警 |
| 安全 | Spring Security + JWT/OAuth2;禁用敏感 Actuator 端点;HTTPS 强制;最小权限 JVM 用户运行 |
| 高可用 | 多实例 + Nginx/K8s Service 负载均衡 + 分布式 Session(Redis)或无状态设计 |
✅ 总结一句话:
Spring Boot 生产部署首选「内嵌容器 + 可执行 JAR」,运行在 Linux 服务器上(常由 systemd 管理),前置 Nginx 做反向X_X,并强烈推荐容器化后部署到 Kubernetes 集群——这是当前云原生时代的标准实践。
如需具体某一种部署方式(如 K8s YAML 示例、systemd unit 文件、Nginx 配置模板),我可为你详细提供 👍
CDNK博客