Spring Cloud Alibaba相关知识总结

一、概述

Spring Cloud Alibaba 是国产微服务一站式解决方案,兼容 Spring Cloud 标准,替代了原生 Netflix 套件(Eureka/Ribbon/Hystrix 停更),是国内生产环境主流方案。

核心生态组件

  • Nacos:服务注册发现 + 配置中心(双核心)
  • Sentinel:流量控制、熔断降级、系统防护
  • Seata:分布式事务解决方案
  • RocketMQ:分布式消息队列(异步解耦、最终一致性)
  • Gateway:API 网关(Spring Cloud 官方,Alibaba 生态标配)
  • Dubbo:高性能 RPC 调用(可替代 OpenFeign)

生产标配:Spring Cloud Alibaba + Nacos + Sentinel + Seata + Gateway

二、服务注册 Nacos

1、 核心作用

Spring Cloud Alibaba 一站式服务注册发现 + 配置中心,替代 Eureka/Config/Bus,是国内微服务标配。

2、核心功能
  • 服务注册 / 发现:替代 Eureka、Consul
  • 配置中心:替代 Config + Bus,支持动态刷新、灰度发布
  • 分布式配置管理:命名空间、分组、数据隔离

3、关键原理

(1) CAP 理论支持
  • 默认 AP 模型:保证服务可用性,适合服务发现
  • 可切换 CP 模式:通过集群 Raft 保证一致性,适合配置中心 / CP 场景
(2) 服务注册与心跳机制
  • 客户端5s 发送心跳
  • 服务端15s 未收到心跳标记不健康
  • 30s 未收到心跳剔除实例
  • 支持主动下线(优雅停机),实时性远优于 Eureka
(3) 服务发现机制
  • 客户端本地缓存服务列表,Nacos 宕机不影响运行
  • 基于长轮询推送服务变更,实时性高
  • 支持权重、集群、健康状态筛选
(4) 集群原理
  • 至少 3 节点,Raft 协议选举 Leader
  • 配置数据持久化到 MySQL,服务数据内存 + 磁盘
  • 域名 / VIP 统一接入,保证高可用

4、Nacos VS Eureka

(1) 功能定位差异(最关键)
  • Eureka:只干服务注册发现一件事。
  • Nacos注册中心 + 配置中心一体化 。生产环境不用再搭 Config + Bus + RabbitMQ,减少组件、降低运维成本
(2) CAP 灵活性差异
  • Eureka:只能做 AP(高可用),无法保证一致性。
  • Nacos
    • 服务发现默认 AP:保证服务可用,不雪崩。
    • 配置中心 / CP 服务:切换为 CP(Raft 强一致),保证配置不丢、不乱。
(3) 服务上下线实时性
  • Eureka
    • 客户端30s 拉取一次注册表
    • 服务下线延迟90s+,容易引发调用失败
  • Nacos
    • 主动下线 + 长轮询推送
    • 服务上下线秒级感知,实时性极强
(4) 为什么生产环境抛弃 Eureka 用 Nacos?
  • Eureka 2.0 闭源,1.0 停更,无官方维护,风险极高。
  • Nacos 一套组件搞定注册 + 配置,架构更简单。
  • Nacos 集群部署比 Eureka 简单太多,无需复杂配置。
  • Nacos 支持权重路由、动态配置、环境隔离、灰度发布,Eureka 做不到。
  • 国内云原生、微服务生态全面拥抱 Nacos

二、 高可用防护 Sentinel

1、核心作用

Sentinel是微服务高可用防护组件 ,替代停更的 Hystrix,实现:限流、熔断降级、系统保护、热点参数限流,是 Spring Cloud Alibaba 标配高可用方案。

一句话总结:防止服务雪崩、保护接口不被打垮、保证核心服务可用。

2、核心功能
  • 流量控制(限流):QPS / 线程数限流、预热、排队、匀速排队
  • 熔断降级:慢调用、异常比例、异常数熔断
  • 热点参数限流:针对参数(用户 ID / 商品 ID)单独限流
  • 系统自适应保护:Load/CPU 高了自动限流
  • 授权规则:黑白名单控制
3、底层核心原理
(1) 滑动时间窗口(高并发高性能关键)
  • 无侵入式埋点
  • 滑动窗口统计请求(高性能)
  • 支持持久化规则(Nacos/Push 模式,生产必须用)

滑动时间窗口解决固定窗口临界突刺问题 ,实现高精度、高性能的请求统计,保证限流准确。

(2) 限流算法
  • 计数器法:简单 QPS 限制
  • 漏桶算法:匀速排队(削峰填谷)
  • 令牌桶算法:预热限流(应对突发流量)
(3) 熔断降级策略

Sentinel 是慢启动 + 慢恢复,比 Hystrix 更平滑:

  • 慢调用比例:响应超时 > 阈值 → 熔断
  • 异常比例:错误率过高 → 熔断
  • 异常数:错误次数过多 → 熔断
  • 熔断后放半个探测请求,恢复后慢慢放开

三、分布式事务 Seata

1、核心定位

