背景
本文是《Java 后端从小白到大神》修仙系列之框架学习,Spring Cloud 微服务实战系列的 第一篇
。Spring Cloud 是构建微服务架构的基石,拥有完整的服务治理生态,在云原生架构中广泛应用。本系列将从架构认知到实际工程,逐步构建一套企业级 Spring Cloud 微服务项目。
文章概览
微服务体系初识与工程搭建实战:
- 微服务架构演进与痛点解析
- Spring Cloud 全景图谱及主流组件
- 微服务工程模块划分与父子结构搭建
- Nacos 配置中心的接入与配置管理
- 搭建第一个微服务:配置中心
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 ID:
config-service-dev.yaml
- Group:
DEFAULT_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,搭建完整的服务注册与发现机制,并逐步构建其他核心服务模块。