Spring Cloud Alibaba 企业级落地教程
一、前置准备(必做)
1. 环境要求
表格
| 组件 | 版本要求 |
|---|---|
| JDK | 1.8 或 17(推荐 1.8) |
| Maven | 3.6+ |
| Spring Boot | 2.7.x(稳定版) |
| Spring Cloud | 2021.0.5 |
| Spring Cloud Alibaba | 2021.0.5.0 |
| Nacos | 2.2.3(稳定版) |
| Sentinel | 1.8.6 |
| RocketMQ | 4.9.4 |
| Seata | 1.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. 启动顺序
- 启动 Nacos(8848)
- 启动 Sentinel(8080)
- 启动 RocketMQ(NameServer 9876 + Broker)
- 启动 Seata(8091)
- 启动 gateway-service(9000)
- 启动 stock-service(9002)
- 启动 order-service(9001)
2. 功能测试
(1)服务注册验证
访问 Nacos 控制台:http://localhost:8848/nacos → 服务列表,能看到 gateway-service、order-service、stock-service。
(2)接口调用测试
调用网关转发的订单接口:
bash
运行
curl -X POST "http://localhost:9000/order/create?productId=AGV001&num=10"
正常返回:创建订单成功,商品ID:AGV001 | 商品ID:AGV001,扣减库存10件成功。
(3)Sentinel 限流测试
- 访问 Sentinel 控制台:
http://localhost:8080→ 找到order-service。 - 给
/order/create接口添加限流规则(QPS=2)。 - 快速多次调用接口,触发限流,返回降级提示。
(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 持久化,需下载源码改造或用改造后的包,这里提供最简方式:
- 下载改造好的 Sentinel 控制台(内置 Nacos 持久化):链接:https://pan.baidu.com/s/1Z8n8X7G09t0e8kF7s7a9bQ (提取码:s689)
- 启动改造后的控制台(指定 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的接口,触发事务后,查看 MySQLseata_db.undo_log表会生成回滚日志; - 模拟异常(如
int i=1/0),事务回滚成功,日志自动清理。
三、SkyWalking 监控集成教程(全链路追踪)
1. SkyWalking 安装(单机版)
- 下载 SkyWalking 8.16.0:https://archive.apache.org/dist/skywalking/8.16.0/apache-skywalking-apm-8.16.0.tar.gz
- 解压后启动:
bash
运行
# Linux/Mac cd apache-skywalking-apm-bin/bin sh startup.sh # Windows startup.bat - 访问 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,包含每个步骤的耗时、状态。
更多推荐



所有评论(0)