一、前置准备(必做)

1. 环境要求

表格

组件版本要求
JDK1.8 或 17(推荐 1.8)
Maven3.6+
Spring Boot2.7.x(稳定版)
Spring Cloud2021.0.5
Spring Cloud Alibaba2021.0.5.0
Nacos2.2.3(稳定版)
Sentinel1.8.6
RocketMQ4.9.4
Seata1.5.2(AT 模式)

2. 中间件安装(快速版)

(1)Nacos 安装(单机版)

bash

运行

# 下载安装包(Linux/Mac)
wget https://github.com/alibaba/nacos/releases/download/2.2.3/nacos-server-2.2.3.tar.gz
tar -zxvf nacos-server-2.2.3.tar.gz
cd nacos/bin

# 启动(单机模式)
# Linux/Mac
sh startup.sh -m standalone
# Windows
startup.cmd -m standalone

访问:http://localhost:8848/nacos,默认账号 / 密码:nacos/nacos

(2)Sentinel 安装

bash

运行

# 下载jar包
wget https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar

# 启动(默认端口8080)
java -jar sentinel-dashboard-1.8.6.jar

访问:http://localhost:8080,默认账号 / 密码:sentinel/sentinel

(3)RocketMQ 安装

bash

运行

# 下载安装包
wget https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip
unzip rocketmq-all-4.9.4-bin-release.zip
cd rocketmq-all-4.9.4-bin-release

# 启动NameServer
nohup sh bin/mqnamesrv &

# 启动Broker
nohup sh bin/mqbroker -n localhost:9876 &
(4)Seata 安装

bash

运行

# 下载安装包
wget https://github.com/seata/seata/releases/download/v1.5.2/seata-server-1.5.2.tar.gz
tar -zxvf seata-server-1.5.2.tar.gz
cd seata-server-1.5.2/bin

# 启动(单机版)
# Linux/Mac
sh seata-server.sh -p 8091 -h 127.0.0.1 -m file
# Windows
seata-server.bat -p 8091 -h 127.0.0.1 -m file

二、项目搭建(模块化架构)

1. 项目结构(企业标准)

plaintext

spring-cloud-alibaba-demo/
├── common/           # 公共模块(实体、工具、配置)
├── gateway/          # 网关模块(Spring Cloud Gateway)
├── service-order/    # 订单服务(业务示例)
├── service-stock/    # 库存服务(业务示例)
└── pom.xml           # 父工程依赖

2. 父工程 pom.xml(核心依赖)

xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.15</version>
        <relativePath/>
    </parent>

    <groupId>com.example</groupId>
    <artifactId>spring-cloud-alibaba-demo</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    <modules>
        <module>common</module>
        <module>gateway</module>
        <module>service-order</module>
        <module>service-stock</module>
    </modules>

    <!-- 版本管理 -->
    <dependencyManagement>
        <dependencies>
            <!-- Spring Cloud Alibaba 依赖 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.0.5.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- Spring Cloud 依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2021.0.5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!-- 公共依赖 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

三、核心模块开发

1. 网关模块(Gateway)

(1)pom.xml 依赖

xml

<dependencies>
    <!-- Gateway 核心 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <!-- Nacos 服务发现 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- Sentinel 网关限流 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
</dependencies>
(2)application.yml 配置

yaml

server:
  port: 9000  # 网关端口

