【Java微服务架构】Spring Cloud Alibaba全家桶实战:Nacos+Sentinel+Seata+分布式事务

文章目录

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)环境准备
  1. JDK:1.8+(推荐1.8)

  2. Maven:3.6.3+

  3. 数据库:MySQL 8.0+(用于Nacos配置存储、Seata事务日志)

  4. 中间件:Redis 6.0+(可选,用于Sentinel规则持久化)

2. Nacos:服务注册发现与配置中心

Nacos(Dynamic Naming and Configuration Service)是Spring Cloud Alibaba的核心组件,集服务注册发现、配置中心、服务元数据管理于一体,具备高可用、高并发、易扩展等特性,可替代Eureka+Config的组合。

2.1 Nacos核心原理与功能

(1)核心功能
  1. 服务注册发现:基于RESTful API实现服务注册、心跳检测、服务发现,支持加权负载均衡;

  2. 配置中心:支持动态配置发布、灰度发布、配置回滚,多环境(开发/测试/生产)隔离;

  3. 服务健康检查:支持TCP/HTTP/MySQL健康检查,自动剔除不健康服务实例。

(2)核心原理
  • 服务注册:微服务启动时通过HTTP请求向Nacos Server注册服务信息(服务名、IP、端口等),Nacos将信息存储在内存和数据库中;

  • 服务发现:微服务通过服务名向Nacos Server查询实例列表,Nacos返回健康实例,并支持订阅机制(服务变化时推送更新);

  • 配置管理:配置信息存储在MySQL中,微服务订阅配置后,Nacos通过长连接推送配置变更。

2.2 Nacos部署与配置(单机/集群)

(1)单机部署(开发环境)
  1. 下载Nacos安装包:从Nacos官网下载2.2.3版本压缩包;

  2. 解压后进入bin目录,执行启动命令:Windows:startup.cmd -m standaloneLinux/Mac:sh startup.sh -m standalone

  3. 访问控制台:http://localhost:8848/nacos,默认账号密码:nacos/nacos。

(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)控制台部署
  1. 下载Sentinel控制台:从Sentinel官网下载1.8.7版本jar包;

  2. 执行启动命令:java -jar sentinel-dashboard-1.8.7.jar --server.port=8080;

  3. 访问控制台:http://localhost:8080,默认账号密码:sentinel/sentinel。

(2)核心规则配置(控制台操作)
  1. 流量控制规则:配置资源的QPS阈值(如"/order/create"接口QPS=10);

  2. 熔断降级规则:配置异常率阈值(如异常率>50%时熔断,熔断时长5秒);

  3. 系统规则:配置系统负载阈值(如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部署
  1. 下载Seata Server:从Seata官网下载2.0.0版本压缩包;

  2. 修改配置(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 方案选型指南

  1. 优先选Seata AT模式:如果业务场景简单,追求易用性和高性能,无特殊需求;

  2. 选TCC模式:如果是金融、支付等强一致性场景,需要灵活控制事务逻辑;

  3. 选SAGA模式:如果事务流程长(跨多个微服务),允许最终一致性;

  4. 选本地消息表:如果无需中间件,追求简单实现,允许一定的数据延迟。

6. 微服务整合实战案例

整合Nacos、Sentinel、Seata,搭建一个简单的微服务架构(订单服务+库存服务),核心流程:

  1. 服务启动时,自动注册到Nacos;

  2. 订单服务调用库存服务时,通过Sentinel控制流量;

  3. 订单创建+库存扣减通过Seata保证分布式事务一致性;

  4. 配置信息通过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:解决分布式事务一致性问题,保证数据可靠;

  • 分布式事务方案:根据业务场景选择合适的方案,平衡一致性和性能。

进阶学习方向

  1. 微服务监控:集成Prometheus+Grafana,监控服务指标;

  2. 服务追踪:集成SkyWalking,追踪分布式调用链路;

  3. 容器化部署:用Docker+K8s部署微服务集群;

  4. Seata进阶:学习TCC、SAGA模式,适配复杂业务场景。

相关推荐
苏渡苇1 小时前
轻量化AI落地:Java + Spring Boot 实现设备异常预判
java·人工智能·spring boot·后端·网络协议·tcp/ip·spring
追随者永远是胜利者2 小时前
(LeetCode-Hot100)64. 最小路径和
java·算法·leetcode·职场和发展·go
heimeiyingwang3 小时前
企业非结构化数据的 AI 处理与价值挖掘
大数据·数据库·人工智能·机器学习·架构
学习是生活的调味剂3 小时前
nacos原理之服务注册浅析
java·开发语言·nacos·注册中心
没有bug.的程序员3 小时前
Arthas 深度进阶:线上问题非侵入式诊断内核、方法级监控与线程阻塞排查实战指南
java·arthas·线上问题·非侵入式·方法级监控·线程阻塞
亓才孓3 小时前
[Mybatis]Mybatis框架
java·数据库·mybatis
跟Tom学编程—一对一编程辅导3 小时前
基于 Java 的 SSM 架构电子商城项目毕业设计课题选型指导文档|名企高级开发工程师全程一对一指导(含详细文档+源码+部署)
java·架构·毕业设计·课程设计
tod1133 小时前
Redis 主从复制与高可用架构:从原理到生产实践
数据库·redis·架构
RoyLin3 小时前
Rust 编写的 40MB 大小 MicroVM 运行时,完美替代 Docker 作为 AI Agent Sandbox
后端·架构·rust