本文写于 2020 年 9 月——Spring Cloud Alibaba 在 2018 年诞生,2019 年进入 Apache 孵化,2020 年成为事实上的国内微服务标准。
一、Spring Cloud vs Spring Cloud Alibaba
1.1 Spring Cloud 是什么
Spring Cloud 是一套分布式微服务解决方案。区别于 Dubbo(只是一个远程 RPC 框架),Spring Cloud 是一整套生态,包括:
- 服务注册 / 服务调用
- 负载均衡
- 服务网关
- 服务降级 / 熔断
- 分布式配置管理
- 消息总线
- 链路跟踪
- ……
Spring Cloud 自成生态。
1.2 为什么还需要 Spring Cloud Alibaba
Spring Cloud 进入维护阶段——版本迭代非常快,每发布一个 release 后又会紧接着发布下一个版本,积累了一系列 bug,使用过程中问题频出。
进入维护模式意味着不会再有新的组件技术出现,只是在原来的基础上修修补补,处理一些 merge 和 PR 请求。
剧本:几年前 Dubbo 被 Spring Cloud 取代。现在 Spring Cloud 停更,谁来补位?
阿里和 Spring 社区都是巨头,巨头之间战斗要考虑很多,于是想到了合作:
- Spring 社区负责 Spring 基础
- 阿里负责新组件 + 推广阿里云 + 商业软件
- 双赢 → Spring Cloud Alibaba 诞生
1.3 一句话总结
Spring Cloud Alibaba = Spring Cloud 的中国化继任者,由阿里主导持续更新。
二、Spring Cloud Alibaba 16 大核心组件
按应用层从外到内:
2.1 服务治理层
| # | 组件 | 功能 | 替代关系 |
|---|---|---|---|
| 1 | Nacos | 服务注册 + 发现 | 替代 Eureka + Consul |
| 2 | Nacos Config | 统一配置中心 | 替代 Spring Cloud Config |
| 3 | Spring Cloud Gateway | 路由网关 | 替代 Zuul |
| 4 | OpenFeign | 分布式 HTTP 调用 | 替代 Ribbon + RestTemplate |
| 5 | Sentinel | 熔断 / 降级 / 限流 | 替代 Hystrix |
| 6 | Spring Boot Admin | 服务监控 | 自研方案 |
2.2 数据 & 存储层
| # | 组件 | 功能 | 替代关系 |
|---|---|---|---|
| 7 | MinIO / 阿里 OSS | 分布式文件 | 自研 FS |
| 8 | RocketMQ / RabbitMQ | 消息中间件 | 替代 ActiveMQ |
| 9 | Seata | 分布式事务 | 替代 TCC 自研 |
2.3 平台 & 运维层
| # | 组件 | 功能 |
|---|---|---|
| 10 | xxl-job | 分布式任务调度 |
| 11 | SkyWalking | 链路跟踪(APM) |
| 12 | ELK + Kafka | 分布式日志收集 |
| 13 | JWT + Shiro | 统一权限控制 |
| 14 | CAS / sa-token | 单点登录 |
| 15 | docker-compose / K8s / Jenkins | 部署 & 流水线 |
| 16 | Sentinel(路由限流模式) | 入口限流 |
三、技术架构图
| |
四、服务器集群后产生的 7 大问题
单节点应用升级到集群后,本地假设全部失效,必须解决以下 7 大分布式问题:
4.1 分布式锁
问题:多节点同时操作同一资源,需要互斥。
方案:
- Redis SETNX + Lua:最常用,性能高
- Redisson:Java 客户端封装,可重入锁 / 公平锁 / 读写锁
- Zookeeper 顺序节点:强一致,性能略低
- MySQL 行锁 / 表锁:能不用就不用
4.2 分布式全局 ID
问题:单库自增 ID 在分库分表后会重复。
方案:
- 雪花算法(Snowflake):Twitter 开源,64 位(1 符号 + 41 时间戳 + 10 机器 + 12 序列号)
- UUID:简单但 128 位太长,无序
- 美团 Leaf:号段模式 / Snowflake 增强版
- 百度 UidGenerator:基于 Snowflake 优化
4.3 分布式 Session 一致性
问题:用户登录后 Session 存在单节点,下次请求被路由到另一节点就丢失登录态。
方案:
- Session 复制:Tomcat 自带,性能差
- 客户端存储:JWT(无状态,Token 放在 Header)
- 统一 Session 存储:Spring Session + Redis(推荐)
- Session 粘性(IP Hash):Nginx
ip_hash,但扩缩容困难
4.4 分布式事务
问题:跨服务调用,本地事务无法保证全局一致。
方案:
- 2PC / 3PC:强一致但性能差
- TCC(Try-Confirm-Cancel):业务侵入大,性能好
- 本地消息表:最终一致,简单
- RocketMQ 事务消息:最终一致,推荐
- Seata AT 模式:无业务侵入,最常用
4.5 分布式任务调度
问题:多节点都跑定时任务会重复执行。
方案:
- xxl-job:大众点评开源,业界事实标准
- Elastic-Job:当当网开源,分片支持好
- Quartz Cluster:老牌方案,配置复杂
- Spring Task + ShedLock:基于数据库锁的轻量方案
4.6 分布式日志收集
问题:日志散落在几十台机器上,排查故障要逐台登录。
方案:
- ELK(Elasticsearch + Logstash + Kibana):经典
- EFK(Fluentd):K8s 时代更轻量
- Loki + Promtail + Grafana:标签索引,比 ES 便宜
- SkyWalking / Pinpoint:APM 工具自带 traceId 串联
4.7 分布式配置中心
问题:配置散落在每个服务的 application.yml 里,改一个配置要重启几十个服务。
方案:
- Nacos Config:自带,推荐
- Apollo:携程开源,功能强大
- Spring Cloud Config:老牌,依赖 Git
- Consul KV:也行
五、面试常问
Q:Spring Cloud 和 Spring Cloud Alibaba 怎么选? A:
- 新项目:直接 Spring Cloud Alibaba
- 老 Spring Cloud Netflix 项目:保留但不再升级
- 国内大厂项目:Spring Cloud Alibaba + 自研
- 国际化项目:Spring Cloud + Kubernetes(云原生)
Q:Seata AT 模式的原理是什么? A:基于全局锁 + 快照 + 回滚日志——每个分支事务:
- 解析 SQL → 生成前镜像 + 后镜像 + 回滚日志
- 提交本地事务,释放本地锁
- 申请全局锁(Seata Server 协调)
- 根据全局决议,异步删除回滚日志(提交)或回滚(用后镜像恢复前镜像)
无业务侵入,业务代码只需加 @GlobalTransactional 注解。
Q:Nacos 和 Eureka 有什么区别? A:Nacos 同时支持 AP(Distro)和 CP(Raft),Eureka 只支持 AP。Nacos 自带配置中心,Eureka 纯注册中心。Nacos 是更好的选择。
Q:Sentinel 和 Hystrix 有什么区别? A:Hystrix 已停更,Sentinel 持续维护。Sentinel 控制台更强大(实时监控 / 簇点链路 / 规则动态推送),规则支持流控 / 降级 / 热点 / 系统 / 授权 5 大类。
六、整体技术选型清单(中小厂推荐)
| 类别 | 推荐组件 | 理由 |
|---|---|---|
| 注册中心 | Nacos | 一体化(注册 + 配置) |
| 网关 | Spring Cloud Gateway | 响应式 + Netty |
| RPC | OpenFeign | 声明式 + Ribbon 集成 |
| 熔断限流 | Sentinel | 规则丰富 + 控制台 |
| 分布式事务 | Seata AT | 无业务侵入 |
| 分布式锁 | Redisson | 完整封装 |
| 分布式任务 | xxl-job | 成熟 + 可视化 |
| 消息 | RocketMQ | 事务消息 + 顺序消息 |
| 日志 | ELK | 经典方案 |
| 链路跟踪 | SkyWalking | 国产 + 字节码增强 |
| 配置中心 | Nacos Config | 一体化 |
七、小结
- Spring Cloud Alibaba = Spring Cloud 中国化继任者
- 16 大核心组件覆盖服务治理 / 数据存储 / 平台运维全链路
- 7 大分布式问题(锁/ID/Session/事务/任务/日志/配置)是集群化的必修课
- 选型原则:先选生态最完整的方案(Nacos + Sentinel + Seata 三件套),再考虑业务侵入度
