在阿里云 ECS 上搭建 Spring Boot 微服务集群,核心不在于“把代码跑起来”,而在于高可用(High Availability)、弹性伸缩(Auto Scaling)以及运维自动化。如果仅仅是在几台 ECS 上手动部署 Jar 包,那叫“分布式单体”,不叫真正的云原生微服务集群。
以下是基于国内云计算最佳实践的生产级架构方案,分为基础环境准备、核心组件选型、部署架构设计和关键避坑指南四个部分。
一、 核心原则:解耦与托管
不要试图自己维护所有的中间件。在阿里云生态中,优先使用 PaaS 层服务替代自建 IaaS 层服务,以降低运维复杂度并提高稳定性。
- 计算层:ECS(或更推荐的 ACK 容器服务,但本题限定 ECS,故以 ECS 为主)
- 注册中心/配置中心:优先使用 Nacos(阿里开源,兼容性好),若预算充足且追求极致稳定,可考虑阿里云 MSE(微服务引擎)。
- 消息队列:RocketMQ 或 Kafka(自建或使用阿里云 MNS/RocketMQ 托管版)。
- 数据库:RDS MySQL / Redis(严禁在 ECS 上自建主从同步的 DB 用于生产核心业务)。
- 网关:Spring Cloud Gateway + Nginx 反向X_X。
二、 推荐架构拓扑图(逻辑视图)
[用户请求]
|
[VPC 内网 DNS / SLB 负载均衡] <--- 入口流量分发
|
[Web 节点组: Nginx + Spring Cloud Gateway] <--- 无状态,自动扩缩容
|
[应用节点组: Spring Boot Microservices] <--- 核心业务,注册到 Nacos
|
[中间件层]
├── [Nacos Server] (注册中心 & 配置中心) --> 建议部署在独立 ECS 或 MSE
├── [RDS MySQL] --> 阿里云托管
├── [Redis Cluster] --> 阿里云托管
└── [RocketMQ/Kafka] --> 阿里云托管或自建
三、 详细实施步骤
1. 网络规划(VPC 是关键)
- 创建 VPC:确保所有 ECS、RDS、Redis 都在同一个 VPC 内,通过内网通信,零流量费用且低延迟。
- 安全组策略:
- Web 节点:仅开放 80/443 端口给 SLB。
- 应用节点:仅开放内部业务端口给 Web 节点和安全组内的 Nacos。
- Nacos/RDS:仅对应用节点所在的安全组开放端口。绝对不要对 0.0.0.0/0 开放数据库和管理端口。
2. 基础设施初始化(IaC 思想)
不要手动点击控制台创建机器。使用 ROS(资源编排) 或 Terraform 定义你的集群模板。
- 定义一个“启动脚本”(User Data),包含 JDK 安装、Docker 安装(可选)、JVM 参数优化等。
- 示例 User Data 片段:
#!/bin/bash yum install -y java-11-openjdk-devel mkdir -p /opt/app # 下载 jar 包,这里建议使用镜像仓库而非每次上传 wget http://your-nexus/repository/maven-releases/com/example/service.jar nohup java -Xms512m -Xmx1024m -Dspring.profiles.active=prod -Dnacos.server.addr=${NACOS_INTERNAL_IP} -jar /opt/app/service.jar > /var/log/app.log 2>&1 &
3. 注册中心与配置中心部署(Nacos)
- 模式选择:单机模式用于开发,集群模式用于生产。
- 部署方式:
- 方案 A(自建):在 3 台高配 ECS 上部署 Nacos 集群,挂载本地盘或 OSS 作为持久化存储。需配合 Keepalived + VIP 实现 Nacos 自身的高可用。
- 方案 B(推荐):直接使用 阿里云 MSE 微服务引擎。它完全兼容 Nacos/Zookeeper,无需关心底层运维,支持一键扩容,自带治理功能。这是国内大厂的主流做法。
- 配置管理:将
application.yml中的敏感信息(密码、密钥)放入 Nacos Config 或阿里云 KMS(密钥管理服务),禁止硬编码在 Jar 包或 Git 中。
4. 应用服务部署(Spring Boot)
- 无状态设计:确保你的 Spring Boot 应用是无状态的。Session 必须存入 Redis,而不是本地内存。
- 健康检查:配置
/actuator/health端点,供 SLB 进行后端服务器健康检查。 - 日志收集:不要在 ECS 上轮询查看日志文件。集成 Logtail(阿里云 SLS 的采集插件),将日志实时推送到阿里云 SLS(日志服务),便于集中检索和分析。
5. 负载均衡与流量入口
- SLB(传统型负载均衡):
- 监听器配置 TCP 或 HTTP 协议。
- 后端服务器组添加所有 Web 节点和应用节点的 IP。
- 开启会话保持(如需)。
- 配置健康检查路径为
/actuator/health,超时时间设为 3s,间隔 5s。
- DNS 解析:域名指向 SLB 的公网 IP。
6. 弹性伸缩(ESS)—— 集群的灵魂
- 创建伸缩组,关联上述的应用节点安全组和启动配置。
- 设置最小实例数(如 2)、最大实例数(如 10)。
- 设置监控指标触发策略:当 CPU 使用率 > 70% 持续 5 分钟,增加 1 个实例;< 30% 持续 10 分钟,减少 1 个实例。
- 注意:新加入的 ECS 实例必须能自动从 Nacos 注册自身,并从 RDS 读取最新配置。这要求你的应用启动时主动连接 Nacos,且 Nacos 客户端版本与服务器版本兼容。
四、 关键避坑与优化建议
-
JVM 调优与资源限制:
- ECS 实例规格不同,CPU 核数和内存比例不同。务必根据实际规格调整
-Xms和-Xmx。 - 如果使用 Docker 部署,务必设置
memory limit,防止单个 Pod 拖垮宿主机。
- ECS 实例规格不同,CPU 核数和内存比例不同。务必根据实际规格调整
-
时钟同步:
- 微服务严重依赖时间戳(Token、分布式锁、链路追踪)。确保所有 ECS 实例启用阿里云 NTP 服务,避免时间偏差导致雪崩或数据不一致。
-
灰度发布与滚动更新:
- 利用 ESS 的“实例替换”功能或结合 CI/CD 流水线(如 Jenkins + GitLab)。
- 流程:停止旧实例 -> 拉取新镜像/Jar -> 启动新实例 -> 等待健康检查通过 -> 从 SLB 后端移除旧实例。
- 严禁一次性重启所有节点。
-
安全性合规:
- SSH 登录:禁用密码登录,仅允许密钥对登录。
- 漏洞扫描:定期使用阿里云安骑士(云安全中心)扫描 ECS 系统漏洞。
- WAF:在 SLB 前接入阿里云 WAF,防御 CC 攻击和 SQL 注入。
-
备份与灾难恢复:
- RDS 开启自动备份。
- 对于非托管的 Nacos 数据,定期快照 ECS 系统盘和数据盘。
- 制定应急预案:当某个可用区(Zone)故障时,如何快速切换到其他可用区的 ECS。
五、 总结:何时该升级?
如果你发现以下情况,说明纯 ECS 方案已触及瓶颈,应考虑迁移至 ACK(容器服务 Kubernetes 版):
- 需要秒级弹性伸缩。
- 服务数量超过 50 个,配置管理混乱。
- 需要复杂的灰度发布、流量染色、熔断降级等高级治理能力。
- 运维团队希望专注于业务代码而非服务器维护。
但在当前阶段,按照上述 VPC + SLB + Nacos/MSE + ESS + RDS 的方案,已经能够支撑绝大多数中小型企业的 Spring Boot 微服务生产需求,具备高可用、易扩展、低成本的优势。
CLOUD云枢