在 Spring Boot 的生态里,部署方式其实非常灵活,从本地开发到大规模生产环境都有对应的最佳实践。所谓的“服务器”,在现代云原生架构下,已经不仅仅是那台物理机或虚拟机了,更多时候指的是运行环境和基础设施类型。
结合国内主流的云厂商(阿里云、腾讯云、华为云等)以及行业通用标准,我把常用的部署场景分为几个层级来聊:
1. 最基础/入门级:云服务器 ECS/CVM
这是绝大多数中小团队和个人开发者起步的选择。
- 典型产品:阿里云 ECS、腾讯云 CVM、华为云 ECS。
- 操作系统:通常选择 CentOS 7/8、Ubuntu 20.04/22.04 或 Debian。
- 部署方式:
- JAR 包直接运行:
java -jar app.jar。最简单,但缺乏进程守护,容易因为网络波动或误操作导致服务挂掉。 - Systemd 守护:写一个
.service文件,让 Linux 系统自带的能力来管理进程。这是单机部署的标准姿势,能实现开机自启、崩溃重启。 - Supervisor/Nginx + uWSGI (不推荐):Spring Boot 是内嵌 Tomcat,不需要 Nginx 做反向XX uwsgi,直接用 Nginx 做反向XX转发请求到
localhost:8080即可,顺便解决静态资源和跨域问题。
- JAR 包直接运行:
注意:对于高并发场景,单台 ECS 性能瓶颈明显,且存在单点故障风险。
2. 主流生产级:容器化部署 (Docker + K8s)
目前中大型互联网公司和技术团队的标配。Spring Boot 官方也强烈推荐 Docker 镜像打包。
- 核心组件:
- Docker:将 Spring Boot 应用打成轻量级镜像,解决“在我机器上能跑”的问题。
- Kubernetes (K8s):用于编排和管理大量容器。
- 国内云平台方案:
- 阿里云 ACK (容器服务 Kubernetes 版)
- 腾讯云 TKE
- 华为云 CCE
- 优势:
- 弹性伸缩:流量高峰自动增加 Pod 数量,低谷自动缩容,节省成本。
- 高可用:节点宕机后,Pod 自动在其他节点重建。
- CI/CD 友好:与 Jenkins、GitLab CI、ArgoCD 等工具无缝集成。
3. 免运维级:Serverless / 函数计算
适合事件驱动型、间歇性调用、或者不想关心底层服务器的场景。
- 典型产品:
- 阿里云 FC (Function Compute)
- 腾讯云 SCF
- AWS Lambda (国际项目常用)
- 特点:
- 按实际执行时间计费,无请求时费用为零。
- Spring Boot 需要适配 Serverless 框架(如使用 Spring Cloud Function),启动速度是个挑战(冷启动问题),但在 Java 17+ 和 GraalVM 支持下正在改善。
- 适合微服务中的边缘节点、定时任务、Webhook 回调等场景。
4. 传统企业级:Tomcat 独立部署 (逐渐减少)
虽然 Spring Boot 默认内嵌 Tomcat,但在一些老旧系统迁移或对 JVM 调优有极致要求的场景下,仍有人选择外置 Tomcat。
- 部署方式:将 Spring Boot 打包成 WAR 包,部署到独立的 Tomcat 实例中。
- 现状:不推荐新项目使用。内嵌 Tomcat 更简洁,配置更少,依赖管理更清晰。除非你有特殊的 Servlet 容器定制需求,否则优先选 JAR 包模式。
5. 高性能网关层:Nginx/OpenResty
严格来说这不是“运行 Spring Boot”的服务器,但它是必经之路。
- 作用:
- 反向XX:将外部请求转发给后端多个 Spring Boot 实例。
- 负载均衡:轮询、权重、IP Hash 等策略。
- SSL 终止:处理 HTTPS 证书,减轻后端压力。
- 静态资源缓存:图片、CSS、JS 由 Nginx 直接返回,不经过 JVM。
✅ 实际选型建议(基于经验)
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 个人项目/学习/小流量站 | 阿里云/腾讯云轻量应用服务器 + JAR 包 + Systemd | 成本低,操作简单,维护方便 |
| 初创公司/中型业务 | Docker + Docker Compose 或 单机 K8s | 便于版本迭代,环境一致性好 |
| 大型企业/高并发/微服务 | Kubernetes (ACK/TKE/CCE) + Service Mesh | 弹性强,可观测性完善,支持灰度发布 |
| 突发流量/批处理任务 | Serverless (FC/SCF) | 按需付费,无需预购资源,避免闲置浪费 |
| 混合架构 | K8s 为主 + Serverless 为辅 | 核心业务稳定运行在 K8s,非核心/异步任务用 Serverless |
🔧 关键注意事项
- JVM 调优:无论哪种部署方式,都要关注
-Xms和-Xmx设置。在容器环境中,建议使用-XX:+UseContainerSupport(Java 8u191+/11+ 默认开启),让 JVM 感知容器内存限制。 - 健康检查:确保 Spring Boot 暴露
/actuator/health端点,供负载均衡器或 K8s 进行存活探针(Liveness Probe)和就绪探针(Readiness Probe)检测。 - 日志收集:不要只依赖
console.log。在生产环境,务必接入 ELK(Elasticsearch, Logstash, Kibana)或 Loki + Grafana 体系,集中管理日志。 - 安全组/防火墙:国内云厂商默认关闭大部分端口,记得在控制台开放 80/443 和 SSH 端口,并最小化原则开放其他必要端口。
总结一句话:新手从 ECS + JAR 包起步,进阶走 Docker,成熟期上 K8s,特殊场景考虑 Serverless。 没有绝对最好的,只有最适合当前业务阶段和团队技术栈的。
云技术博客