背景

本文是《Java 后端从小白到大神》修仙系列之框架学习,Spring Cloud 微服务实战系列的 第一篇。Spring Cloud 是构建微服务架构的基石,拥有完整的服务治理生态,在云原生架构中广泛应用。本系列将从架构认知到实际工程,逐步构建一套企业级 Spring Cloud 微服务项目。

文章概览

微服务体系初识与工程搭建实战:

  1. 微服务架构演进与痛点解析
  2. Spring Cloud 全景图谱及主流组件
  3. 微服务工程模块划分与父子结构搭建
  4. Nacos 配置中心的接入与配置管理
  5. 搭建第一个微服务:配置中心 config-service

1. 什么是微服务?优缺点详解

微服务架构,是将单体应用拆分为多个服务的设计模式。每个服务独立开发、部署、扩展,服务之间通过轻量级通信协作完成业务目标。

优点:

  • 独立部署,解耦性强
  • 技术异构,每个服务可用不同技术栈
  • 按需扩展,灵活弹性伸缩
  • 故障隔离,不影响整个系统

缺点:

  • 分布式复杂性增加(调用链、日志、追踪、事务等)
  • 接口依赖复杂,管理困难
  • 数据一致性弱于单体架构
  • DevOps 要求更高

2. Spring Cloud 微服务生态概览

Spring Cloud 提供了微服务架构的全套解决方案,涵盖服务注册、配置管理、通信调用、安全认证、链路追踪、监控告警等核心能力。

本项目结合 2025 年主流技术,已集成以下组件:

  • 服务注册与发现:Nacos / Eureka
  • 服务通信:OpenFeign
  • 网关路由:Spring Cloud Gateway
  • 配置中心:Nacos Config
  • 熔断限流降级:Resilience4j
  • 链路追踪:Spring Cloud Sleuth + Zipkin
  • 消息驱动:Spring Cloud Stream + RabbitMQ/Kafka
  • 安全认证授权:Spring Security OAuth2 + JWT
  • 分布式事务管理:Seata(支持 AT / TCC)
  • API 文档与测试:Springdoc OpenAPI + Swagger UI
  • 分布式锁与缓存:Redisson + Caffeine
  • 监控与告警:Micrometer + Prometheus + Grafana
  • 服务网格实验:Istio 服务治理与故障注入模拟

3. 版本体系梳理与依赖管理

Spring Cloud 使用 发布列车(Release Train) 方式发布,推荐版本搭配如下:

Spring Boot 版本 Spring Cloud 版本 发布列车代号
3.1.x 2022.0.x Kilburn

在父工程的 pom.xml 中统一管理 Spring Cloud 依赖:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>2022.0.4</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

4. 微服务项目结构规划(模块划分)

我们采用模块化分层结构划分服务,所有服务统一注册到 Nacos,并通过配置中心动态管理配置:

cloudtask
├── auth-service         # 认证服务
│   ├── oauth2 配置       # OAuth2 + JWT 认证
│   └── 权限管理          # 角色与资源控制
├── user-service         # 用户服务
│   ├── 用户管理         # CRUD 操作
│   └── 个人设置         # 动态配置示例
├── task-service         # 任务服务
│   ├── 任务分配         # 异步任务处理
│   ├── 状态跟踪         # 链路追踪集成
│   └── 分布式锁         # Redisson 锁示例
├── gateway-service      # 网关服务
│   ├── 路由配置         # Gateway 路由与过滤
│   └── 安全拦截         # OAuth2 集成
├── common               # 通用模块(工具类、统一响应)
│   ├── 异常处理         # 全局异常处理
│   └── 工具类           # 日期、JSON 处理
├── user-api             # 提供给其他服务的 OpenFeign 接口
│   ├── UserClient      # Feign 客户端
│   └── DTO 定义         # 数据传输对象
├── starter-task-common  # 自定义 starter(切面、注解)
│   ├── 任务注解         # 自定义 @TaskAspect
│   └── 自动配置         # Starter 配置
├── config-service       # 配置中心
│   ├── 动态配置         # Nacos Config 示例
│   └── 多环境支持       # 开发/生产切换
├── tracing-service      # 链路追踪
│   ├── Sleuth 配置      # 分布式追踪
│   └── Zipkin 集成      # UI 展示
├── monitor-service      # 监控与告警
│   ├── Micrometer 配置  # 指标收集
│   ├── Prometheus 集成  # 指标推送
│   └── Grafana 仪表盘   # 可视化
├── transaction-service  # 分布式事务
│   ├── Seata 配置       # AT/TCC 模式
│   └── 事务协调         # 跨服务事务
├── lock-service         # 分布式锁与缓存
│   ├── Redisson 配置    # 分布式锁
│   └── Caffeine 缓存    # 本地缓存
├── api-doc-service      # API 文档与测试
│   ├── Springdoc 配置   # Swagger UI
│   └── 测试用例         # 自动化测试
├── mesh-service         # 服务网格(模拟)
│   ├── Istio 配置       # 流量管理
│   └── 故障注入         # 容错测试
├── notify-service       # 消息通知服务(Kafka + Stream)
│   ├── Kafka 生产/消费    # 通道定义 + 消息监听
│   └── 异步解耦通信       # 通知、提醒、事件发布

