一份不可多得的《微服务》教程

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 安装启动

  1. 下载 Nacos 2.3.0:nacos.io
  2. 单机启动:
    • Windows:bin/startup.cmd -m standalone
    • Linux/Mac:sh bin/startup.sh -m standalone
  3. 访问控制台: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.name
  • spring.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:启动测试

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控制台

  1. 下载 sentinel-dashboard-1.8.7.jar
  2. 启动:java -jar sentinel-dashboard-1.8.7.jar --server.port=8080
  3. 访问: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限流示例:

  1. 控制台 → 簇点链路 → 找到接口 → 流控
  2. 阈值类型:QPS
  3. 单机阈值:2(每秒最多2次请求)
  4. 快速点击刷新,超过阈值会返回 Blocked by Sentinel (flow limiting)

8.5 熔断降级规则

慢调用比例熔断:

  1. 熔断策略:慢调用比例
  2. 最大RT:500ms(响应超过500ms算慢调用)
  3. 比例阈值:0.5(慢调用占比超过50%)
  4. 熔断时长:10s(熔断10秒后进入半开状态)
  5. 最小请求数: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

  1. 下载 seata-server-2.0.0
  2. 修改 conf/application.yml,配置注册中心和配置中心使用Nacos
  3. 启动: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 学习路线建议

  1. 入门阶段:Nacos注册发现 + OpenFeign调用 + Gateway网关
  2. 进阶阶段:Nacos配置中心 + Sentinel限流熔断
  3. 高级阶段:Seata分布式事务 + RocketMQ消息驱动
  4. 运维阶段:SkyWalking链路追踪 + Prometheus监控 + Docker/K8s部署

😁😁😁okokok , 那么这篇文章到这里就结束了 , 我们有缘再会!!!

相关推荐
juejin9983 小时前
Claude Code Lab-3(下):三能力 MCP Server
后端
java小白小3 小时前
SpringBoot(07):事务管理——@Transactional 你真的用对了吗?
后端
shepherd1113 小时前
吞吐量提升 10 倍:高并发大批量数据处理任务的架构演进与性能调优
java·后端·架构
java小白小4 小时前
SpringBoot(05):Spring Data JPA——用面向对象的方式操作数据库
后端
juejin9984 小时前
Claude Code Lab-2(上):自然语言查库助手
后端
java小白小4 小时前
SpringBoot(06):多数据源配置——一个项目连多个库怎么做
后端
程序员cxuan5 小时前
Codex 会把磁盘给烧了?完整复盘来了!
人工智能·后端·程序员
ClouGence5 小时前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle
快乐肚皮6 小时前
深入理解Loop Engineering
前端·后端
半个落月6 小时前
从递归到快速排序:用 JavaScript 把分治思想讲明白
javascript·算法·面试