在阿里云 ECS 上搭建 Spring Boot 微服务集群是一个典型的云原生架构实践。为了构建高可用、可扩展且易于维护的集群,建议采用分层解耦的设计思路。
以下是完整的搭建指南,涵盖架构设计、基础设施配置、应用部署和运维监控。
一、整体架构设计(推荐)
不要将所有服务都部署在一台机器上。建议采用以下分层架构:
[客户端] --> [SLB 负载均衡] --> [ECS 集群 (Web层/API网关)]
|
v
[内部网络通信]
|
v
[ECS 集群 (业务微服务: User, Order, Product...)]
|
v
[RDS MySQL / Redis / RocketMQ / Nacos/Eureka]
核心组件说明:
- SLB (Server Load Balancer):流量入口,分发请求到后端 ECS。
- Nacos/Eureka:服务注册与发现中心(Spring Cloud Alibaba 推荐 Nacos)。
- RDS MySQL:关系型数据库(主从复制,高可用)。
- Redis:缓存中间件。
- RocketMQ/Kafka:消息队列(解耦、削峰填谷)。
- ECS 集群:运行各个微服务实例,通过自动伸缩组(ASG)实现弹性扩容。
二、前期准备
1. 购买阿里云资源
| 资源类型 | 推荐规格/数量 | 说明 |
|---|---|---|
| VPC 网络 | 1个 | 确保所有资源在同一 VPC 内,使用私网通信,安全高效 |
| SLB | 1个 | 公网 IP,监听 80/443 端口 |
| ECS 服务器 | 至少 3~5 台 | 根据微服务数量分配,建议同地域同可用区 |
| RDS MySQL | 1个高可用版 | 主备架构,自动故障切换 |
| Redis | 1个集群版或标准版 | 用于缓存和会话共享 |
| Nacos | 独立 ECS 或容器化部署 | 建议单独一台高性能 ECS |
✅ 关键建议:所有 ECS 实例必须加入同一个 VPC 和 交换机,以便通过内网 IP 互相访问。
三、环境搭建步骤
步骤 1:配置网络与安全组
-
创建 VPC 和交换机
- 登录阿里云控制台 → VPC → 创建专有网络。
- 创建交换机(建议至少两个可用区,实现多可用区容灾)。
-
配置安全组规则
- SLB 安全组:开放 80、443 端口给公网。
- ECS 安全组:
- 仅允许来自 SLB 的内网 IP 访问业务端口(如 8080)。
- 允许 SSH(22)从你的办公 IP 访问。
- 微服务之间如需直连(如 Feign),需放行相应端口。
- Nacos/DB 安全组:仅允许应用 ECS 内网 IP 访问,禁止公网暴露!
步骤 2:部署中间件
1. 安装 Nacos(服务注册中心)
- 在独立 ECS 上安装 Nacos Server。
- 修改
application.properties,设置数据库连接指向 RDS MySQL(持久化配置)。 - 启动 Nacos,默认端口 8848。
- 配置开机自启。
2. 配置 RDS MySQL
- 创建数据库和用户,授权给应用 ECS 内网 IP 访问。
- 开启白名单,添加所有应用 ECS 的内网 IP。
3. 配置 Redis
- 创建 Redis 实例,获取内网地址和端口。
- 设置密码,配置白名单。
步骤 3:打包 Spring Boot 应用
每个微服务项目需进行标准化打包:
-
Docker 化(强烈推荐)
FROM openjdk:17-jdk-slim COPY target/*.jar app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]构建镜像并推送到 阿里云容器镜像服务(ACR)。
-
配置外部化参数
- 使用
application.yml中的占位符,或通过环境变量注入。 - 示例:
spring: cloud: nacos: discovery: server-addr: ${NACOS_ADDR} # 内网IP:8848 config: server-addr: ${NACOS_ADDR} datasource: url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/db_name?useSSL=false username: ${MYSQL_USER} password: ${MYSQL_PASSWORD}
- 使用
步骤 4:部署微服务到 ECS 集群
有两种方式:
方式 A:手动部署(适合小型项目)
- 在每台 ECS 上安装 Docker 和 JDK。
- 拉取镜像并启动容器:
docker run -d --name user-service -e NACOS_ADDR=192.168.1.100:8848 -e MYSQL_HOST=rds-xxx.mysql.rds.aliyuncs.com -p 8081:8081 myregistry/user-service:v1 - 将多个实例注册到 Nacos。
方式 B:使用 ACK(Kubernetes)+ ASG(自动化运维)
- 创建 容器服务 ACK 集群。
- 使用 Helm 或 Kustomize 部署微服务 YAML。
- 配置 HPA(水平Pod自动伸缩),根据 CPU/内存自动扩缩容。
- 结合 SLB Ingress Controller 暴露服务。
💡 对于初学者,建议先用方式 A + SLB 反向X_X;进阶后迁移至 ACK。
步骤 5:配置 SLB 负载均衡
- 创建 SLB 实例(TCP 模式或 HTTP 模式)。
- 添加后端服务器组,选中所有运行微服务的 ECS 实例。
- 配置健康检查:
- 路径:
/actuator/health(Spring Boot Actuator 端点) - 协议:HTTP/TCP
- 超时时间:3秒
- 路径:
- 绑定公网 IP,用户通过
http://<slb-ip>/api/user/...访问。
四、高可用与弹性扩展
1. 多可用区部署
- 将 ECS 实例分散在不同可用区(如 Zone A 和 Zone B)。
- SLB 支持跨可用区调度,单可用区故障不影响整体服务。
2. 使用弹性伸缩组(Auto Scaling)
- 创建伸缩组,关联 SLB 后端服务器。
- 设置最小实例数(如 2)、最大实例数(如 10)。
- 配置告警策略:当 CPU > 70% 持续 5 分钟,自动增加实例。
3. 数据备份与恢复
- RDS 开启自动备份(保留 7~30 天)。
- Redis 启用持久化(AOF + RDB)。
- 定期快照 ECS 系统盘。
五、监控与日志
1. 应用监控
- 集成 Spring Boot Admin 或 Micrometer + Prometheus + Grafana。
- 监控指标:QPS、响应时间、错误率、JVM 内存。
2. 链路追踪
- 使用 Sleuth + Zipkin 或 SkyWalking,追踪跨服务调用链。
3. 日志收集
- 使用 Filebeat 采集 ECS 上的日志文件。
- 发送到 SLS(日志服务),便于检索和分析。
六、常见问题与最佳实践
| 问题 | 解决方案 |
|---|---|
| 服务间调用延迟高 | 确保所有服务在同一 VPC 内,使用内网 IP 通信 |
| Nacos 单点故障 | 部署 Nacos 集群(至少 3 节点),使用 MySQL 持久化配置 |
| 数据库连接池耗尽 | 调整 HikariCP 配置,增加最大连接数,使用连接池监控 |
| 启动速度慢 | 使用懒加载、异步初始化、优化依赖树 |
| 配置管理混乱 | 使用 Nacos Config 统一管理各环境配置(dev/test/prod) |
七、总结:快速启动清单
- ✅ 创建 VPC + 交换机(多可用区)
- ✅ 购买 RDS MySQL、Redis、Nacos(独立 ECS)
- ✅ 配置安全组,限制公网访问
- ✅ 打包 Spring Boot 应用为 Docker 镜像
- ✅ 在多台 ECS 上部署服务实例,注册到 Nacos
- ✅ 创建 SLB,绑定后端 ECS,配置健康检查
- ✅ 接入 SLS 日志、Prometheus 监控
- ✅ (可选)配置 Auto Scaling 实现弹性扩容
如果你希望进一步简化运维,可以考虑直接使用 阿里云函数计算 FC 或 Serverless 应用引擎 SAE,它们能自动处理服务器管理、负载均衡和弹性伸缩,更适合云原生微服务架构。
云服务器