Spring Cloud 微服务完整教程(2026版)
本教程基于 Spring Cloud Alibaba 技术栈,从基础概念到实战落地,系统讲解微服务架构的核心组件与开发实践。
一、微服务架构基础
1.1 什么是微服务
微服务是一种架构风格,将单体应用拆分为一组小型、独立部署的服务,每个服务运行在自己的进程中,通过轻量级机制(通常是HTTP REST API)进行通信。
核心特征:
- 单一职责:每个服务只做一件事
- 独立部署:服务间解耦,可独立升级发布
- 技术异构:不同服务可选用不同技术栈
- 分布式治理:需要解决服务发现、配置管理、熔断降级等问题
1.2 Spring Cloud 与 Spring Cloud Alibaba
Spring Cloud 是Pivotal推出的微服务一站式解决方案,提供了服务注册发现、配置中心、网关、熔断等组件规范。
Spring Cloud Alibaba 是阿里巴巴基于Spring Cloud规范开发的微服务生态套件,已成为国内企业主流选择:
| 功能 | Spring Cloud原生 | Spring Cloud Alibaba |
|---|---|---|
| 服务注册发现 | Eureka / Consul | Nacos |
| 配置中心 | Spring Cloud Config | Nacos Config |
| 熔断降级 | Hystrix / Resilience4j | Sentinel |
| 分布式事务 | 无官方方案 | Seata |
| 消息驱动 | Stream + RabbitMQ/Kafka | RocketMQ |
| API网关 | Spring Cloud Gateway | Spring Cloud Gateway |
| 服务调用 | OpenFeign | OpenFeign |
二、环境准备与版本选型
2.1 推荐版本组合(2026生产稳定版)
| 技术组件 | 稳定版本 | 说明 |
|---|---|---|
| JDK | 17 / 21 LTS | Spring Boot 3.x 要求JDK 17+ |
| Spring Boot | 3.2.5 | 基础框架 |
| Spring Cloud | 2023.0.2 ( Leyton ) | 对应Spring Boot 3.2.x |
| Spring Cloud Alibaba | 2023.0.1.2 | 微服务核心套件 |
| Nacos | 2.3.0 | 注册中心+配置中心 |
| Sentinel | 1.8.7 | 流量控制与熔断 |
| Seata | 2.0.0 | 分布式事务 |
| Spring Cloud Gateway | 4.1.0 | API网关 |
2.2 版本依赖管理
Spring Cloud Alibaba 官方版本对应关系:
- Spring Cloud Alibaba 2023.0.1.x → Spring Cloud 2023.0.x → Spring Boot 3.2.x
三、父工程搭建
3.1 创建Maven父项目
新建空Maven项目 springcloud-demo,删除src目录,修改 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>
<groupId>com.example</groupId>
<artifactId>springcloud-demo</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<!-- 统一版本管理 -->
<properties>
<java.version>17</java.version>
<spring-boot.version>3.2.5</spring-boot.version>
<spring-cloud.version>2023.0.2</spring-cloud.version>
<spring-cloud-alibaba.version>2023.0.1.2</spring-cloud-alibaba.version>
<mybatis-plus.version>3.5.6</mybatis-plus.version>
</properties>
<!-- 依赖版本锁定,子模块无需指定版本 -->
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</build>
</project>
四、Nacos 服务注册与发现
4.1 Nacos 安装启动
- 下载 Nacos 2.3.0:nacos.io
- 单机启动:
- Windows:
bin/startup.cmd -m standalone - Linux/Mac:
sh bin/startup.sh -m standalone
- Windows:
- 访问控制台:http://localhost:8848/nacos (账号密码均为 nacos)
4.2 服务提供者搭建
步骤1:创建子模块 provider-service
步骤2:添加依赖
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>
</dependencies>
步骤3:配置文件 application.yml
yaml
server:
port: 8001
spring:
application:
name: provider-service # 服务名,必须唯一
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # Nacos地址
namespace: public # 命名空间
group: DEFAULT_GROUP # 分组
步骤4:启动类
java
@SpringBootApplication
@EnableDiscoveryClient // 开启服务发现(Spring Cloud 2023后可省略)
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
步骤5:提供接口
java
@RestController
@RequestMapping("/provider")
public class ProviderController {
@Value("${server.port}")
private String port;
@GetMapping("/hello")
public String hello(String name) {
return "Hello " + name + ",我是服务提供者,端口:" + port;
}
}
启动服务后,在Nacos控制台的「服务管理-服务列表」中可看到 provider-service。
4.3 服务消费者搭建 + RestTemplate
步骤1:创建子模块 consumer-service,端口8080
步骤2:添加相同的Nacos依赖 + Web
步骤3:配置RestTemplate + LoadBalancer
java
@Configuration
public class RestConfig {
@Bean
@LoadBalanced // 开启客户端负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
步骤4:调用服务
java
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/call")
public String call(String name) {
// 使用服务名替代IP:端口
String url = "http://provider-service/provider/hello?name=" + name;
return restTemplate.getForObject(url, String.class);
}
}
访问 http://localhost:8080/consumer/call?name=zhangsan 即可成功调用。
五、OpenFeign 声明式服务调用
OpenFeign 可以让我们像调用本地方法一样调用远程服务,底层自动封装HTTP请求。
5.1 引入依赖
在消费者服务中添加:
xml
<!-- OpenFeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
5.2 开启Feign
java
@SpringBootApplication
@EnableFeignClients // 开启Feign
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
5.3 编写Feign接口
java
@FeignClient("provider-service") // 指定目标服务名
public interface ProviderFeign {
@GetMapping("/provider/hello")
String hello(@RequestParam("name") String name);
}
5.4 使用Feign调用
java
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private ProviderFeign providerFeign;
@GetMapping("/call-feign")
public String callFeign(String name) {
return providerFeign.hello(name);
}
}
注意事项:
@RequestParam、@PathVariable必须指定参数名- 复杂对象使用
@RequestBody - Feign默认集成了LoadBalancer,自动支持负载均衡
六、Nacos 配置中心
6.1 为什么需要配置中心
- 配置集中管理,避免每个服务重复配置
- 配置动态刷新,修改配置无需重启服务
- 多环境隔离(开发、测试、生产)
6.2 快速接入
步骤1:添加依赖
xml
<!-- Nacos 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
步骤2:创建 bootstrap.yml(必须是bootstrap)
yaml
spring:
application:
name: provider-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml # 配置文件格式
namespace: public
group: DEFAULT_GROUP
Spring Boot 3.x 默认不加载bootstrap,需额外添加依赖:
xml<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>
步骤3:Nacos控制台添加配置
进入Nacos控制台 → 配置管理 → 配置列表 → 新建配置:
- Data ID:
provider-service.yaml - 分组:
DEFAULT_GROUP - 配置格式:YAML
- 配置内容:
yaml
app:
description: 这是来自Nacos的配置
version: 1.0.0
步骤4:读取配置
java
@RestController
@RefreshScope // 开启配置动态刷新
public class ConfigController {
@Value("${app.description}")
private String description;
@Value("${app.version}")
private String version;
@GetMapping("/config")
public String getConfig() {
return description + ",版本:" + version;
}
}
修改Nacos中的配置并发布,无需重启服务即可生效。
6.3 配置命名规则
Nacos配置的Data ID完整格式:
bash
${prefix}-${spring.profiles.active}.${file-extension}
prefix:默认是spring.application.namespring.profiles.active:环境标识(dev/test/prod)file-extension:配置文件格式
示例:provider-service-dev.yaml
七、Spring Cloud Gateway 网关
7.1 网关的作用
- 统一入口:所有请求经过网关,对外暴露统一地址
- 路由转发:根据路径转发到对应微服务
- 负载均衡:自动集成服务发现与负载均衡
- 统一鉴权:网关层做权限校验
- 限流熔断:集成Sentinel进行流量控制
7.2 搭建网关服务
步骤1:创建子模块 gateway-service,端口9000
步骤2:添加依赖
xml
<!-- 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>
步骤3:配置路由
yaml
server:
port: 9000
spring:
application:
name: gateway-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
discovery:
locator:
enabled: true # 开启从注册中心动态创建路由
routes:
# 路由1:转发到提供者服务
- id: provider-route
uri: lb://provider-service # lb://服务名,自动负载均衡
predicates:
- Path=/provider/** # 路径断言,匹配该路径的请求
filters:
- StripPrefix=1 # 去掉第一层路径
# 路由2:转发到消费者服务
- id: consumer-route
uri: lb://consumer-service
predicates:
- Path=/consumer/**
filters:
- StripPrefix=1
步骤4:启动测试
- 直接访问:http://localhost:8001/provider/hello?name=test
- 通过网关访问:http://localhost:9000/provider/provider/hello?name=test
7.3 自定义全局过滤器
实现统一鉴权示例:
java
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String token = request.getHeaders().getFirst("token");
if (token == null || token.isEmpty()) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
String body = "{\"code\":401,\"msg\":\"未登录\"}";
DataBuffer buffer = response.bufferFactory().wrap(body.getBytes());
return response.writeWith(Mono.just(buffer));
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0; // 过滤器执行顺序,数值越小优先级越高
}
}
八、Sentinel 流量控制与熔断降级
8.1 Sentinel 简介
Sentinel是阿里巴巴开源的流量防卫兵,核心功能:
- 流量控制(QPS、线程数)
- 熔断降级(慢调用、异常比例)
- 系统负载保护
- 实时监控控制台
8.2 安装Sentinel控制台
- 下载 sentinel-dashboard-1.8.7.jar
- 启动:
java -jar sentinel-dashboard-1.8.7.jar --server.port=8080 - 访问:http://localhost:8080 (账号密码 sentinel/sentinel)
8.3 服务接入Sentinel
步骤1:添加依赖
xml
<!-- Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
步骤2:配置Sentinel地址
yaml
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080 # 控制台地址
port: 8719 # 客户端与控制台通信端口
eager: true # 立即加载,懒加载模式下首次访问才初始化
步骤3:访问任意接口后,控制台即可看到服务
8.4 流量控制规则
QPS限流示例:
- 控制台 → 簇点链路 → 找到接口 → 流控
- 阈值类型:QPS
- 单机阈值:2(每秒最多2次请求)
- 快速点击刷新,超过阈值会返回
Blocked by Sentinel (flow limiting)
8.5 熔断降级规则
慢调用比例熔断:
- 熔断策略:慢调用比例
- 最大RT:500ms(响应超过500ms算慢调用)
- 比例阈值:0.5(慢调用占比超过50%)
- 熔断时长:10s(熔断10秒后进入半开状态)
- 最小请求数:5
8.6 自定义降级异常返回
java
@Configuration
public class SentinelConfig {
@PostConstruct
public void init() {
// 自定义限流异常处理
WebCallbackManager.setUrlBlockHandler((request, response, ex) -> {
response.setStatus(200);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("{\"code\":500,\"msg\":\"系统繁忙,请稍后再试\"}");
});
}
}
8.7 OpenFeign集成Sentinel
yaml
feign:
sentinel:
enabled: true # 开启Feign对Sentinel的支持
定义fallback类:
java
@Component
public class ProviderFeignFallback implements ProviderFeign {
@Override
public String hello(String name) {
return "服务降级:" + name + ",服务暂时不可用";
}
}
修改Feign接口:
java
@FeignClient(value = "provider-service", fallback = ProviderFeignFallback.class)
public interface ProviderFeign {
@GetMapping("/provider/hello")
String hello(@RequestParam("name") String name);
}
九、Seata 分布式事务
9.1 分布式事务问题
微服务架构下,一个业务操作可能涉及多个服务、多个数据库,传统本地事务无法保证数据一致性。Seata提供了AT、TCC、Saga等多种模式。
9.2 Seata AT模式快速入门
步骤1:安装Seata Server
- 下载 seata-server-2.0.0
- 修改
conf/application.yml,配置注册中心和配置中心使用Nacos - 启动:
sh bin/seata-server.sh
步骤2:每个业务数据库创建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;
步骤3:服务添加依赖
xml
<!-- Seata -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
步骤4:配置Seata
yaml
seata:
service:
vgroup-mapping:
default_tx_group: default # 事务分组
registry:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
步骤5:使用全局事务注解 在发起方的业务方法上添加 @GlobalTransactional:
java
@Service
public class OrderService {
@GlobalTransactional // 开启全局事务
public void createOrder(Order order) {
// 1. 创建订单(本地库)
orderMapper.insert(order);
// 2. 扣减库存(远程服务)
stockFeign.deduct(order.getProductId(), order.getCount());
// 3. 扣减余额(远程服务)
accountFeign.decrease(order.getUserId(), order.getMoney());
// 任意一步异常,全局回滚
}
}
十、完整项目架构总结
10.1 整体架构图
scss
客户端请求
↓
Gateway网关 (9000)
↓
┌─────────────────────────────┐
│ Nacos注册中心/配置中心 │
└─────────────────────────────┘
↓ ↓ ↓
订单服务 库存服务 用户服务
(8001) (8002) (8003)
↓ ↓ ↓
订单库 库存库 用户库
10.2 核心组件回顾
| 组件 | 端口 | 作用 |
|---|---|---|
| Nacos | 8848 | 服务注册发现 + 配置中心 |
| Sentinel Dashboard | 8080 | 流量控制监控台 |
| Seata Server | 8091 | 分布式事务协调者 |
| Gateway | 9000 | API网关 |
| provider-service | 8001 | 示例服务提供者 |
| consumer-service | 8080 | 示例服务消费者 |
10.3 学习路线建议
- 入门阶段:Nacos注册发现 + OpenFeign调用 + Gateway网关
- 进阶阶段:Nacos配置中心 + Sentinel限流熔断
- 高级阶段:Seata分布式事务 + RocketMQ消息驱动
- 运维阶段:SkyWalking链路追踪 + Prometheus监控 + Docker/K8s部署
😁😁😁okokok , 那么这篇文章到这里就结束了 , 我们有缘再会!!!