前沿技术 · 微服务

Spring Cloud 不是一个框架,而是微服务治理的工具箱。本页基线版本:Spring Cloud 2023.0.x(Leyton)+ Spring Cloud Alibaba 2023.0.1.x,对应 Spring Boot 3.2+。版本号是这门课的命根子——Spring Cloud 与 Spring Boot 必须严格对应,对不上号启动就报错。不确定的 API 一律以官方文档最新稳定版为准,本页不编造。

1
第 1 节 · 最新版本与兼容性矩阵
Version & Compatibility Matrix

这一页最值钱的一张表。启动报错、NoSuchMethodError、Bean 找不到,九成是版本没对上。Spring C

进入本节 →
2
第 2 节 · 什么是微服务,为什么需要 Spring Cloud
Microservices & Spring Cloud at a Glance

先说一句大实话:把一个单体应用拆成一堆小服务容易,拆完之后谁来管它们才是难题。服务 A 怎么知道服务 B 的地址?100

进入本节 →
3
第 3 节 · 服务注册与发现:Nacos
Service Registration & Discovery with Na

第一个灵魂问题:服务 A 怎么找到服务 B 的地址?单体里直接 localhost:8080 写死就行。微服务里服务 B

进入本节 →
4
第 4 节 · 配置中心:Nacos Config
Centralized Configuration with Nacos

第二个灵魂拷问:100 个服务改个日志级别,要改 100 个文件再重启 100 次?单体里配置写在 applicatio

进入本节 →
5
第 5 节 · 服务调用:OpenFeign
Declarative HTTP Client with OpenFeign

服务之间要互相调接口。用 RestTemplate 吧,拼 URL、设 header、转 JSON,一堆样板代码。Ope

进入本节 →
6
第 6 节 · API 网关:Spring Cloud Gatewa
Spring Cloud Gateway

第三个灵魂问题:前端要调 10 个服务,难道让前端记住 10 个地址?不能。所有请求必须从一个大门进来,这个大门就是 A

进入本节 →
7
第 7 节 · 熔断降级:Sentinel
Flow Control & Circuit Breaking with Sen

第四个救命问题:一个服务挂了,不能拖死全家。下单服务要调用户服务查信息,结果用户服务因为数据库挂了卡住不返回,下单服务的

进入本节 →
8
第 8 节 · 链路追踪:Micrometer Tracing +
Distributed Tracing

第五个问题:一个请求经过 5 个服务,哪一步慢了?用户反馈"下单页面卡了 8 秒",你查日志:网关日志在、订单服务日志在

进入本节 →
9
第 9 节 · 消息驱动:Spring Cloud Stream 与
Message-Driven Microservices

同步调用(Feign)有个问题:下单服务要同时调用户、库存、优惠券三个服务,任何一个慢都拖慢下单接口。而且这三个服务挂了

进入本节 →
10
第 10 节 · 分布式事务:Seata
Distributed Transactions with Seata

第六个终极难题:跨服务转账,A 扣了钱 B 没加上怎么办?单体里一个 @Transactional 全搞定。微服务里 A

进入本节 →
11
第 11 节 · 微服务最佳实践与坑
Best Practices & Pitfalls

工具会用只是第一步,怎么拆、怎么管才是真功夫。下面这十条,是从无数线上事故里攒出来的经验,踩过一次就懂了。

进入本节 →
12
第 12 节 · 小项目实战:电商微服务三件套
Mini E-Commerce with Nacos + Gateway + F

把前面学的串起来,搭一个最小可跑的电商:user-service(用户)+ order-service(订单)+ pro

进入本节 →
13
第 13 节 · 完整案例:电商下单 + 分布式事务
End-to-End Order Flow with Seata

上一章搭了"三件套",这一章把最后一块拼图Seata 分布式事务加上,凑成一个接近真实的下单链路:下单 → 扣库存 →

进入本节 →
14
第 14 节 · 分布式事务深水区:从 2PC 到最终一致性
Distributed Transactions · 2PC / TCC / S

第 9 章我们认识了 Seata 和 @GlobalTransactional,但那是"会用"。这一章回答更难的问题:为

进入本节 →
15
第 15 节 · 可观测性三件套落地:日志、指标、链路追踪
Observability in Practice · Micrometer T