解决 微服务跨库 / 跨服务事务一致性问题,保证最终一致性 / 强一致性。

2、三大角色

  • TC(事务协调器):独立服务,管理全局事务,指挥提交 / 回滚
  • TM(事务管理器):业务服务中的发起方,开启 / 提交 / 回滚全局事务
  • RM(资源管理器):管理每个事务的本地事务,生成 undo_log 回滚日志,执行分支提交 / 回滚

3、三大模式(重点)

(1) AT 模式(最常用,无侵入)

适用场景:普通微服务、单库分表、同类型数据库(MySQL/MySQL)

核心原理:

  • 无代码入侵,基于本地事务 + undo_log
  • 二阶段提交:一阶段执行提交,二阶段确认 / 回滚

优点:简单、接入成本极低

缺点:必须同类型数据库 ;有行锁,高并发热点数据有性能损耗

(2) TCC 模式(高性能,侵入强)

适用场景:高并发、核心支付、库存、不同数据库

核心原理:

  • 手动写三个方法:Try + Confirm + Cancel
  • Try:资源预留 / 检查
  • Confirm:确认执行
  • Cancel:取消回滚

优点:性能极高、无锁、跨库跨语言

缺点:代码入侵大、开发量高、要保证幂等

(3) SAGA 模式(长事务,业务编排)

适用场景:流程长、跨第三方服务、不能回滚的业务

核心

  • 一阶段提交
  • 二阶段通过补偿逻辑回滚

优点:适合长事务

缺点:编程复杂、一致性弱

4、生产要点

  • AT 模式不能跨不同数据库类型
  • 必须建 undo_log
  • 高并发下用最终一致性(RocketMQ) 替代 Seata 提升性能

四、消息队列 RocketMQ

阿里开源的分布式消息队列 ,微服务架构标配,解决:异步解耦、流量削峰、最终一致性、广播通知

在 SCA 中:替代 Seata 做高并发最终一致性分布式事务

1、核心架构

(1) NameServer(注册中心)
  • 轻量级注册中心,管理 Broker 集群
  • 无集群,单点部署,客户端随机连接
(2) Broker(消息服务器)
  • 实际存储消息,主从架构(Master-Slave)
  • 支持异步刷盘、同步刷盘
(3) Producer(生产者)
  • 发送消息,支持负载均衡、故障延迟
(4) Consumer(消费者)
  • 消费消息,支持集群 / 广播两种模式

2、核心特性

(1) 两种消费模式
  • 集群模式(默认) :一条消息只被一个消费者消费,用于负载均衡
  • 广播模式 :一条消息所有消费者都消费,用于通知刷新
(2) 三种消息类型
  • 普通消息:异步解耦、削峰
  • 顺序消息 :保证消息严格按顺序消费(如订单状态)
  • 事务消息分布式事务最终一致性(面试核心)
(3) 延迟消息(生产神器)
  • 支持 18 个固定延迟等级
  • 场景:订单超时未支付自动取消
  • 不用死循环轮询数据库
(4) 死信队列(DLQ)
  • 消费失败 16 次后进入死信队列
  • 人工排查处理,防止消息丢失

3、生产高可用部署方案

  • NameServer:至少 2 节点,无状态
  • Broker2 主 2 从,异步刷盘 + 异步复制
  • 磁盘:SSD,消息量大扩容
  • 消息可靠性:同步刷盘 + 同步双写(金融级)
  • 幂等性:消费端必须实现(防重复消费)

4、核心问题

(1) 消息重复消费

一条消息消费多次,导致数据重复 / 错误。

出现该现象的原因是:

  • 消费者超时 / 宕机未 ACK
  • Broker 重发
  • 重试机制触发

解决方案是:必须做幂等性校验

  • 全局唯一 ID + MySQL 去重表
  • Redis 唯一ID去重
  • 状态机判断
  • 数据库唯一索引
  • 分布式锁
(2) 消息丢失

消息丢失即生产者发了消息,Broker 没收到 / 消费者没收到,数据丢失。

丢失的场景有:

  • 生产者 → Broker:网络闪断丢失
  • Broker 自身:宕机、未刷盘丢失
  • Broker → 消费者:未消费先 ACK 丢失

解决方案如下:

  • 生产者:开启事务消息 / 同步发送 + 重试
  • Broker:开启同步刷盘 / 主从同步
  • 消费者:业务执行成功后再手动 ACK
(3) 消息堆积

消息堆积即消息堆积几十万、几百万,消费跟不上。

出现该现象的原因是:

  • 消费者线程太少
  • 消费者内部慢调用(SQL / 接口超时)
  • 消费者死锁、异常
  • 生产流量暴增

解决方案如下:

  • 提高消费者线程数
  • 扩容消费者实例(超过队列数无效)
  • 优化消费逻辑(异步化、慢 SQL 优化)
  • 跳过非核心消息(临时抢救)
  • 排查死锁 / 异常
(4) 消息顺序错乱

消息顺序错乱即需要顺序执行的消息(订单创建→支付→发货)乱序