5. 搭建第一个 Spring Boot 微服务

微服务架构的前提之一是“配置统一、管理集中”。因此第一步建议先构建 config-service 模块,作为全局配置中心接入点。

配置中心微服务搭建实战(Nacos Config)

第一步:添加模块 config-service
创建 cloudtask/config-service 模块,并添加如下启动类:

1
2
3
4
5
6
@SpringBootApplication
public class ConfigServiceApp {
  public static void main(String[] args) {
    SpringApplication.run(ConfigServiceApp.class, args);
  }
}

第二步:配置 application.yml 和 bootstrap.yml 文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server:
  port: 8888

spring:
  application:
    name: config-service
  profiles:
    active: dev
  config:
    import: nacos:config-service-dev.yaml?namespace=47bd187a-3446-43a7-8a56-573dc8abc147&serverAddr=127.0.0.1:8848
  
  cloud:
    nacos:
      discovery:
        namespace: 47bd187a-3446-43a7-8a56-573dc8abc147

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    refresh:
      enabled: true
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
spring:
  application:
    name: gateway-service

  cloud:
    nacos:
      config:
        server-addr: nacos:8848
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml
      discovery:
        server-addr: nacos:8848
        namespace: public

  profiles:
    active: dev

第三步:在 Nacos 中添加远程配置文件 进入 Nacos 控制台,新增配置:

  • Data IDconfig-service-dev.yaml
  • GroupDEFAULT_GROUP
  • 配置内容示例:
1
2
config:
  title: "Spring Cloud 微服务配置中心启动成功"

第四步:编写 Controller 验证动态配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {

  @Value("${config.title:默认配置}")
  private String title;

  @GetMapping("/title")
  public String getTitle() {
    return title;
  }
}

访问接口验证: http://localhost:8888/config/title

修改 Nacos 中配置后点击 刷新配置 或使用 spring-cloud-starter-actuator 暴露 /actuator/refresh 刷新。然后 http://localhost:8888/actuator/env 在结果中搜索 config.title,看看它是从哪儿加载的。

第五步:POM文件

pom文件
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
父pom文件

<?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.yutao</groupId>
  <artifactId>cloudtask2</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>
  <modules>
    <module>config-service</module>
  </modules>

  <name>cloudtask2</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <java.version>21</java.version>
    <spring.boot.version>3.1.7</spring.boot.version>
    <spring.cloud.version>2022.0.4</spring.cloud.version>
    <spring.cloud.alibaba.version>2023.0.3.3</spring.cloud.alibaba.version>
    <maven.compiler.release>${java.version}</maven.compiler.release>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </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>

      <!-- Alibaba Nacos -->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>${spring.cloud.alibaba.version}</version>
      </dependency>
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>${spring.cloud.alibaba.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <scope>test</scope>
    </dependency>
    <!-- Optionally: parameterized tests support -->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-params</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement>
      <plugins>
        <!-- 编译插件 -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.11.0</version>
          <configuration>
            <release>${java.version}</release>
          </configuration>
        </plugin>
        
        <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
          <version>${spring-boot.version}</version>
          <executions>
            <execution>
              <goals>
                <goal>repackage</goal>
              </goals>
            </execution>
          </executions>
        </plugin>

        <!-- 清理插件(可选) -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.3.1</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
config-servie的pom文件
<?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>com.yutao</groupId>
          <artifactId>cloudtask2</artifactId>
          <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>com.yutao</groupId>
    <artifactId>config-service</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- Spring Boot 核心 -->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter</artifactId>
        </dependency>
    
        <!-- Spring Boot Web -->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <!-- Spring Cloud Nacos Config -->
        <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!-- 可选:Nacos Discovery(如果需要注册自身) -->
        <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    
        <!-- 动态刷新配置所需 -->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    
        <!-- 暴露刷新端点 -->
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
        
      </dependencies>

</project>

总结

本篇我们完成了:

  • 微服务架构的认知与生态组件介绍
  • 项目结构模块化设计
  • 首个微服务模块 config-service 的构建与接入 Nacos 配置中心

后续章节将继续接入服务注册中心 Nacos,搭建完整的服务注册与发现机制,并逐步构建其他核心服务模块。