微服务最难的不是写代码,是出事之后定位不到问题。第 7 章我们讲了链路追踪的原理,这一章讲怎么真的把它落地到生产:Spr

进入本节 →
16
第 16 节 · 契约测试与 GraphQL 网关:让上下游"改接口不
Contract Testing & GraphQL Gateway · Spr

服务拆开之后,有两个问题会反复出现,而且都很痛。第一个是"接口改动炸下游":订单服务改了个字段名,库存服务上线才发现调用

进入本节 →
测

小结与自测

Recap & Self-Check

这一页把微服务治理的工具箱过了一遍:注册中心 Nacos、配置中心 Nacos Config、声明式调用 OpenFeign、网关 Gateway、熔断 Sentinel、链路追踪 Micrometer Tracing、消息驱动 RocketMQ、分布式事务 Seata。工具本身不复杂,复杂的是它们之间怎么配合。下面几道自测题,能答上来就算入门了。

小练习 · Spring Cloud

1.(概念题)为什么微服务需要注册中心?如果不引入注册中心,服务 A 要调服务 B,会遇到什么问题?

查看答案

答案:服务 B 有多个实例,IP 和端口会变(扩容、宕机、重启)。不引入注册中心,A 就得把 B 的地址硬编码,B 一变 A 就得改代码重新部署。注册中心让所有服务启动时报到,调用方按服务名问注册中心拿可用地址,自动感知上下线。解析:这就是"服务发现"的本质——把"地址"从代码里抽出来,交给中间件管。

2.(版本题)你用 Spring Boot 3.2.x,应该选哪个版本的 Spring Cloud?为什么版本必须严格对应?

查看答案

答案:Spring Boot 3.2.x 对应 Spring Cloud 2023.0.x(Leyton),再配 Spring Cloud Alibaba 2023.0.1.x。解析:Spring Cloud 的 starter 内部依赖了 Spring Boot 的具体 API(比如配置加载方式、Actuator 端点)。版本不匹配时,老 starter 调用了新 Spring Boot 里已经改名/删除的方法,启动直接 NoSuchMethodError。去官方 Wiki 的 Release Train 对照表查,别靠猜。

3.(排查题)订单服务通过 Feign 调用户服务,每次调用都报 ReadTimeoutException,但用户服务本身是正常的。可能是什么原因?怎么解决?

查看答案

答案:最可能是 Feign 默认超时太短(老版本 read timeout 默认 1 秒),而用户服务的接口(比如查数据库 + 远程调用)响应超过了这个时间。解决:在 application.yml 里显式配置 feign.client.config.default.connect-timeout 和 read-timeout,调到合理值(比如 5000ms)。同时确认是不是用户服务本身真的慢,慢的话要先优化下游。

4.(设计题)一个电商系统,下单后需要:扣库存(强一致,立刻要知道成没成)、发优惠券(不急,晚几秒没事)、给用户发短信(完全异步)。这三个动作分别该用 Feign 同步调用,还是发 MQ 异步消息?为什么?

查看答案

参考答案:扣库存用 Feign 同步——下单必须立刻知道库存够不够,不够要马上失败。发优惠券和发短信用 MQ 异步——下单接口不等它们做完,发个消息出去就返回,它们后台慢慢处理。解析:这就是"同步 vs 异步"的判断标准:调用结果是否影响当前请求的返回值。影响就同步,不影响就异步解耦。

5.(熔断题)Sentinel 的熔断器有哪三个状态?从"关闭"到"打开"是什么触发的?"半开"状态下做什么?

查看答案

答案:关闭(Closed,正常通过)→ 打开(Open,直接走降级,不真调下游)→ 半开(Half-Open,放一个请求试探)。触发打开:错误率或慢调用比例超过阈值。半开:过一段时间放一个请求过去,如果成功就关闭熔断器恢复正常,如果失败就继续打开。解析:这套状态机就是保险丝逻辑——别硬顶着故障打下游,先断开,过会儿探一下。

6.(版本题)你用 Spring Boot 3.2.5,启动时报 NoSuchMethodError: org.springframework.cloud....,最可能的根因和排查顺序?

查看答案