出现该现象的原因是:

  • 多个队列
  • 多个消费者并发消费

解决方案如下:

  • 将同一业务 ID(订单 ID)hash 到同一个队列
  • 一个队列只配一个消费者线程
  • 使用 RocketMQ 顺序消息

(5) 消费者内部慢调用

消费逻辑本身执行太慢,导致消费速度远低于生产速度,引发消息堆积。典型慢调用:

  • 慢 SQL(未加索引、连表查询)
  • 同步调用第三方 HTTP 接口
  • 调用其他微服务接口超时
  • 写文件、导出报表等重操作

优化思路是能异步就异步,能缓存就缓存,能批处理就批处理,能剥离就剥离

具体优化方案如下:

① 同步逻辑 改为 异步化(最有效)

非核心、非阻塞 的逻辑丢到线程池执行,不阻塞主线程消费

java 复制代码
// 坏:同步执行,慢
consumer();
thirdPartyApi();  // 慢接口
saveLog();       // 慢日志

// 好:异步执行
consumer();
executor.submit(() -> thirdPartyApi()); // 丢线程池
executor.submit(() -> saveLog());

② 慢 SQL 优化(最常见)------ 消费逻辑禁止任何慢查询

  • 加索引
  • 禁止连表查询
  • 禁止大事务
  • 查询结果丢 Redis 缓存

③ 批量消费(BatchListener)

如果业务允许,批量拉取、批量处理

  • 批量插入 DB
  • 批量调用接口

④ 剥离第三方强依赖

不要在消费时同步调用第三方接口

  • 第三方接口也发 MQ 异步调用
  • 或者先存库,后台任务慢慢执行

调整消费线程数(治标,但必须配)

java 复制代码
rocketmq:
  consumer:
    thread-number: 20~64  # 根据CPU核数调整

五、高性能RPC框架Dubbo

1、核心定位

高性能 Java RPC 框架 ,面向微服务的服务治理 + 远程调用方案。

  • 对比 Feign:Dubbo = RPC 长连接、高性能、低延迟
  • 对比 HTTP:Dubbo 采用 TCP + 序列化,性能提升 5-10 倍
  • 在 SCA 中:可完全替代 OpenFeign

一句话:微服务高性能调用首选 Dubbo

2、核心运行流程

  • ① Provider 启动,向 Registry 注册服务
  • ② Consumer 启动,订阅服务列表
  • Registry 推送服务地址到 Consumer
  • Consumer 基于负载均衡 直接调用 Provider(点对点直连
  • 调用数据上报 Monitor

3、核心原理(长连接 + Netty + 二进制序列化)

(1) 为什么性能远超 Feign/HTTP?
  • TCP 长连接,避免三次握手开销
  • 二进制序列化,数据体积小
  • NIO 异步非阻塞,Netty 实现
  • 服务端直接暴露接口,无需解析 HTTP
(2) 动态代理
  • Consumer 调用接口时,Dubbo 生成动态代理
  • 封装请求数据 → 网络传输 → Provider 执行 → 返回结果
(3) 服务暴露与引用
  • Provider:把接口方法暴露为网络服务
  • Consumer:把远程接口伪装成本地接口

4、核心特性

(1) 支持的注册中心:Nacos(生产首选,SCA 标配)、Zookeeper、Redis

(2) 传输协议:Dubbo 协议(默认,TCP 长连接,高性能)、HTTP 协议、gRPC 协议

(3) 负载均衡策略

  • RandomLoadBalance:随机(默认)
  • RoundRobinLoadBalance:轮询
  • LeastActiveLoadBalance:最少活跃调用(最优)
  • ConsistentHashLoadBalance:一致性哈希(同参数路由同一服务)

(4) 集群容错策略

  • Failover :失败自动切换,重试其他服务器(默认,读接口用
  • Failfast :快速失败,只发一次(写接口用
  • Failsafe:安全失败,忽略异常
  • Failback:失败重试
  • Forking:并行调用多个服务器
相关推荐
NE_STOP2 小时前
SpringCloud微服务进阶-Nacos更加全能的注册中心
spring
jessecyj2 小时前
maven导入spring框架
数据库·spring·maven
小江的记录本2 小时前
【Redis】Redis常用命令速查表(完整版)
java·前端·数据库·redis·后端·spring·缓存
卓怡学长2 小时前
m281基于SSM框架的电脑测评系统
java·数据库·spring·tomcat·maven·intellij-idea
Densen20143 小时前
企业H5站点升级PWA (二)
java·后端·spring
marsh02063 小时前
16 openclaw与数据库集成:ORM使用与性能优化
数据库·spring·ai·性能优化·编程·技术
进击的野人3 小时前
从AI“说人话”到“说结构话”:Spring AI结构化输出实战解析
人工智能·spring·ai编程
计算机学姐3 小时前
基于SpringBoot的校园二手交易系统
java·vue.js·spring boot·后端·spring·tomcat·intellij-idea
稻草猫.4 小时前
MyBatis-Plus高效开发全攻略
java·数据库·后端·spring·java-ee·mybatis·mybatis-plus