文章目录
-
- [1. Spring Cloud Alibaba生态简介](#1. Spring Cloud Alibaba生态简介)
-
- [1.1 生态定位与核心组件](#1.1 生态定位与核心组件)
- [1.2 版本选型与环境准备](#1.2 版本选型与环境准备)
- [2. Nacos:服务注册发现与配置中心](#2. Nacos:服务注册发现与配置中心)
-
- [2.1 Nacos核心原理与功能](#2.1 Nacos核心原理与功能)
- [2.2 Nacos部署与配置(单机/集群)](#2.2 Nacos部署与配置(单机/集群))
- [2.3 微服务集成Nacos实战](#2.3 微服务集成Nacos实战)
- [3. Sentinel:流量控制与熔断降级](#3. Sentinel:流量控制与熔断降级)
-
- [3.1 Sentinel核心概念与工作机制](#3.1 Sentinel核心概念与工作机制)
- [3.2 Sentinel控制台部署与规则配置](#3.2 Sentinel控制台部署与规则配置)
- [3.3 微服务集成Sentinel实战](#3.3 微服务集成Sentinel实战)
- [4. Seata:分布式事务解决方案](#4. Seata:分布式事务解决方案)
-
- [4.1 Seata核心架构与事务模式](#4.1 Seata核心架构与事务模式)
- [4.2 Seata Server部署与配置](#4.2 Seata Server部署与配置)
-
- [(1)Seata Server部署](#(1)Seata Server部署)
- (2)初始化数据库表
- [4.3 Seata AT模式实战(含代码)](#4.3 Seata AT模式实战(含代码))
- [5. 分布式事务解决方案汇总](#5. 分布式事务解决方案汇总)
-
- [5.1 主流方案对比(Seata/TCC/SAGA/本地消息表)](#5.1 主流方案对比(Seata/TCC/SAGA/本地消息表))
- [5.2 方案选型指南](#5.2 方案选型指南)
- [6. 微服务整合实战案例](#6. 微服务整合实战案例)
- [7. 总结与进阶方向](#7. 总结与进阶方向)
1. Spring Cloud Alibaba生态简介
Spring Cloud Alibaba是阿里巴巴基于Spring Cloud规范开发的微服务生态套件,兼容Spring Cloud原生组件,同时提供了更贴合国内企业需求的核心功能(如服务治理、配置管理、流量控制、分布式事务等),已成为Java微服务领域的主流选择。
1.1 生态定位与核心组件
Spring Cloud Alibaba生态核心组件分工明确,覆盖微服务全生命周期:
-
服务注册与发现:Nacos(替代Eureka、Consul)
-
配置中心:Nacos(替代Config)
-
流量控制与熔断降级:Sentinel(替代Hystrix)
-
分布式事务:Seata
-
服务网关:Gateway(与Spring Cloud原生一致)
-
服务调用:OpenFeign(与Spring Cloud原生一致)
1.2 版本选型与环境准备
(1)版本选型(关键!避免版本冲突)
Spring Cloud Alibaba版本与Spring Boot、Spring Cloud版本强关联,推荐稳定版本组合:
-
Spring Boot:2.6.13
-
Spring Cloud:2021.0.5
-
Spring Cloud Alibaba:2021.0.5.0
-
Nacos:2.2.3
-
Sentinel:1.8.7
-
Seata:2.0.0
(2)环境准备
-
JDK:1.8+(推荐1.8)
-
Maven:3.6.3+
-
数据库:MySQL 8.0+(用于Nacos配置存储、Seata事务日志)
-
中间件:Redis 6.0+(可选,用于Sentinel规则持久化)
2. Nacos:服务注册发现与配置中心
Nacos(Dynamic Naming and Configuration Service)是Spring Cloud Alibaba的核心组件,集服务注册发现、配置中心、服务元数据管理于一体,具备高可用、高并发、易扩展等特性,可替代Eureka+Config的组合。
2.1 Nacos核心原理与功能
(1)核心功能
-
服务注册发现:基于RESTful API实现服务注册、心跳检测、服务发现,支持加权负载均衡;
-
配置中心:支持动态配置发布、灰度发布、配置回滚,多环境(开发/测试/生产)隔离;
-
服务健康检查:支持TCP/HTTP/MySQL健康检查,自动剔除不健康服务实例。
(2)核心原理
-
服务注册:微服务启动时通过HTTP请求向Nacos Server注册服务信息(服务名、IP、端口等),Nacos将信息存储在内存和数据库中;
-
服务发现:微服务通过服务名向Nacos Server查询实例列表,Nacos返回健康实例,并支持订阅机制(服务变化时推送更新);
-
配置管理:配置信息存储在MySQL中,微服务订阅配置后,Nacos通过长连接推送配置变更。
2.2 Nacos部署与配置(单机/集群)
(1)单机部署(开发环境)
-
下载Nacos安装包:从Nacos官网下载2.2.3版本压缩包;
-
解压后进入bin目录,执行启动命令:Windows:startup.cmd -m standaloneLinux/Mac:sh startup.sh -m standalone
(2)核心配置(application.properties)
properties
# 服务端口
server.port=8848
# 数据源配置(默认嵌入式数据库,生产环境改为MySQL)
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
db.user.0=root
db.password.0=root
# 服务名
nacos.naming.serviceName=nacos-server
2.3 微服务集成Nacos实战
(1)引入依赖(pom.xml)
xml
<!-- Spring Cloud Alibaba Nacos 服务发现依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Spring Cloud Alibaba Nacos 配置中心依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
(2)配置文件(bootstrap.yml,优先级高于application.yml)
yaml
spring:
application:
name: order-service # 服务名(必须配置,用于注册和配置订阅)
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos服务端地址
config:
server-addr: localhost:8848
file-extension: yaml # 配置文件格式
group: DEFAULT_GROUP # 配置分组
namespace: public # 命名空间(用于环境隔离)
profiles:
active: dev # 激活环境
(3)服务注册注解(启动类)
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient // 开启服务注册发现(Spring Cloud Alibaba自动适配,可省略)
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
(4)动态配置使用
java
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope // 开启配置动态刷新
public class ConfigController {
// 注入Nacos中的配置项(配置文件:order-service-dev.yaml)
@Value("${service.version:1.0.0}")
private String version;
@GetMapping("/config/version")
public String getVersion() {
return "当前服务版本:" + version;
}
}
3. Sentinel:流量控制与熔断降级
Sentinel是阿里开源的流量控制组件,专注于微服务的流量治理,提供流量控制、熔断降级、系统负载保护等功能,可替代Hystrix,具备更强大的规则配置和监控能力。
3.1 Sentinel核心概念与工作机制
(1)核心概念
-
资源:需要保护的业务逻辑(如接口、方法);
-
规则:流量控制、熔断降级、系统保护等规则(通过控制台或代码配置);
-
流量控制:限制QPS(每秒请求数)、线程数,避免服务被压垮;
-
熔断降级:当服务调用异常率过高时,暂时熔断调用,避免级联故障。
(2)工作机制
Sentinel通过AOP拦截资源调用,实时统计流量数据,根据配置的规则判断是否允许请求通过:通过则执行业务逻辑,不通过则执行降级策略(返回默认值、抛出异常等)。
3.2 Sentinel控制台部署与规则配置
(1)控制台部署
-
下载Sentinel控制台:从Sentinel官网下载1.8.7版本jar包;
-
执行启动命令:java -jar sentinel-dashboard-1.8.7.jar --server.port=8080;
-
访问控制台:http://localhost:8080,默认账号密码:sentinel/sentinel。
(2)核心规则配置(控制台操作)
-
流量控制规则:配置资源的QPS阈值(如"/order/create"接口QPS=10);
-
熔断降级规则:配置异常率阈值(如异常率>50%时熔断,熔断时长5秒);
-
系统规则:配置系统负载阈值(如CPU使用率>80%时限流)。
3.3 微服务集成Sentinel实战
(1)引入依赖(pom.xml)
xml
<!-- Spring Cloud Alibaba Sentinel 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- Sentinel 控制台通信依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
(2)配置文件(application.yml)
yaml
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel控制台地址
port: 8719 # 客户端与控制台通信端口(默认8719)
eager: true # 立即初始化Sentinel(避免首次调用才注册)
(3)资源保护实战(注解方式)
java
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderController {
// 用SentinelResource注解标记需要保护的资源,指定降级方法
@GetMapping("/order/{id}")
@SentinelResource(value = "getOrder", blockHandler = "getOrderBlockHandler", fallback = "getOrderFallback")
public String getOrder(@PathVariable Long id) {
// 模拟业务逻辑
if (id == 0) {
throw new RuntimeException("参数异常");
}
return "订单信息:" + id;
}
// 流量控制/熔断降级触发时执行(BlockException)
public String getOrderBlockHandler(Long id, BlockException e) {
return "系统繁忙,请稍后再试(限流/熔断)";
}
// 业务异常触发时执行(RuntimeException)
public String getOrderFallback(Long id, Throwable e) {
return "查询订单失败(业务异常)";
}
}
(4)规则持久化(Redis方案)
默认规则存储在内存中,服务重启后丢失,生产环境需持久化到Redis:
xml
<!-- Sentinel 规则持久化依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-redis</artifactId>
</dependency>
yaml
spring:
cloud:
sentinel:
datasource:
ds1:
redis:
server-addr: localhost:6379
db: 0
key: sentinel:order-service:rules
rule-type: flow # 规则类型(flow:流量控制)
4. Seata:分布式事务解决方案
Seata(Simple Extensible Autonomous Transaction Architecture)是阿里开源的分布式事务框架,致力于提供高性能、易用的分布式事务解决方案,支持AT、TCC、SAGA等事务模式,其中AT模式为默认推荐(无侵入式)。
4.1 Seata核心架构与事务模式
(1)核心架构(三大角色)
-
TC(Transaction Coordinator):事务协调器,负责事务的全局协调(发起全局提交/回滚);
-
TM(Transaction Manager):事务管理器,发起全局事务(在微服务入口方法标记);
-
RM(Resource Manager):资源管理器,管理本地事务,执行提交/回滚操作。
(2)主流事务模式
-
AT模式:无侵入式,基于undo_log日志实现自动回滚,适合大多数场景;
-
TCC模式:侵入式,需手动实现Try/Confirm/Cancel接口,适合复杂业务;
-
SAGA模式:长事务模式,基于状态机实现,适合跨多个微服务的长流程事务。
4.2 Seata Server部署与配置
(1)Seata Server部署
-
下载Seata Server:从Seata官网下载2.0.0版本压缩包;
-
修改配置(conf/application.yml),配置数据源和注册中心:
yaml
server:
port: 7091
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/seata?useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: root
seata:
registry:
type: nacos # 注册到Nacos
nacos:
server-addr: localhost:8848
group: SEATA_GROUP
application: seata-server
store:
mode: db # 事务日志存储到数据库
db:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/seata?useUnicode=true&characterEncoding=utf8&useSSL=false
user: root
password: root
(2)初始化数据库表
创建seata数据库,执行官网提供的SQL脚本(包含undo_log、branch_table、global_table等表),undo_log表需在每个微服务的业务数据库中创建:
sql
CREATE TABLE `undo_log` (
`id` bigint NOT NULL AUTO_INCREMENT,
`branch_id` bigint NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.3 Seata AT模式实战(含代码)
以"订单创建+库存扣减"分布式事务为例,演示Seata AT模式的使用。
(1)引入依赖(pom.xml)
xml
<!-- Spring Cloud Alibaba Seata 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
(2)微服务配置(application.yml)
yaml
spring:
cloud:
alibaba:
seata:
tx-service-group: my_test_tx_group # 事务组名(需与Seata Server一致)
seata:
registry:
type: nacos
nacos:
server-addr: localhost:8848
group: SEATA_GROUP
tx-service-group: my_test_tx_group
service:
vgroup-mapping:
my_test_tx_group: default # 事务组映射
data-source-proxy-mode: AT
(3)数据源代理配置(必须配置,AT模式依赖)
java
import com.alibaba.druid.pool.DruidDataSource;
import io.seata.rm.datasource.DataSourceProxy;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource() {
return new DruidDataSource();
}
// 配置Seata数据源代理
@Bean
@Primary
public DataSourceProxy dataSourceProxy(DataSource dataSource) {
return new DataSourceProxy(dataSource);
}
}
(4)事务发起者(订单服务)
java
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private StockFeignClient stockFeignClient; // 调用库存服务的Feign客户端
// 标记全局事务(TM发起全局事务)
@PostMapping("/order/create")
@GlobalTransactional(rollbackFor = Exception.class)
public String createOrder() {
// 1. 创建订单(本地事务)
Order order = new Order();
order.setOrderId(1L);
order.setUserId(1L);
orderMapper.insert(order);
// 2. 调用库存服务扣减库存(远程事务)
String stockResult = stockFeignClient.deductStock(1L, 1);
if (!"success".equals(stockResult)) {
throw new RuntimeException("扣减库存失败");
}
// 模拟异常,测试事务回滚
// int i = 1/0;
return "订单创建成功";
}
}
(5)事务参与者(库存服务)
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class StockService {
@Autowired
private StockMapper stockMapper;
// 本地事务,由Seata RM管理
@PostMapping("/stock/deduct")
public String deductStock(@RequestParam Long productId, @RequestParam Integer num) {
// 扣减库存
int rows = stockMapper.deductStock(productId, num);
return rows > 0 ? "success" : "fail";
}
}
5. 分布式事务解决方案汇总
除了Seata,分布式事务还有多种解决方案,不同方案适配不同场景,需根据业务需求选型。
5.1 主流方案对比(Seata/TCC/SAGA/本地消息表)
| 方案 | 侵入性 | 性能 | 适用场景 | 优点 | 缺点 |
|------|--------|------|----------|------|------|
| Seata AT | 低(无侵入) | 高 | 大多数微服务场景 | 易用性高,无需修改业务代码 | 依赖Seata Server,对数据库有侵入(需undo_log表) |
| TCC | 高(需实现3个接口) | 高 | 复杂业务场景(如金融) | 灵活性高,无锁等待 | 开发成本高,需处理空回滚、幂等性 |
| SAGA | 中(需定义状态机) | 中 | 长事务场景(如订单履约) | 支持长流程事务,容错性强 | 一致性弱,需处理补偿逻辑 |
| 本地消息表 | 中(需加消息表) | 中 | 低一致性场景(如日志同步) | 实现简单,无中间件依赖 | 一致性弱,需处理消息重复消费 |
5.2 方案选型指南
-
优先选Seata AT模式:如果业务场景简单,追求易用性和高性能,无特殊需求;
-
选TCC模式:如果是金融、支付等强一致性场景,需要灵活控制事务逻辑;
-
选SAGA模式:如果事务流程长(跨多个微服务),允许最终一致性;
-
选本地消息表:如果无需中间件,追求简单实现,允许一定的数据延迟。
6. 微服务整合实战案例
整合Nacos、Sentinel、Seata,搭建一个简单的微服务架构(订单服务+库存服务),核心流程:
-
服务启动时,自动注册到Nacos;
-
订单服务调用库存服务时,通过Sentinel控制流量;
-
订单创建+库存扣减通过Seata保证分布式事务一致性;
-
配置信息通过Nacos动态管理。
核心配置汇总(application.yml)
yaml
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml
sentinel:
transport:
dashboard: localhost:8080
eager: true
alibaba:
seata:
tx-service-group: my_test_tx_group
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/order_db?useUnicode=true&characterEncoding=utf8
username: root
password: root
seata:
registry:
type: nacos
nacos:
server-addr: localhost:8848
tx-service-group: my_test_tx_group
service:
vgroup-mapping:
my_test_tx_group: default
data-source-proxy-mode: AT
feign:
sentinel:
enabled: true # 开启Feign整合Sentinel(远程调用限流)
7. 总结与进阶方向
本文汇总了Spring Cloud Alibaba全家桶核心组件(Nacos、Sentinel、Seata)的实战内容,以及分布式事务解决方案,从环境配置到代码实战,覆盖了微服务落地的核心环节:
-
Nacos:解决服务注册发现和配置动态管理问题;
-
Sentinel:解决流量控制和熔断降级问题,避免级联故障;
-
Seata:解决分布式事务一致性问题,保证数据可靠;
-
分布式事务方案:根据业务场景选择合适的方案,平衡一致性和性能。
进阶学习方向
-
微服务监控:集成Prometheus+Grafana,监控服务指标;
-
服务追踪:集成SkyWalking,追踪分布式调用链路;
-
容器化部署:用Docker+K8s部署微服务集群;
-
Seata进阶:学习TCC、SAGA模式,适配复杂业务场景。