答案:九成是版本没对上。排查:① 看 dependency:tree 里 spring-cloud-dependencies 和 spring-cloud-alibaba-dependencies 实际版本;② 对照官方 Release Train 表,确认 Boot 3.2.5 该配 2023.0.x、Alibaba 该配 2023.0.1.x;③ 把三者统一在 dependencyManagement 里,删掉子模块写死的版本号;④ 清本地仓库重新拉。

7.(设计题)网关要按用户 ID 限流,怎么实现?

查看答案

参考答案:用 RequestRateLimiter 过滤器,自定义一个 KeyResolver,从 JWT 里解析出 userId 作为限流 key(而不是默认的 IP)。Redis 按 userId 分别计数,这样每个用户独立令牌桶,互不影响。

8.(事务题)下单要扣库存(stock-service)和扣余额(account-service),你会选 AT 还是 TCC?为什么?

查看答案

参考答案:普通电商选 AT——无侵入、开发快,@GlobalTransactional 一贴就行。如果是资金类、对性能和一致性要求极高、且 AT 的全局锁成为瓶颈,才上 TCC。前提是团队愿意承担写三套接口的成本。

9.(运维题)Sentinel 控制台配的流控规则,发版后发现没了,怎么根治?

查看答案

答案:控制台规则默认存内存,重启即丢。根治是把规则持久化到 Nacos:业务服务从 Nacos 读规则数据源,控制台改规则时同步写 Nacos,形成"控制台 ↔ Nacos ↔ 各服务"的闭环,重启不丢、多实例一致。

10.(架构题)给你一个"用户注册后要发欢迎邮件、加积分、写 BI 报表"的需求,怎么设计调用方式?

查看答案

参考答案:注册主流程只做"写用户"这一件强一致的事,然后发一条"用户已注册"的 MQ 消息。邮件、积分、BI 各自订阅这个 Topic 异步消费,互不阻塞、互不影响、新增需求只加消费者。这就是"同步写核心、异步广播周边"。

下一步

微服务是个无底洞,别想着一周学完。建议路线:① 把本页小项目在本地跑通;② 挑一个组件(比如 Nacos)读官方文档深入;③ 去看 spring-cloud-alibaba 官方 GitHub 的 samples。下一页我们去聊 Spring AI——把 Java 也接上大模型。
记
这一页的核心

① Spring Cloud 是工具箱,不是银弹;团队小、业务没跑通前别硬拆。

② 版本号是命根子,Spring Boot / Spring Cloud / Alibaba 三者必须对应。

③ 每个组件都解决一个具体问题:注册(找服务)、配置(集中管)、Feign(调服务)、网关(统一入口)、Sentinel(防雪崩)、Seata(跨库事务)。

源

推荐学习资源

Where to Go Next

下面这些是官方和社区最权威的资料,遇到不确定的 API 或版本问题,优先查这里。本页所有版本号和 API 写法,都以这些官方文档最新稳定版为准——生态迭代很快,本文档写于某个时间点,你读的时候可能已经更新。

资源用途
Spring Cloud 官方文档查版本对应表(Release Train)、Gateway/OpenFeign 配置项。
Spring Cloud Alibaba 官方 WikiNacos/Sentinel/Seata 中文文档,国内最权威。
Nacos 官方文档注册中心、配置中心、灰度发布的完整说明。
Sentinel GitHub流控/降级规则、规则持久化到 Nacos 的方案。
Seata 官方文档四种模式、AT 模式原理、undo_log 建表脚本。
最后一句忠告

微服务不是学出来的,是被线上事故打出来的。新手最容易犯的错是"学一堆名词,一个都没用过"。正确姿势:本地把本页那个电商小项目跑起来,然后故意把 user-service 停掉看降级、把 Nacos 配改了看热刷新、用 Sentinel 控制台配一条流控规则看限流——动手一次,胜过看十遍教程。

四周学习路线

阶段做什么
第 1 周装 Nacos,把两个服务注册上去,跑通服务发现。
第 2 周加 Gateway 网关 + OpenFeign,跑通服务间调用。
第 3 周加 Sentinel 熔断,故意停掉一个服务看降级。
第 4 周补链路追踪、配置热刷新,理解消息队列和分布式事务原理。