spring:
  application:
    name: gateway-service  # 网关服务名
  cloud:
    # Nacos 配置
    nacos:
      discovery:
        server-addr: localhost:8848  # Nacos 地址
    # Gateway 配置
    gateway:
      routes:
        # 订单服务路由
        - id: order-service
          uri: lb://order-service  # 负载均衡指向订单服务
          predicates:
            - Path=/order/**  # 路由路径
        # 库存服务路由
        - id: stock-service
          uri: lb://stock-service
          predicates:
            - Path=/stock/**
    # Sentinel 配置
    sentinel:
      transport:
        dashboard: localhost:8080  # Sentinel 控制台地址
        port: 8719  # 客户端端口
(3)启动类

java

运行

package com.example.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient  // 开启服务发现
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

2. 订单服务(整合 Feign/Sentinel/Seata/RocketMQ)

(1)pom.xml 依赖

xml

<dependencies>
    <!-- Web 核心 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Nacos 服务发现 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- Nacos 配置中心 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <!-- Feign 远程调用 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <!-- Sentinel 限流熔断 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    <!-- Seata 分布式事务 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    </dependency>
    <!-- RocketMQ 消息队列 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
    </dependency>
</dependencies>
(2)application.yml 配置

yaml

server:
  port: 9001

spring:
  application:
    name: order-service
  cloud:
    # Nacos 配置
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yaml  # 配置文件格式
    # Sentinel 配置
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719
    # Seata 配置
    alibaba:
      seata:
        tx-service-group: default  # 事务分组
  # RocketMQ 配置
  rocketmq:
    name-server: localhost:9876
    producer:
      group: order-producer-group  # 生产者组

# Seata 配置
seata:
  registry:
    type: nacos
    nacos:
      server-addr: localhost:8848
      namespace: ""
      group: SEATA_GROUP
      application: seata-server
  config:
    type: nacos
    nacos:
      server-addr: localhost:8848
      group: SEATA_GROUP
  service:
    vgroup-mapping:
      default: default  # 事务分组映射
(3)核心代码
① Feign 远程调用(调用库存服务)

java

运行

package com.example.order.feign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

// 指向库存服务,整合Sentinel熔断
@FeignClient(value = "stock-service", fallback = StockFeignFallback.class)
public interface StockFeignClient {
    // 扣减库存接口
    @PostMapping("/stock/deduct")
    String deductStock(@RequestParam("productId") String productId, @RequestParam("num") Integer num);
}

// 熔断降级实现类
@Component
class StockFeignFallback implements StockFeignClient {
    @Override
    public String deductStock(String productId, Integer num) {
        return "库存服务调用失败,触发降级!";
    }
}
② 分布式事务(Seata AT 模式)

java

运行

package com.example.order.service;

import com.example.order.feign.StockFeignClient;
import io.seata.spring.annotation.GlobalTransactional;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderService {

    @Autowired
    private StockFeignClient stockFeignClient;

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    // 全局事务注解(Seata)
    @GlobalTransactional(rollbackFor = Exception.class)
    public String createOrder(String productId, Integer num) {
        // 1. 远程调用库存服务扣减库存
        String stockResult = stockFeignClient.deductStock(productId, num);
        
        // 2. 模拟创建订单(实际项目中写库)
        String orderResult = "创建订单成功,商品ID:" + productId;
        
        // 3. 发送MQ消息(通知物流等)
        rocketMQTemplate.convertAndSend("order_topic", orderResult);
        
        // 模拟异常(测试事务回滚)
        // int i = 1 / 0;
        
        return orderResult + " | " + stockResult;
    }
}
③ 控制器

java

运行

package com.example.order.controller;

import com.example.order.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private OrderService orderService;

    // Sentinel 限流:访问http://localhost:9000/order/create 触发
    @PostMapping("/create")
    public String createOrder(@RequestParam("productId") String productId,
                              @RequestParam("num") Integer num) {
        return orderService.createOrder(productId, num);
    }
}
④ 启动类

java

运行

package com.example.order;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients  // 开启Feign
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

3. 库存服务(基础服务)

(1)pom.xml 依赖(同订单服务,去掉 RocketMQ 生产者)
(2)application.yml 配置(端口 9002,服务名 stock-service)
(3)核心代码

java

运行

package com.example.stock.controller;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/stock")
public class StockController {

    // 扣减库存接口
    @PostMapping("/deduct")
    public String deductStock(@RequestParam("productId") String productId,
                              @RequestParam("num") Integer num) {
        // 实际项目中操作数据库扣减库存
        return "商品ID:" + productId + ",扣减库存" + num + "件成功";
    }
}

四、联调测试

1. 启动顺序

  1. 启动 Nacos(8848)
  2. 启动 Sentinel(8080)
  3. 启动 RocketMQ(NameServer 9876 + Broker)
  4. 启动 Seata(8091)
  5. 启动 gateway-service(9000)
  6. 启动 stock-service(9002)
  7. 启动 order-service(9001)

2. 功能测试

(1)服务注册验证

访问 Nacos 控制台:http://localhost:8848/nacos → 服务列表,能看到 gateway-serviceorder-servicestock-service

(2)接口调用测试

调用网关转发的订单接口:

bash

运行

curl -X POST "http://localhost:9000/order/create?productId=AGV001&num=10"

正常返回:创建订单成功,商品ID:AGV001 | 商品ID:AGV001,扣减库存10件成功

(3)Sentinel 限流测试
  1. 访问 Sentinel 控制台:http://localhost:8080 → 找到 order-service
  2. /order/create 接口添加限流规则(QPS=2)。
  3. 快速多次调用接口,触发限流,返回降级提示。
(4)Seata 事务测试

OrderService.createOrder 中放开 int i = 1 / 0; 代码,调用接口:

  • 库存服务的扣减操作会回滚(分布式事务生效)。
(5)RocketMQ 消息测试

查看 RocketMQ 控制台(需单独部署),能看到 order_topic 有消息产生。

以上是测试环境的配置,如果要实际部署建议采用下面的方式:

一、Sentinel 规则持久化到 Nacos(核心:规则不丢、动态刷新)

1. 原理

Sentinel 控制台配置的规则默认存在内存,重启服务丢失;将规则持久化到 Nacos,服务启动时从 Nacos 拉取规则,控制台修改规则也会同步到 Nacos。

2. 步骤(分控制台改造 + 微服务配置)

(1)改造 Sentinel 控制台(添加 Nacos 持久化插件)

注:官方 Sentinel 控制台默认无 Nacos 持久化,需下载源码改造或用改造后的包,这里提供最简方式:

  1. 下载改造好的 Sentinel 控制台(内置 Nacos 持久化):链接:https://pan.baidu.com/s/1Z8n8X7G09t0e8kF7s7a9bQ (提取码:s689)
  2. 启动改造后的控制台(指定 Nacos 地址):

    bash

    运行

    java -jar sentinel-dashboard-1.8.6-nacos.jar \
    -Dnacos.addr=localhost:8848 \
    -Dnacos.namespace=public \
    -Dnacos.groupId=SENTINEL_GROUP
    
(2)微服务配置(以 order-service 为例)

① 新增依赖(pom.xml):

xml

<!-- Sentinel 整合 Nacos 规则持久化 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

② 修改 application.yml(添加 Nacos 数据源配置):

yaml

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719
      # 规则持久化到 Nacos 核心配置
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848
            data-id: ${spring.application.name}-sentinel-rules
            group-id: SENTINEL_GROUP
            data-type: json
            rule-type: flow  # 流控规则(支持 flow/degrade/system/param-flow 等)

③ 验证:

  • 启动 order-service,在 Sentinel 控制台给 /order/create 添加流控规则;
  • 访问 Nacos 控制台 → 配置管理 → 配置列表,能看到 order-service-sentinel-rules 配置项,内容为规则 JSON;
  • 重启 order-service,规则不会丢失。

二、Seata 整合 MySQL 实现事务日志持久化(生产必备)

1. 前置准备

  • 安装 MySQL(5.7+/8.0+),创建数据库 seata_db
  • 执行 Seata 官方建表语句(事务日志表):

    sql

    -- 新建 seata_db 数据库后执行
    CREATE TABLE IF NOT EXISTS `undo_log`
    (
        `branch_id`     BIGINT       NOT NULL COMMENT '分支ID',
        `xid`           VARCHAR(128) NOT NULL COMMENT '全局ID',
        `context`       VARCHAR(128) NOT NULL COMMENT '上下文',
        `rollback_info` LONGBLOB     NOT NULL COMMENT '回滚信息',
        `log_status`    INT          NOT NULL COMMENT '状态 0:正常 1:已提交',
        `log_created`   DATETIME     NOT NULL COMMENT '创建时间',
        `log_modified`  DATETIME     NOT NULL COMMENT '修改时间',
        PRIMARY KEY (`branch_id`),
        UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
    ) ENGINE = InnoDB
      DEFAULT CHARSET = utf8mb4 COMMENT ='AT模式回滚日志表';
    

2. Seata 服务端配置(修改 file.conf)

进入 Seata 安装目录 → conf/file.conf,修改以下配置:

properties

## 存储模式改为 db
store {
  mode = "db"
  db {
    datasource = "mysql"
    dbType = "mysql"
    driverClassName = "com.mysql.cj.jdbc.Driver"
    url = "jdbc:mysql://localhost:3306/seata_db?useUnicode=true&rewriteBatchedStatements=true"
    user = "root"
    password = "你的MySQL密码"
    minConn = 5
    maxConn = 30
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  }
}

3. Seata 客户端配置(微服务)

① 微服务新增 MySQL 依赖(pom.xml):

xml

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.30</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.16</version>
</dependency>

② 修改 application.yml(添加数据源配置):

yaml

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/order_db?useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    password: 你的MySQL密码

# Seata 事务日志持久化配置
seata:
  config:
    type: nacos
    nacos:
      server-addr: localhost:8848
      group: SEATA_GROUP
      data-id: seataServer.properties
  service:
    vgroup-mapping:
      default: default
  client:
    undo:
      log-table: undo_log  # 对应MySQL中的undo_log表

4. 验证

  • 重启 Seata 服务端和微服务;
  • 调用包含 @GlobalTransactional 的接口,触发事务后,查看 MySQL seata_db.undo_log 表会生成回滚日志;
  • 模拟异常(如 int i=1/0),事务回滚成功,日志自动清理。

三、SkyWalking 监控集成教程(全链路追踪)

1. SkyWalking 安装(单机版)

  1. 下载 SkyWalking 8.16.0:https://archive.apache.org/dist/skywalking/8.16.0/apache-skywalking-apm-8.16.0.tar.gz
  2. 解压后启动:

    bash

    运行

    # Linux/Mac
    cd apache-skywalking-apm-bin/bin
    sh startup.sh
    # Windows
    startup.bat
    
  3. 访问 SkyWalking 控制台:http://localhost:8080(默认账号 / 密码:admin/admin)。

2. 微服务集成 SkyWalking

(1)添加依赖(父工程 pom.xml)

xml

<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-spring-boot-starter</artifactId>
    <version>8.16.0</version>
</dependency>
(2)配置 JVM 启动参数(关键)

在微服务启动配置中添加以下参数(IDEA 中:Run/Debug Configurations → VM options):

plaintext

-javaagent:你的SkyWalking路径/apache-skywalking-apm-bin/agent/skywalking-agent.jar
-Dskywalking.agent.service_name=order-service  # 每个服务名不同(gateway/stock/order)
-Dskywalking.collector.backend_service=localhost:11800
(3)验证
  • 启动所有微服务(已添加 SkyWalking 代理);
  • 调用接口 http://localhost:9000/order/create?productId=AGV001&num=10
  • 访问 SkyWalking 控制台 → 链路追踪,能看到完整的调用链:gateway → order-service → stock-service,包含每个步骤的耗时、状态。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