Featured image of post Spring Cloud Alibaba 整体架构与 7 大分布式问题

Spring Cloud Alibaba 整体架构与 7 大分布式问题

Spring Cloud vs Spring Cloud Alibaba 区别,SCA 16 大核心组件(Nacos/Sentinel/Seata/SkyWalking/xxl-job 等),服务器集群后必解的 7 大分布式问题(锁/ID/Session/事务/任务/日志/配置)

本文写于 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 服务治理层

#组件功能替代关系
1Nacos服务注册 + 发现替代 Eureka + Consul
2Nacos Config统一配置中心替代 Spring Cloud Config
3Spring Cloud Gateway路由网关替代 Zuul
4OpenFeign分布式 HTTP 调用替代 Ribbon + RestTemplate
5Sentinel熔断 / 降级 / 限流替代 Hystrix
6Spring Boot Admin服务监控自研方案

2.2 数据 & 存储层

#组件功能替代关系
7MinIO / 阿里 OSS分布式文件自研 FS
8RocketMQ / RabbitMQ消息中间件替代 ActiveMQ
9Seata分布式事务替代 TCC 自研

2.3 平台 & 运维层

#组件功能
10xxl-job分布式任务调度
11SkyWalking链路跟踪(APM)
12ELK + Kafka分布式日志收集
13JWT + Shiro统一权限控制
14CAS / sa-token单点登录
15docker-compose / K8s / Jenkins部署 & 流水线
16Sentinel(路由限流模式)入口限流

三、技术架构图

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
                            ┌──────────────────┐
                            │  Nginx / SLB     │
                            │  (入口 LB)        │
                            └─────────┬────────┘
                            ┌─────────▼────────┐
                            │  Spring Cloud    │
                            │  Gateway 网关层  │
                            │  (路由/限流/鉴权) │
                            └─────────┬────────┘
            ┌─────────────────────────┼─────────────────────────┐
            │                         │                         │
     ┌──────▼──────┐           ┌──────▼──────┐           ┌──────▼──────┐
     │  用户服务    │           │  订单服务    │           │  商品服务    │
     │  (集群)      │           │  (集群)      │           │  (集群)      │
     └──────┬──────┘           └──────┬──────┘           └──────┬──────┘
            │                         │                         │
            └─────────────────────────┼─────────────────────────┘
        ┌────────────────┬────────────┼────────────┬────────────────┐
        │                │            │            │                │
   ┌────▼────┐     ┌─────▼────┐ ┌─────▼────┐ ┌────▼────┐    ┌─────▼────┐
   │  Nacos  │     │  Redis   │ │   MySQL  │ │  MQ     │    │ Seata    │
   │ 注册/配置│     │  缓存    │ │  存储    │ │ 消息    │    │ 分布式事务│
   └─────────┘     └──────────┘ └──────────┘ └─────────┘    └──────────┘

四、服务器集群后产生的 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:基于全局锁 + 快照 + 回滚日志——每个分支事务:

  1. 解析 SQL → 生成前镜像 + 后镜像 + 回滚日志
  2. 提交本地事务,释放本地锁
  3. 申请全局锁(Seata Server 协调)
  4. 根据全局决议,异步删除回滚日志(提交)或回滚(用后镜像恢复前镜像)

无业务侵入,业务代码只需加 @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
RPCOpenFeign声明式 + Ribbon 集成
熔断限流Sentinel规则丰富 + 控制台
分布式事务Seata AT无业务侵入
分布式锁Redisson完整封装
分布式任务xxl-job成熟 + 可视化
消息RocketMQ事务消息 + 顺序消息
日志ELK经典方案
链路跟踪SkyWalking国产 + 字节码增强
配置中心Nacos Config一体化

七、小结

  • Spring Cloud Alibaba = Spring Cloud 中国化继任者
  • 16 大核心组件覆盖服务治理 / 数据存储 / 平台运维全链路
  • 7 大分布式问题(锁/ID/Session/事务/任务/日志/配置)是集群化的必修课
  • 选型原则:先选生态最完整的方案(Nacos + Sentinel + Seata 三件套),再考虑业务侵入度
使用 Hugo 构建
主题 StackJimmy 设计