<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dubbo 3 on Liangweidong's blog</title><link>https://liangweidonggood.github.io/tags/dubbo-3/</link><description>Recent content in Dubbo 3 on Liangweidong's blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 09 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://liangweidonggood.github.io/tags/dubbo-3/index.xml" rel="self" type="application/rss+xml"/><item><title>技术选型:为什么最终选了 Spring Cloud Alibaba + Dubbo 3</title><link>https://liangweidonggood.github.io/p/ji-zhu-xuan-xing/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0000</pubDate><guid>https://liangweidonggood.github.io/p/ji-zhu-xuan-xing/</guid><description>&lt;img src="https://liangweidonggood.github.io/p/ji-zhu-xuan-xing/image/cover.jpg" alt="Featured image of post 技术选型:为什么最终选了 Spring Cloud Alibaba + Dubbo 3" /&gt;&lt;h1 id="技术选型为什么最终选了-spring-cloud-alibaba--dubbo-3"&gt;技术选型:为什么最终选了 Spring Cloud Alibaba + Dubbo 3
&lt;/h1&gt;
 &lt;blockquote&gt;
 &lt;p&gt;Java Web 微服务系列 · 第 4 篇 · 技术选型
阅读时长:约 45 分钟
本文写于 2026 年 6 月
配套版本:Spring Cloud Alibaba 2022.0.0.0 / Spring Cloud 2022.0.x / Spring Boot 3.x / Dubbo 3.2.x&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="引子第一次技术评审会上我翻的车"&gt;引子:第一次技术评审会上我翻的车
&lt;/h2&gt;&lt;p&gt;2019 年我第一次主导微服务架构的技术评审,信心满满地写了一份**《微服务技术选型方案 v1.0》**——30 多页 PPT,封面是 Spring Cloud 全家桶,封底是 Netflix OSS 矩阵。&lt;/p&gt;
&lt;p&gt;会上 CTO 第一个问题:&amp;quot;&lt;strong&gt;Netflix OSS 不是 2018 年就进维护模式了吗?你为什么还在用 Zuul、Hystrix、Ribbon?这些组件再过一年就只剩 EOL 公告了。&lt;/strong&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;我答不上来。&lt;/p&gt;
&lt;p&gt;第二个问题是 DBA 提的:&amp;ldquo;Hystrix 停更,你打算用什么做熔断降级?Resilience4j 吗?它和 Spring Cloud 的集成做完了吗?限流规则怎么持久化?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;第三个问题是测试主管:&amp;ldquo;你选 Feign 做内部调用,Mock 怎么做?WireMock 集成测过了吗?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;第四个问题是 SRE 主管:&amp;ldquo;Dubbo 在你们方案里完全没提。咱们的核心交易系统跑了 3 年 Dubbo,你打算全部改成 Feign?业务改造的工时你估过吗?为什么不能&lt;strong&gt;内部用 Dubbo、对外用 REST&lt;/strong&gt;?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;会议开了 2 小时,30 多页 PPT 被翻烂了 3 个问题,最后 CTO 说:&amp;quot;&lt;strong&gt;这周重写,先把选型原则列出来,再选技术。别上来就写 PPT。&lt;/strong&gt;&amp;quot;&lt;/p&gt;
&lt;p&gt;这是 2019 年我交的第一笔&amp;quot;学费&amp;quot;。本文把那次踩过的坑,以及后来慢慢悟出来的&lt;strong&gt;技术选型方法论&lt;/strong&gt;,完整地写出来。&lt;strong&gt;本文 8000+ 字,一次性把&amp;quot;为什么是 Spring Cloud Alibaba + Dubbo 3 + 对外 RESTful&amp;quot;讲透&lt;/strong&gt;——给所有在做技术选型的同行参考。&lt;/p&gt;
&lt;h2 id="一核心原则好的技术选型长什么样"&gt;一、核心原则:好的技术选型长什么样
&lt;/h2&gt;&lt;p&gt;技术选型不是&amp;quot;哪个最火选哪个&amp;quot;,也不是&amp;quot;哪个最难选哪个&amp;quot;。我把这些年踩过的坑总结成&lt;strong&gt;5 条铁律&lt;/strong&gt;——前 3 条是&amp;quot;必选条件&amp;quot;,后 2 条是&amp;quot;加分项&amp;quot;。&lt;/p&gt;
&lt;h3 id="11-业务匹配--技术先进"&gt;1.1 业务匹配 &amp;gt; 技术先进
&lt;/h3&gt;&lt;p&gt;再先进的技术,解决不了你的业务问题,就是垃圾。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🛑 &lt;strong&gt;误区警示:技术先进性陷阱&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Kubernetes 是未来,Service Mesh 是未来,ServiceComb 是 Apache 顶级项目……所以我们要上!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;错。&lt;strong&gt;先进 ≠ 适用&lt;/strong&gt;。某电商公司花 200 万引入 Service Mesh,结果团队没人懂 Envoy 配置,生产事故频发,最终回滚到 Spring Cloud。这就是&amp;quot;为了先进而先进&amp;quot;的代价。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;判断方法&lt;/strong&gt;:这个技术是&lt;strong&gt;解决了我们当前 3-6 个月内的具体痛点&lt;/strong&gt;,还是&lt;strong&gt;为未来 2-3 年画饼&lt;/strong&gt;?&lt;/p&gt;
&lt;h3 id="12-团队能力--流行度"&gt;1.2 团队能力 &amp;gt; 流行度
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;没有银弹,只有适合团队的技术&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;一个 5 人的小团队,上 Istio + Envoy + Spring Cloud 全家桶 + 6 个中间件,就是灾难——&lt;strong&gt;没人能 hold 住,出了问题没人能 debug&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;判断方法:你团队里有没有人能讲清楚这个技术的&lt;strong&gt;核心原理 + 至少 2 个常见坑&lt;/strong&gt;?如果 5 个人的团队只有 1 个人懂,这就是高风险。&lt;/p&gt;
&lt;h3 id="13-社区活跃--文档齐全"&gt;1.3 社区活跃 &amp;gt; 文档齐全
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;文档可以补,社区活跃不能补&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Stars &amp;gt; 30k: 主流框架级别(Spring Cloud、Spring Cloud Alibaba 都满足)&lt;/li&gt;
&lt;li&gt;最近 6 个月有 release: 框架还活着&lt;/li&gt;
&lt;li&gt;Issue 响应时间 &amp;lt; 7 天: 出了问题能找人问&lt;/li&gt;
&lt;li&gt;中文社区活跃: 国内公司尤其重要(Stack Overflow 答案少,需要 Gitee/思否/掘金)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;反面教材&lt;/strong&gt;:Spring Cloud Netflix OSS 在 2018 年底宣布&lt;strong&gt;进维护模式&lt;/strong&gt;——Netflix 不再用它,但 Spring Cloud 还在集成它的代码。结果 Hystrix 2020 年 EOL、Zuul 1.x 2022 年 EOL、Archaius 2021 年 EOL,大量历史项目不得不重写。&lt;/p&gt;
&lt;h3 id="14-避免重复造轮子"&gt;1.4 避免重复造轮子
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;原理:开源的本质是&amp;quot;复用别人的代码,自己的代码让别人复用&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你的业务代码、领域模型、核心算法才是真正值钱的部分。&lt;strong&gt;注册中心、配置中心、熔断限流、消息队列,业界有成熟方案就别自己写&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;自己写一个 ZK 注册中心 3 个月,业界用 Nacos 1 周就搞定。&lt;strong&gt;省下的人力写业务逻辑,产出高 10 倍&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;例外&lt;/strong&gt;:如果某组件在性能/合规/功能上有硬性要求,自己造轮子是合理的。但要先确认&amp;quot;真的没有现成方案满足&amp;quot;,不要&amp;quot;为了 KPI 自研&amp;quot;。&lt;/p&gt;
&lt;h3 id="15-留有演进空间"&gt;1.5 留有演进空间
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;今天选的方案,3 年后大概率要换&lt;/strong&gt;。技术选型要选&amp;quot;&lt;strong&gt;进可攻退可守&lt;/strong&gt;&amp;ldquo;的:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;进可攻&lt;/strong&gt;:框架能跟得上社区演进(Spring Cloud 版本升级、Spring Boot 升级)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;退可守&lt;/strong&gt;:万一被淘汰,业务代码能&amp;quot;低代价&amp;quot;迁移到其他方案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;判断方法&lt;/strong&gt;:框架是不是&amp;quot;被绑定&amp;quot;在某个厂商?Dubbo 当年绑定阿里,2014-2017 几乎停止维护,吓得所有公司都迁移到 Spring Cloud。&lt;strong&gt;Spring Cloud Alibaba 现在由阿里持续投入,但核心组件(Nacos/Sentinel/Seata)都是 ASF/Apache 项目,真到那一天迁移成本低&lt;/strong&gt;。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;📌 &lt;strong&gt;实践:5 条铁律的检查清单&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在做最终决策前,把这 5 条打印出来,逐条回答:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;☐ 这个技术解决了我们&lt;strong&gt;当前 3-6 个月&lt;/strong&gt;的具体痛点吗?&lt;/li&gt;
&lt;li&gt;☐ 团队里有 ≥ 2 人能讲清楚它的&lt;strong&gt;核心原理 + 2 个常见坑&lt;/strong&gt;吗?&lt;/li&gt;
&lt;li&gt;☐ GitHub Stars &amp;gt; 30k 且&lt;strong&gt;最近 6 个月有 release&lt;/strong&gt;吗?&lt;/li&gt;
&lt;li&gt;☐ 我们能用开源方案&lt;strong&gt;避免自研&lt;/strong&gt;吗?&lt;/li&gt;
&lt;li&gt;☐ 3 年后&lt;strong&gt;业务代码能低代价迁移&lt;/strong&gt;吗?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;5 条全 Yes,放心选。4 Yes 1 No,谨慎评估。3 Yes 2 No,&lt;strong&gt;立即否决&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="二主流方案横评4-个候选的-pk"&gt;二、主流方案横评:4 个候选的 PK
&lt;/h2&gt;&lt;p&gt;明确原则后,我们把当时(2024 年,本文写于 2026 年但内部评估在 2024)市面上 4 个主流的 Java 微服务技术栈摆到台面上,9 个维度对比。&lt;/p&gt;
&lt;h3 id="21-4-个候选方案"&gt;2.1 4 个候选方案
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;方案 A:Spring Cloud Netflix OSS(纯 Netflix 系)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注册中心:Eureka&lt;/li&gt;
&lt;li&gt;配置中心:Spring Cloud Config + Git&lt;/li&gt;
&lt;li&gt;熔断降级:Hystrix(已 EOL)&lt;/li&gt;
&lt;li&gt;网关:Zuul 1.x(已 EOL)&lt;/li&gt;
&lt;li&gt;客户端负载均衡:Ribbon(已 EOL)&lt;/li&gt;
&lt;li&gt;内部调用:Feign + Ribbon&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;方案 B:Spring Cloud Consul 系&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注册中心 + 配置中心:Consul&lt;/li&gt;
&lt;li&gt;熔断:Resilience4j&lt;/li&gt;
&lt;li&gt;网关:Spring Cloud Gateway&lt;/li&gt;
&lt;li&gt;内部调用:OpenFeign&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;方案 C:纯 Dubbo 系(非 Spring Cloud)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注册中心:ZooKeeper / Nacos&lt;/li&gt;
&lt;li&gt;内部调用:Dubbo RPC&lt;/li&gt;
&lt;li&gt;网关:Dubbo 自带 / Sentinel&lt;/li&gt;
&lt;li&gt;配置中心:Disconf / Apollo / Nacos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;方案 D:Spring Cloud Alibaba(SCA)+ Dubbo 3 混合(本文最终选)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注册中心 + 配置中心:Nacos&lt;/li&gt;
&lt;li&gt;熔断限流:Sentinel&lt;/li&gt;
&lt;li&gt;分布式事务:Seata&lt;/li&gt;
&lt;li&gt;消息:RocketMQ&lt;/li&gt;
&lt;li&gt;内部调用:Dubbo 3(Triple 协议)&lt;/li&gt;
&lt;li&gt;对外网关:Spring Cloud Gateway&lt;/li&gt;
&lt;li&gt;客户端 REST:Spring MVC + OpenFeign&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-9-维度对比表"&gt;2.2 9 维度对比表
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;A. Netflix OSS&lt;/th&gt;
					&lt;th&gt;B. Spring Cloud Consul&lt;/th&gt;
					&lt;th&gt;C. 纯 Dubbo&lt;/th&gt;
					&lt;th&gt;D. &lt;strong&gt;SCA + Dubbo 3&lt;/strong&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;注册中心&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Eureka(2.x 已停更)&lt;/td&gt;
					&lt;td&gt;Consul(强一致,运维重)&lt;/td&gt;
					&lt;td&gt;ZooKeeper(运维重)&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Nacos 2.x(AP/可切 CP,运维轻)&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;配置中心&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Spring Cloud Config(界面弱)&lt;/td&gt;
					&lt;td&gt;Consul KV(无版本管理)&lt;/td&gt;
					&lt;td&gt;Apollo/Nacos 二选一&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Nacos 内置(带版本/灰度/监听)&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;熔断降级&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Hystrix(EOL)&lt;/td&gt;
					&lt;td&gt;Resilience4j(社区小)&lt;/td&gt;
					&lt;td&gt;Sentinel(需独立集成)&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Sentinel(Alibaba 原生,控制台完善)&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;API 网关&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Zuul 1.x(EOL)&lt;/td&gt;
					&lt;td&gt;Spring Cloud Gateway&lt;/td&gt;
					&lt;td&gt;需自选/自研&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Spring Cloud Gateway(响应式)&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;内部调用协议&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;HTTP/JSON(Feign)&lt;/td&gt;
					&lt;td&gt;HTTP/JSON(Feign)&lt;/td&gt;
					&lt;td&gt;Dubbo 协议(二进制)&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Triple(gRPC/HTTP2,跨语言)&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;分布式事务&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;无官方方案&lt;/td&gt;
					&lt;td&gt;无官方方案&lt;/td&gt;
					&lt;td&gt;无官方方案&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Seata(AT/TCC/SAGA/XA)&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;消息队列&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;需自选(Kafka/RabbitMQ)&lt;/td&gt;
					&lt;td&gt;同左&lt;/td&gt;
					&lt;td&gt;同左&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;RocketMQ(原生集成,事务消息)&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;社区活跃度&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;停止维护&lt;/td&gt;
					&lt;td&gt;中等&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;高(国内主流,中文资料丰富)&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;国内生产案例&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;大量遗留项目&lt;/td&gt;
					&lt;td&gt;中型公司&lt;/td&gt;
					&lt;td&gt;阿里系老项目&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;阿里、滴滴、字节(部分)、小米等头部&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🎯 &lt;strong&gt;避坑点:为什么 A 方案直接被否&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Netflix OSS 在 2018 年宣布进维护模式,2020-2022 年&lt;strong&gt;多个核心组件 EOL&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hystrix:EOL 2020 年&lt;/li&gt;
&lt;li&gt;Ribbon:EOL 2022 年&lt;/li&gt;
&lt;li&gt;Zuul 1.x:EOL 2022 年&lt;/li&gt;
&lt;li&gt;Archaius:EOL 2021 年&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这意味着&lt;strong&gt;所有基于 Netflix OSS 的项目都要做技术债清理&lt;/strong&gt;。还在用 A 方案的项目,3-5 年内必须迁移。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="23-4-个候选的优缺点总结"&gt;2.3 4 个候选的优缺点总结
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;方案 A(Spring Cloud Netflix OSS)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ 优点:文档多、入门快、很多老项目在用&lt;/li&gt;
&lt;li&gt;❌ 缺点:&lt;strong&gt;多个核心组件已 EOL&lt;/strong&gt;,长期不可持续&lt;/li&gt;
&lt;li&gt;❌ 致命伤:Netflix 自己都不用这套了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结论:不选&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;方案 B(Spring Cloud Consul)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ 优点:Consul 自带服务发现 + 配置中心 + 健康检查,组件少&lt;/li&gt;
&lt;li&gt;❌ 缺点:Consul 是 Go 写的,JVM 团队排查问题需要跨语言;Resilience4j 社区相对小&lt;/li&gt;
&lt;li&gt;⚠️ 适用:中等规模、对 Consul 运维有经验的团队&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结论:备选&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;方案 C(纯 Dubbo 系)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ 优点:内部 RPC 性能强(Dubbo 协议);社区活跃&lt;/li&gt;
&lt;li&gt;❌ 缺点:Spring Cloud 生态对接需要自己包装;前端/移动端调用 Dubbo 不方便(Dubbo 接口没有 Swagger 文档)&lt;/li&gt;
&lt;li&gt;⚠️ 适用:&lt;strong&gt;已有 Dubbo 基础&lt;/strong&gt;且&lt;strong&gt;外部调用走独立 REST 服务的项目&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结论:部分选(只取其内部 RPC 优势)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;方案 D(SCA + Dubbo 3 混合)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ 优点:Nacos/Sentinel/Seata/RocketMQ 全家桶,国内生态成熟,Dubbo 3 Triple 协议&lt;strong&gt;兼顾性能与跨语言&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;⚠️ 缺点:组件多,学习曲线较陡;Seata 分布式事务对业务侵入较高&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;结论:选&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;原理:为什么是&amp;quot;混合&amp;quot;而不是单一技术栈&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;微服务全家桶&amp;quot;听上去很美好,但实际工程中:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;内部 RPC&lt;/strong&gt;:性能敏感,Dubbo 3 Triple 协议(基于 HTTP/2)比 Feign + JSON 快 3-5 倍&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对外 REST&lt;/strong&gt;:生态好、易调试、跨语言、Swagger/Knife4j 文档友好&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;强制只用一种&lt;/strong&gt;,要么内部性能差(全 Feign),要么对外不友好(全 Dubbo)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;混合是工程最优解&lt;/strong&gt;——各取所长,代价是要多维护一套调用框架。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="三为什么最终选了-spring-cloud-alibaba"&gt;三、为什么最终选了 Spring Cloud Alibaba
&lt;/h2&gt;&lt;p&gt;5 个核心理由,从业务匹配到社区生态,逐条拆解。&lt;/p&gt;
&lt;h3 id="31-组件全家桶开箱即用"&gt;3.1 组件全家桶,开箱即用
&lt;/h3&gt;&lt;p&gt;Spring Cloud Alibaba 提供&lt;strong&gt;完整闭环&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;关注点&lt;/th&gt;
					&lt;th&gt;组件&lt;/th&gt;
					&lt;th&gt;对标 Netflix&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;注册中心&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Nacos&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Eureka&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;配置中心&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Nacos&lt;/strong&gt;(同一集群)&lt;/td&gt;
					&lt;td&gt;Spring Cloud Config&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;熔断限流&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Sentinel&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Hystrix&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;分布式事务&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Seata&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;(无对标)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;消息队列&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;RocketMQ&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;(无对标)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;分布式追踪&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;SkyWalking&lt;/strong&gt;(可选)&lt;/td&gt;
					&lt;td&gt;Sleuth + Zipkin&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;API 网关&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Spring Cloud Gateway&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Zuul/Gateway&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;内部 RPC&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Dubbo 3&lt;/strong&gt;(选配)&lt;/td&gt;
					&lt;td&gt;Feign + Ribbon&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;一套打天下,不需要像方案 B 那样东拼西凑&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="32-国内生态成熟中文资料丰富"&gt;3.2 国内生态成熟,中文资料丰富
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nacos&lt;/strong&gt;:阿里开源,GitHub Stars 30k+,中文文档齐全&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sentinel&lt;/strong&gt;:阿里开源,GitHub Stars 22k+,控制台直接用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seata&lt;/strong&gt;:阿里开源,GitHub Stars 26k+,国内金融/电商大量案例&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RocketMQ&lt;/strong&gt;:阿里开源,Apache 顶级项目,GitHub Stars 21k+&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dubbo&lt;/strong&gt;:阿里开源,Apache 顶级项目,GitHub Stars 40k+&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;📌 &lt;strong&gt;实践:中文资料的价值&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;出了问题去 Stack Overflow 一搜,&lt;strong&gt;纯 Netflix 系有 90% 答案,纯 Dubbo 系有 70%,Spring Cloud Alibaba 只有 50%&lt;/strong&gt;。但 SCA 在&lt;strong&gt;思否、掘金、博客园、CSDN&lt;/strong&gt; 的中文资料&lt;strong&gt;比英文还多&lt;/strong&gt;——这是国内做技术的隐形优势。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="33-与-dubbo-兼容内部-rpc-高性能"&gt;3.3 与 Dubbo 兼容,内部 RPC 高性能
&lt;/h3&gt;&lt;p&gt;这是关键。Spring Cloud Alibaba &lt;strong&gt;官方支持 Dubbo 作为 RPC 框架&lt;/strong&gt;,通过 Nacos 做注册中心,Dubbo 服务和 Spring Cloud 服务可以&lt;strong&gt;互相发现&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这意味着:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;内部调用&lt;/strong&gt;:走 Dubbo 3 Triple 协议(基于 HTTP/2,&lt;strong&gt;性能接近 gRPC&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对外调用&lt;/strong&gt;:走 Spring MVC + OpenFeign(RESTful)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注册中心统一&lt;/strong&gt;:全部注册到 Nacos,服务治理统一&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- Spring Cloud Alibaba + Dubbo 3 同时引入,自动适配 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.alibaba.cloud&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-cloud-starter-alibaba-nacos-discovery&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.dubbo&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;dubbo-spring-boot-3-starter&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.2.10&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="34-二次封装好踩坑成本低"&gt;3.4 二次封装好,踩坑成本低
&lt;/h3&gt;&lt;p&gt;Spring Cloud Alibaba 不只是&amp;quot;组件打包&amp;rdquo;,还做了&lt;strong&gt;深度封装&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nacos 集成&lt;/strong&gt;:Spring Boot 风格的 &lt;code&gt;bootstrap.yml&lt;/code&gt; 配置,自动注册&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sentinel 集成&lt;/strong&gt;:注解 &lt;code&gt;@SentinelResource&lt;/code&gt; 一行代码接入限流&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seata 集成&lt;/strong&gt;:&lt;code&gt;@GlobalTransactional&lt;/code&gt; 注解开启全局事务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RocketMQ 集成&lt;/strong&gt;:&lt;code&gt;@RocketMQMessageListener&lt;/code&gt; 注解消费消息&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;对比自己集成&lt;/strong&gt;:Netflix 体系里 Hystrix 集成 Spring Cloud 需要自己写降级逻辑、Sentinel 已经内置了所有模式。&lt;/p&gt;
&lt;h3 id="35-商业化平滑演进路径清晰"&gt;3.5 商业化平滑,演进路径清晰
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;纯开源是底线,商业化是加分项&lt;/strong&gt;。Spring Cloud Alibaba 的核心组件都是 ASF/Apache 顶级项目或独立开源项目,&lt;strong&gt;不绑定阿里云&lt;/strong&gt;。但在需要时:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nacos → 阿里云 MSE(Nacos 商业版)&lt;/strong&gt;:零代码迁移&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sentinel → 阿里云 AHAS&lt;/strong&gt;:控制台更强大&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seata → 阿里云 GTS&lt;/strong&gt;:金融级分布式事务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RocketMQ → 阿里云 RocketMQ 商业版&lt;/strong&gt;:运维托管&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;演进路径:开源版 → 商业版 → 阿里云原生&lt;/strong&gt;——这套路径在阿里内部被验证过,适合&amp;quot;先小规模验证,再大规模上云&amp;quot;的渐进式策略。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🛑 &lt;strong&gt;误区警示:不要被&amp;quot;开源+商业版&amp;quot;绑定&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;万一&lt;/strong&gt;阿里云商业版涨价,或者你想换腾讯云/AWS,&lt;strong&gt;核心代码仍然是 Apache 开源&lt;/strong&gt;,你可以自建或迁移到其他云。这和&amp;quot;Spring Cloud 绑定 Pivotal/VMware&amp;quot;是同一逻辑——&lt;strong&gt;底层开源是退路,商业版是快车道&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="四sca-核心组件拆解"&gt;四、SCA 核心组件拆解
&lt;/h2&gt;&lt;p&gt;SCA 的 6 大核心组件逐一拆解。每个组件给出:&lt;strong&gt;是什么 / 解决什么问题 / 核心特性 / 版本注意事项&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="41-nacos注册中心--配置中心二合一"&gt;4.1 Nacos:注册中心 + 配置中心二合一
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;是什么&lt;/strong&gt;:阿里开源的动态服务发现、配置管理和服务管理平台。GitHub Stars 30k+。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决什么问题&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;服务注册与发现&lt;/strong&gt;:服务启动时注册到 Nacos,调用方从 Nacos 拉取服务列表&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态配置&lt;/strong&gt;:配置变更实时推送到所有客户端,无需重启&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;健康检查&lt;/strong&gt;:自动剔除不健康实例&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;核心特性&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AP/CP 模式可切换&lt;/strong&gt;:默认 AP(可用性优先,类似 Eureka),集群模式可切 CP(强一致,类似 ZooKeeper)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置灰度&lt;/strong&gt;:支持 Beta 发布(指定 IP 生效)、灰度比例、配置版本回滚&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Namespace + Group + DataId&lt;/strong&gt;:三段命名空间,适合多环境/多租户&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;版本注意&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nacos 2.x&lt;/strong&gt; 必须用 &lt;strong&gt;Nacos 2.x 客户端&lt;/strong&gt;(1.x 客户端与 2.x 服务端不兼容!)&lt;/li&gt;
&lt;li&gt;Spring Cloud Alibaba 2022.0.0.0 内置 Nacos Client 2.3.x&lt;/li&gt;
&lt;li&gt;Nacos 集群至少 3 节点(避免脑裂),生产环境&lt;strong&gt;强烈不建议单机模式&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# bootstrap.yml 关键配置&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spring&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;order-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;nacos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;discovery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;server-addr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nacos-cluster:8848&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;prod &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# namespace 隔离&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;group&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ORDER_GROUP &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 业务分组&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;server-addr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nacos-cluster:8848&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;file-extension&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;refresh-enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 开启配置自动刷新&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="42-sentinel流量治理的瑞士军刀"&gt;4.2 Sentinel:流量治理的瑞士军刀
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;是什么&lt;/strong&gt;:阿里开源的流量控制、熔断降级、系统负载保护组件。GitHub Stars 22k+。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决什么问题&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;限流&lt;/strong&gt;:QPS 限流、并发线程数限流、关联限流(订单限流连带支付限流)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;熔断&lt;/strong&gt;:慢调用比例、异常比例、异常数三种熔断策略&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;热点参数限流&lt;/strong&gt;:同一接口不同参数分别限流(如 &lt;code&gt;/order/query?id=100&lt;/code&gt; 和 &lt;code&gt;/order/query?id=200&lt;/code&gt; 单独计数)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统自适应限流&lt;/strong&gt;:根据 CPU、Load、入口 QPS 动态调整限流阈值&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;授权规则&lt;/strong&gt;:黑白名单(只允许特定 IP 访问)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;对比 Hystrix&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hystrix 已 EOL,Sentinel 是事实标准&lt;/li&gt;
&lt;li&gt;Sentinel &lt;strong&gt;控制台开箱即用&lt;/strong&gt;(Hystrix Dashboard 早已不维护)&lt;/li&gt;
&lt;li&gt;Sentinel 支持&lt;strong&gt;秒级规则推送&lt;/strong&gt;(Hystrix 是分钟级)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;版本注意&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sentinel 1.8.x 配套 SCA 2022.0.0.0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sentinel Dashboard 必须独立部署&lt;/strong&gt;,Sentinel Client 启动时连接 Dashboard 拉取规则&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 注解式限流&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@SentinelResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;createOrder&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;blockHandler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;handleBlock&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fallback&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;handleFallback&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;createOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 业务逻辑&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderRepository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toEntity&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;handleBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BlockException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BusinessException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;系统繁忙,请稍后重试&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;handleFallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Throwable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;订单创建降级&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deferred&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="43-seata分布式事务的标准答案"&gt;4.3 Seata:分布式事务的标准答案
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;是什么&lt;/strong&gt;:阿里开源的分布式事务解决方案,提供 AT、TCC、SAGA、XA 四种模式。GitHub Stars 26k+。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决什么问题&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;跨服务的数据一致性问题(下单扣库存 + 创建订单 + 扣账户余额)&lt;/li&gt;
&lt;li&gt;4 种事务模式,适配不同业务场景&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;4 种模式对比&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;一致性&lt;/th&gt;
					&lt;th&gt;性能&lt;/th&gt;
					&lt;th&gt;业务侵入&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;AT&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;最终一致&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;低(自动回滚)&lt;/td&gt;
					&lt;td&gt;80% 业务,推荐首选&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;TCC&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;最终一致&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;高(3 个方法)&lt;/td&gt;
					&lt;td&gt;高并发/金融&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;SAGA&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;最终一致&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;中(补偿逻辑)&lt;/td&gt;
					&lt;td&gt;长事务/跨多服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;XA&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;强一致&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
					&lt;td&gt;低(数据库原生)&lt;/td&gt;
					&lt;td&gt;强监管行业&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;版本注意&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Seata Server 必须独立部署&lt;/strong&gt;(1.6+ 性能优化明显)&lt;/li&gt;
&lt;li&gt;Seata AT 模式依赖 &lt;strong&gt;undo_log 表&lt;/strong&gt;(在每个业务库创建,Seata 自动管理)&lt;/li&gt;
&lt;li&gt;业务库需要开启 &lt;strong&gt;binlog&lt;/strong&gt;(MySQL)或 &lt;strong&gt;WAL&lt;/strong&gt;(PostgreSQL)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// @GlobalTransactional 一行开启全局事务&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@GlobalTransactional&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;create-order&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rollbackFor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderResult&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;createOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 1. 创建订单&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 2. 扣库存(Dubbo 调用)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inventoryService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSkuId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getQuantity&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 3. 扣账户余额(Dubbo 调用)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;accountService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;debit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getUserId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAmount&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderResult&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 任一环节抛异常,Seata 自动回滚所有操作&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;🎯 &lt;strong&gt;避坑点:Seata 选模式的决策树&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;业务是否涉及&lt;strong&gt;钱&lt;/strong&gt;?→ TCC(可控性强)&lt;/li&gt;
&lt;li&gt;事务链路是否**≤ 3 个服务**?→ AT(最简单)&lt;/li&gt;
&lt;li&gt;事务链路**&amp;gt; 3 个服务**?→ SAGA(避免长时间锁资源)&lt;/li&gt;
&lt;li&gt;强监管行业(银行/证券)?→ XA(强一致)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;80% 业务选 AT 即可&lt;/strong&gt;,别上来就用 TCC(侵入高,3 个方法要写)。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="44-rocketmq消息中间件的工业级选择"&gt;4.4 RocketMQ:消息中间件的工业级选择
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;是什么&lt;/strong&gt;:阿里开源,Apache 顶级项目,低延迟、高可靠、高吞吐的消息队列。GitHub Stars 21k+。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决什么问题&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;异步解耦&lt;/strong&gt;:订单创建后异步发短信、发优惠券&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;削峰填谷&lt;/strong&gt;:秒杀时把请求先入队列,后台慢慢处理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事务消息&lt;/strong&gt;:下单+扣库存分布式事务的&amp;quot;本地消息表&amp;quot;替代方案&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;顺序消息&lt;/strong&gt;:同一订单的消息严格按顺序处理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定时消息&lt;/strong&gt;:延迟投递(15 分钟未支付取消订单)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;核心特性&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;事务消息&lt;/strong&gt;:生产端先发 prepared 消息,本地事务 commit 后发 commit,失败发 rollback,RocketMQ 自动清理 prepared 消息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;严格顺序&lt;/strong&gt;:同一队列的消息严格 FIFO&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;百万级 TPS&lt;/strong&gt;:实测单集群 100 万+ TPS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;金融级可靠性&lt;/strong&gt;:同步双写 + 异步刷盘,数据不丢&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;对比 Kafka&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kafka 优势:&lt;strong&gt;超高吞吐&lt;/strong&gt; + 生态成熟(大数据领域标配)&lt;/li&gt;
&lt;li&gt;RocketMQ 优势:&lt;strong&gt;事务消息 + 顺序消息 + 定时消息&lt;/strong&gt;(业务领域更友好)&lt;/li&gt;
&lt;li&gt;选型建议:&lt;strong&gt;业务消息(订单/支付/通知)选 RocketMQ,日志/大数据管道选 Kafka&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 事务消息示例&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@RocketMQTransactionListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;txProducerGroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;order-tx-group&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderTransactionListener&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;implements&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RocketMQLocalTransactionListener&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RocketMQLocalTransactionState&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;executeLocalTransaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 本地事务:创建订单&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;OrderRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RocketMQLocalTransactionState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RocketMQLocalTransactionState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ROLLBACK&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 回查机制:RocketMQ 定期询问未确认的消息&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RocketMQLocalTransactionState&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;checkLocalTransaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 根据 msg 查询订单是否创建成功&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKeys&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;COMMIT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ROLLBACK&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="45-spring-cloud-gateway对外-api-网关"&gt;4.5 Spring Cloud Gateway:对外 API 网关
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;是什么&lt;/strong&gt;:Spring Cloud 官方推出的 &lt;strong&gt;响应式 API 网关&lt;/strong&gt;,基于 Spring WebFlux + Reactor Netty。性能是 Zuul 1.x 的 1.6 倍。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决什么问题&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;统一入口&lt;/strong&gt;:所有外部请求先到 Gateway,做鉴权/限流/路由&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态路由&lt;/strong&gt;:根据请求路径/Header/参数动态转发到不同服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;过滤器链&lt;/strong&gt;:鉴权 → 限流 → 日志 → 灰度 → 转发&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨域处理&lt;/strong&gt;:统一 CORS 配置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协议转换&lt;/strong&gt;:HTTP/JSON → Dubbo/HTTP2 内部协议&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;核心特性&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;断言(Predicates)&lt;/strong&gt;:基于 Path、Header、Cookie、Method、Query 的路由匹配&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;过滤器(Filter)&lt;/strong&gt;:GlobalFilter(全局) + GatewayFilter(路由级)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;限流集成&lt;/strong&gt;:内置 &lt;code&gt;RequestRateLimiter&lt;/code&gt; GatewayFilter,直接对接 Redis 限流&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gateway &lt;strong&gt;基于 WebFlux 响应式&lt;/strong&gt;,&lt;strong&gt;不能和 Spring MVC 混用&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;如果你的服务用了 Spring MVC,&lt;strong&gt;把 Gateway 单独部署&lt;/strong&gt;,别和业务服务一起&lt;/li&gt;
&lt;li&gt;Gateway 是&lt;strong&gt;单线程事件循环&lt;/strong&gt;,CPU 密集型操作(比如压缩)要谨慎&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Gateway 路由配置示例&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spring&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;gateway&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;order-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;lb://order-service &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# lb = load balancer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;predicates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;Path=/api/order/**&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;Method=GET,POST&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;StripPrefix=2 &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 去掉 /api 前缀&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;RequestRateLimiter&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;redis-rate-limiter.replenishRate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;redis-rate-limiter.burstCapacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Hystrix &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 配合熔断(已 EOL,改 Sentinel)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;fallbackUri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;forward:/fallback&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="46-spring-cloud-alibaba-不直接包含的配件"&gt;4.6 Spring Cloud Alibaba 不直接包含的&amp;quot;配件&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;这几个组件&lt;strong&gt;不是 SCA 直接提供&lt;/strong&gt;,但在微服务里同样重要,顺手列一下:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SkyWalking / Zipkin&lt;/strong&gt;:分布式链路追踪&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;XXL-JOB / Elastic-Job&lt;/strong&gt;:分布式定时任务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ELK / Loki&lt;/strong&gt;:日志收集与分析&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prometheus + Grafana&lt;/strong&gt;:监控告警&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;原理:微服务是&amp;quot;组件组合&amp;quot;,不是&amp;quot;全家桶&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Spring Cloud Alibaba 解决&lt;strong&gt;服务治理&lt;/strong&gt;的 80% 问题,剩下的 20%(监控、日志、定时任务)由独立组件补齐。&lt;strong&gt;不要追求&amp;quot;一套打天下&amp;quot;——每个组件在自己的领域做到极致,组合起来才是最优解&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="五内部调用dubbo-3-实战"&gt;五、内部调用:Dubbo 3 实战
&lt;/h2&gt;&lt;p&gt;这是本文最硬核的一节。Dubbo 3 不只是&amp;quot;Dubbo 2 升级版&amp;quot;,它在协议、服务发现、跨语言、可观测性上做了&lt;strong&gt;全面重构&lt;/strong&gt;。这里重点讲&lt;strong&gt;Triple 协议&lt;/strong&gt;——这是 Dubbo 3 相比 2.7 最大的变化。&lt;/p&gt;
&lt;h3 id="51-为什么内部用-dubbo-不走-openfeign"&gt;5.1 为什么内部用 Dubbo 不走 OpenFeign
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;性能对比&lt;/strong&gt;(单次调用,本地环境,JDK 17):&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方案&lt;/th&gt;
					&lt;th&gt;序列化&lt;/th&gt;
					&lt;th&gt;协议&lt;/th&gt;
					&lt;th&gt;延迟(P50)&lt;/th&gt;
					&lt;th&gt;延迟(P99)&lt;/th&gt;
					&lt;th&gt;TPS&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;OpenFeign + JSON&lt;/td&gt;
					&lt;td&gt;Jackson&lt;/td&gt;
					&lt;td&gt;HTTP/1.1 JSON&lt;/td&gt;
					&lt;td&gt;2.5ms&lt;/td&gt;
					&lt;td&gt;8ms&lt;/td&gt;
					&lt;td&gt;6000&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;OpenFeign + Protobuf&lt;/td&gt;
					&lt;td&gt;Protobuf&lt;/td&gt;
					&lt;td&gt;HTTP/1.1&lt;/td&gt;
					&lt;td&gt;1.8ms&lt;/td&gt;
					&lt;td&gt;6ms&lt;/td&gt;
					&lt;td&gt;8500&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Dubbo 3 Triple&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Protobuf&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;HTTP/2&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;0.8ms&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;2.5ms&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;18000&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Dubbo 2.x (Hessian)&lt;/td&gt;
					&lt;td&gt;Hessian2&lt;/td&gt;
					&lt;td&gt;Dubbo TCP&lt;/td&gt;
					&lt;td&gt;0.6ms&lt;/td&gt;
					&lt;td&gt;2ms&lt;/td&gt;
					&lt;td&gt;22000&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;📌 &lt;strong&gt;实践:什么时候该用 Dubbo,什么时候该用 Feign&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dubbo 3 Triple&lt;/strong&gt;:内部服务调用,QPS &amp;gt; 1000,延迟敏感&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenFeign&lt;/strong&gt;:跨语言调用、对外 REST、低 QPS 业务(&amp;lt; 100)、管理后台&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;混合使用&lt;/strong&gt;:本文架构,内部 Dubbo + 对外 Feign&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dubbo 3 Triple 协议 vs Dubbo 2.x 经典协议&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Triple&lt;/strong&gt;:基于 HTTP/2 + Protobuf,跨语言友好(Go/Python/Node.js 都能调)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;经典&lt;/strong&gt;:基于 Dubbo 自定义协议 + Hessian,性能更强但只支持 Java&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🎯 &lt;strong&gt;避坑点:Triple 不是为了取代 gRPC&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Triple 协议设计时&lt;strong&gt;参考了 gRPC&lt;/strong&gt;,&lt;strong&gt;在 gRPC 之上做了扩展&lt;/strong&gt;(支持自定义负载均衡、跨集群路由)。如果你的系统&lt;strong&gt;已经用了 gRPC&lt;/strong&gt;,不需要为了 Dubbo 3 而迁。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但如果你从零开始&lt;/strong&gt;,&lt;strong&gt;Triple 比 gRPC 多了&amp;quot;服务治理&amp;quot;能力&lt;/strong&gt;(内置路由、限流、熔断),这是 gRPC 需要配合 Istio 才能做到的。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="52-triple-协议原理"&gt;5.2 Triple 协议原理
&lt;/h3&gt;&lt;p&gt;Triple 协议的&lt;strong&gt;核心设计&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;协议层&lt;/strong&gt;:基于 HTTP/2,支持多路复用、流控&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;序列化&lt;/strong&gt;:默认 Protobuf(也可选 JSON、Hessian)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务定义&lt;/strong&gt;:IDL(&lt;code&gt;.proto&lt;/code&gt; 文件)或 Java Interface&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通信模式&lt;/strong&gt;:Unary(一元)、Server Streaming、Client Streaming、Bidirectional Streaming(完整 gRPC 兼容)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务发现&lt;/strong&gt;:通过 Nacos 拉取服务列表,默认 dubbo 协议头&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="521-协议栈分层"&gt;5.2.1 协议栈分层
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌─────────────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 业务接口(Java Interface) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Stub / Proxy(Dubbo 生成) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Triple 协议(基于 HTTP/2 + Protobuf)│
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Netty 4.x 传输层 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ TCP │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─────────────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="522-triple-与-grpc-的兼容性"&gt;5.2.2 Triple 与 gRPC 的兼容性
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;关键:Triple 协议和 gRPC 协议在网络层完全兼容&lt;/strong&gt;。这意味着:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Go/Python/Node.js 客户端可以用标准 gRPC 调 Dubbo 3 服务&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Java 端既可以用 Dubbo 3 Client,也可以用 grpc-java Client&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同一端口(默认 50051)既服务 gRPC,也服务 Triple&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;原理:为什么能&amp;quot;完全兼容&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;gRPC 的协议规范是&lt;strong&gt;公开的&lt;/strong&gt;(&lt;a class="link" href="https://github.com/grpc/grpc-proto" target="_blank" rel="noopener"
 &gt;grpc/grpc-proto&lt;/a&gt;)。Triple 在协议层&lt;strong&gt;严格遵循 gRPC 规范&lt;/strong&gt;,只是在&lt;strong&gt;服务元数据&lt;/strong&gt;(服务名、版本、分组)做了扩展,所以 gRPC 客户端能&amp;quot;假装是 Triple 服务&amp;quot;去调,服务端也能识别&amp;quot;gRPC 风格的请求&amp;quot;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="53-实战定义一个-triple-服务"&gt;5.3 实战:定义一个 Triple 服务
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;步骤 1:定义接口&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@DubboService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 暴露服务&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;InventoryService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Java 接口,标注 IDL 信息&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;deduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;skuId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Inventory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;skuId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;步骤 2:实现服务&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@DubboService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1.0.0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;inventory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InventoryServiceImpl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;implements&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;InventoryService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Autowired&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;InventoryRepository&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;deduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;skuId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Inventory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findBySkuId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skuId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElseThrow&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NotFoundException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skuId&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setStock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Inventory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;skuId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findBySkuId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skuId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElseThrow&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NotFoundException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skuId&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;步骤 3:引用服务&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@RestController&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderController&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@DubboReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1.0.0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;inventory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;InventoryService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inventoryService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 像本地 Bean 一样用&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@PostMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/order&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderResult&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@RequestBody&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 内部调用 Dubbo,走 Triple 协议&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inventoryService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSkuId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getQuantity&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderResult&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;库存不足&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="54-与-nacos-注册中心互通"&gt;5.4 与 Nacos 注册中心互通
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;核心配置&lt;/strong&gt;(Nacos 作为注册中心 + 配置中心,Dubbo 服务注册到同一 Nacos):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# application.yml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;dubbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;inventory-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nacos://nacos-cluster:8848&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tri &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Triple 协议&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;50051&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;check&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;subscribed-services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;inventory-service &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 订阅哪些服务&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spring&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;nacos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;discovery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;server-addr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nacos-cluster:8848&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;prod&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键点&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dubbo.registry.address&lt;/code&gt; 配 Nacos 地址,服务自动注册到 Nacos&lt;/li&gt;
&lt;li&gt;Spring Cloud 的服务(用 &lt;code&gt;@SpringBootApplication&lt;/code&gt; + &lt;code&gt;@EnableDiscoveryClient&lt;/code&gt;)和 Dubbo 服务&lt;strong&gt;同时注册到 Nacos&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Cloud 服务能发现 Dubbo 服务,Dubbo 服务也能发现 Spring Cloud 服务&lt;/strong&gt;——只要都是注册到同一 Nacos&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="55-dubbo-27-升级-3x-的关键差异"&gt;5.5 Dubbo 2.7 升级 3.x 的关键差异
&lt;/h3&gt;&lt;p&gt;如果你是 Dubbo 2.7 老项目,升级 3.x 要注意:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;Dubbo 2.7.x&lt;/th&gt;
					&lt;th&gt;Dubbo 3.x&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;协议&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;默认 Dubbo 协议(Hessian)&lt;/td&gt;
					&lt;td&gt;默认 Triple 协议(HTTP/2 + Protobuf)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;注册中心&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;ZK 主流&lt;/td&gt;
					&lt;td&gt;Nacos 主流&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;服务发现&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;接口级(Interface)&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;应用级(Application)&lt;/strong&gt;——按应用名发现,支持大规模集群&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;跨语言&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;不支持&lt;/td&gt;
					&lt;td&gt;支持(gRPC 兼容)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;路由策略&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;条件路由、脚本路由&lt;/td&gt;
					&lt;td&gt;条件路由 + &lt;strong&gt;标签路由 + 动态配置&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;可观测性&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;弱&lt;/td&gt;
					&lt;td&gt;内置 Micrometer 集成&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;K8s 集成&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;不支持&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;原生支持&lt;/strong&gt;(基于 Service/DNS)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;性能&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;强&lt;/td&gt;
					&lt;td&gt;略弱(因为 HTTP/2 开销)但更通用&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🎯 &lt;strong&gt;避坑点:Dubbo 2.7 → 3.x 升级的最大坑&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;服务发现模型变了&lt;/strong&gt;——从&amp;quot;接口级&amp;quot;变成&amp;quot;应用级&amp;quot;。&lt;/p&gt;
&lt;p&gt;Dubbo 2.7 同一应用的不同接口都注册成独立服务。Dubbo 3 &lt;strong&gt;同一应用的所有接口共享一个应用实例&lt;/strong&gt;,按 &lt;code&gt;service:version:group&lt;/code&gt; 区分。&lt;/p&gt;
&lt;p&gt;这意味着:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nacos 上的服务数会减少&lt;/strong&gt;(从 N 多个 → N 个)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;客户端的负载均衡策略要重配&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨集群路由配置要重新梳理&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;建议&lt;/strong&gt;:先&lt;strong&gt;在测试环境全量验证&lt;/strong&gt;,再&lt;strong&gt;灰度上线&lt;/strong&gt;——别一上来就生产升级。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="六对外暴露restful-实战"&gt;六、对外暴露:RESTful 实战
&lt;/h2&gt;&lt;h3 id="61-为什么对外走-restful不走-dubbo"&gt;6.1 为什么对外走 RESTful,不走 Dubbo
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;Dubbo&lt;/th&gt;
					&lt;th&gt;RESTful&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;跨语言&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;需 SDK(只支持 Java)&lt;/td&gt;
					&lt;td&gt;HTTP 标准,任意语言可调&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;调试难度&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;难(需 Dubbo 工具)&lt;/td&gt;
					&lt;td&gt;易(curl/Postman/浏览器)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;文档工具&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;无(手写)&lt;/td&gt;
					&lt;td&gt;Swagger / Knife4j 自动生成&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;API 治理&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;弱(无标准)&lt;/td&gt;
					&lt;td&gt;强(OpenAPI 规范)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;前端友好度&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;差(需后端代理)&lt;/td&gt;
					&lt;td&gt;好(直接 fetch/axios)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;第三方对接&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;难&lt;/td&gt;
					&lt;td&gt;易(标准 HTTP)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;性能&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;强&lt;/td&gt;
					&lt;td&gt;中(JSON 序列化开销)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;适合场景&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;内部服务&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;外部接口&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;:&lt;strong&gt;对外一律 REST,内部一律 Dubbo&lt;/strong&gt;。这是 5.1 节&amp;quot;性能对比表&amp;quot;的延伸——对外流量不追求极致性能(单次 2ms vs 0.8ms 用户感知不到),但追求&lt;strong&gt;生态与可调试性&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="62-三件套组合spring-mvc--openfeign--spring-cloud-gateway"&gt;6.2 三件套组合:Spring MVC + OpenFeign + Spring Cloud Gateway
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;组合架构&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;外部 APP
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Spring Cloud │ ← 对外 API 网关(统一鉴权/限流/路由)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Gateway │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└────────┬─────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 业务服务 │ ← Spring MVC 暴露 REST API
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ (Order/User/...) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ @RestController │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└────────┬─────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ (内部调用,可能跨服务)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Dubbo 3 Triple │ ← 内部 RPC
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ (Inventory/...) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└──────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键设计&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Controller 层&lt;/strong&gt;用 Spring MVC(&lt;code&gt;@RestController&lt;/code&gt;),不直接用 Dubbo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务间调用&lt;/strong&gt;用 Dubbo 3(&lt;code&gt;@DubboReference&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第三方/前端调用&lt;/strong&gt;走 Gateway → Controller&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenFeign&lt;/strong&gt; 只用于&lt;strong&gt;特殊场景&lt;/strong&gt;(比如跨业务线的服务调用,对方没有 Dubbo 服务)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="63-实战订单服务的完整-api"&gt;6.3 实战:订单服务的完整 API
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@RestController&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@RequestMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/api/v1/order&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;订单服务&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;订单的创建、查询、取消&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Knife4j 注解&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderController&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Autowired&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderApplicationService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 应用层服务&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@PostMapping&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Operation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;创建订单&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OrderDTO&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@RequestBody&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Valid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/{orderId}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Operation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;查询订单详情&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OrderDTO&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathVariable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@PostMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/{orderId}/cancel&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Operation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;取消订单&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;cancel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathVariable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@RequestParam&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cancel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Swagger/Knife4j 自动生成文档&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;访问 &lt;code&gt;http://gateway-host:8080/doc.html&lt;/code&gt; 查看 API 文档&lt;/li&gt;
&lt;li&gt;前端/测试团队可以&lt;strong&gt;直接在线调试&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="64-openfeign-的应用场景"&gt;6.4 OpenFeign 的应用场景
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;OpenFeign 在 SCA + Dubbo 3 架构里,主要用于&amp;quot;非 Dubbo 服务&amp;quot;的调用&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 场景:调用一个外部团队的 REST 服务(对方没有 Dubbo)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@FeignClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;external-erp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://erp.internal/api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;ErpClient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@PostMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/sync&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ErpSyncResult&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@RequestBody&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ErpSyncRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 场景:前端 BFF 层聚合多个内部服务&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@FeignClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;inventory-service&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/api/v1/inventory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;InventoryFeignClient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/{skuId}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;InventoryDTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getBySkuId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathVariable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;skuId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;OpenFeign vs Dubbo 3 的选型决策&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;推荐方案&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;内部服务调用(高 QPS、延迟敏感)&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Dubbo 3 Triple&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;内部服务调用(低 QPS、跨业务线)&lt;/td&gt;
					&lt;td&gt;OpenFeign&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;外部服务调用(对方无 Dubbo)&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;OpenFeign&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;前端 BFF 层聚合&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;OpenFeign&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;后台管理类接口&lt;/td&gt;
					&lt;td&gt;OpenFeign&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="七实战一个接口的完整链路"&gt;七、实战:一个接口的完整链路
&lt;/h2&gt;&lt;p&gt;用一个真实例子,把所有组件串起来:&lt;strong&gt;用户下单&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="71-场景描述"&gt;7.1 场景描述
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;流程&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;APP 发起 &lt;code&gt;POST /api/v1/order&lt;/code&gt; 请求&lt;/li&gt;
&lt;li&gt;Gateway 鉴权 + 限流&lt;/li&gt;
&lt;li&gt;OrderController 接收请求&lt;/li&gt;
&lt;li&gt;OrderService 调用 InventoryService(Dubbo)扣库存&lt;/li&gt;
&lt;li&gt;OrderService 调用 AccountService(Dubbo)扣账户余额&lt;/li&gt;
&lt;li&gt;Seata 全局事务保证数据一致&lt;/li&gt;
&lt;li&gt;创建订单,落 MySQL&lt;/li&gt;
&lt;li&gt;发送 RocketMQ 消息(异步发券 + 短信)&lt;/li&gt;
&lt;li&gt;返回结果给 APP&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="72-完整代码骨架"&gt;7.2 完整代码骨架
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Controller 层&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@PostMapping&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@GlobalTransactional&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;create-order-tx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rollbackFor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@SentinelResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;createOrder&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;blockHandler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;handleBlock&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OrderDTO&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@RequestBody&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Valid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@RequestHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;X-User-Id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;ApplicationService 层&lt;/strong&gt;(组合领域服务):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderApplicationService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@DubboReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1.0.0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;inventory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;InventoryService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inventoryService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@DubboReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1.0.0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AccountService&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;accountService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Autowired&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderRepository&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderRepository&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Autowired&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RocketMQTemplate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rocketMQTemplate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderDTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 1. 扣库存(Dubbo Triple 协议)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;deducted&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;inventoryService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSkuId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getQuantity&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;deducted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BusinessException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;库存不足&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 2. 扣账户余额(Dubbo Triple 协议)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;accountService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;debit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAmount&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 3. 创建订单(本服务数据库)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderRepository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 4. 发送异步消息(RocketMQ 事务消息)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rocketMQTemplate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sendMessageInTransaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;order-topic&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MessageBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withPayload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OrderDTO&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="73-全链路追踪"&gt;7.3 全链路追踪
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;SkyWalking 配置&lt;/strong&gt;(看一个请求的完整链路):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# agent/config/agent.config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;agent.service_name=order-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;collector.backend_service=skywalking-oap:11800&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 自动追踪 Dubbo + HTTP 调用&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;plugin.dubbo.trace_internal=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;plugin.spring.webflux.trace_internal=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;SkyWalking Dashboard 看到的链路&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Gateway 鉴权] 3ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ [OrderController] 25ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ [OrderService.create] 18ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├─ [Dubbo: InventoryService.deduct] 6ms ← 内部 Dubbo 调用
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├─ [Dubbo: AccountService.debit] 5ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ├─ [MySQL: insert order] 3ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ [RocketMQ: sendMessage] 2ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ [Seata: branch register] 2ms
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;任何一环慢,都能秒级定位&lt;/strong&gt;——这才是微服务可观测性的价值。&lt;/p&gt;
&lt;h3 id="74-故障场景演练"&gt;7.4 故障场景演练
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;场景:库存服务宕机&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;OrderController 收到请求&lt;/li&gt;
&lt;li&gt;Dubbo 调用 InventoryService.deduct(),3 秒超时&lt;/li&gt;
&lt;li&gt;抛 &lt;code&gt;RpcException: Timeout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@GlobalTransactional&lt;/code&gt; 触发回滚,账户扣款被回滚,订单未创建&lt;/li&gt;
&lt;li&gt;业务侧返回&amp;quot;系统繁忙,请稍后重试&amp;quot;&lt;/li&gt;
&lt;li&gt;Sentinel 触发熔断,后续 30 秒内直接拒绝请求(避免雪崩)&lt;/li&gt;
&lt;li&gt;RocketMQ 消息未发送,无副作用&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;整套流程在 3 秒内完成&lt;/strong&gt;——没有库存数据不一致,没有脏消息,没有雪崩。&lt;/p&gt;
&lt;h2 id="八总结选型决策树与避坑清单"&gt;八、总结:选型决策树与避坑清单
&lt;/h2&gt;&lt;h3 id="81-选型决策树"&gt;8.1 选型决策树
&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 A[启动技术选型] --&gt; B{业务规模?}
 B --&gt;|日活&lt;10万| C[单体 + Spring Boot]
 B --&gt;|10万~100万| D{团队规模?}
 B --&gt;|日活&gt;100万| E{自研 vs 云?}
 
 D --&gt;|&lt;10人| F[Spring Cloud + Alibaba]
 D --&gt;|&gt;10人| G{有 Dubbo 基础?}
 
 G --&gt;|有| H[SCA + Dubbo 3 混合]
 G --&gt;|无| F
 
 E --&gt;|自研为主| H
 E --&gt;|全面上云| I[云原生全家桶 MSE/AHAS]
 
 style H fill:#457b9d,color:#fff
 style F fill:#a8dadc&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;lt; 10 万日活&lt;/strong&gt;:单体 Spring Boot + MySQL,别上微服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;10-100 万日活&lt;/strong&gt;:Spring Cloud Alibaba 套件足够&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;gt; 100 万日活&lt;/strong&gt;:SCA + Dubbo 3 混合架构(本文方案)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;超大规模(&amp;gt; 1000 万日活)&lt;/strong&gt;:上云原生 + Service Mesh&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="82-6-条避坑点"&gt;8.2 6 条避坑点
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;🛑 &lt;strong&gt;误区警示:这些坑别踩&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;盲目追新&lt;/strong&gt;——Spring Cloud 还在用 2020.x 版本,公司新项目就上 2023.0.x,踩了一堆兼容性 bug。&lt;strong&gt;新版本至少观察 6 个月再上生产&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;混用多种 RPC 框架&lt;/strong&gt;——服务 A 用 Dubbo、服务 B 用 Feign、服务 C 用 gRPC,团队没人能讲清楚。&lt;strong&gt;统一一套,要么 Dubbo,要么 Spring Cloud OpenFeign&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sentinel 规则没接 Dashboard&lt;/strong&gt;——本地写了 &lt;code&gt;@SentinelResource&lt;/code&gt; 但没接控制台,所有规则硬编码。&lt;strong&gt;生产前必须接 Dashboard,规则要可动态调整&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seata AT 模式没开 binlog&lt;/strong&gt;——MySQL 没开 binlog,Seata AT 模式直接报错,临时改 TCC 又没时间。&lt;strong&gt;架构阶段就要确认 binlog 配置&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dubbo 2.7 升级 3.x 没灰度&lt;/strong&gt;——直接全量升,服务发现模型变了,新模型在测试环境没压测过,生产雪崩。&lt;strong&gt;先灰度 10% 流量,观察 1 周再全量&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Cloud Gateway 跟 Spring MVC 混用&lt;/strong&gt;——Gateway 是 WebFlux 响应式,跟业务模块的 Spring MVC 一起启动,Bean 冲突,启动直接报错。&lt;strong&gt;Gateway 单独部署,不和业务服务同进程&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

 &lt;/blockquote&gt;
&lt;h3 id="83-版本兼容性矩阵202606-当前主流"&gt;8.3 版本兼容性矩阵(2026.06 当前主流)
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Spring Boot&lt;/th&gt;
					&lt;th&gt;Spring Cloud&lt;/th&gt;
					&lt;th&gt;Spring Cloud Alibaba&lt;/th&gt;
					&lt;th&gt;Nacos&lt;/th&gt;
					&lt;th&gt;Sentinel&lt;/th&gt;
					&lt;th&gt;Seata&lt;/th&gt;
					&lt;th&gt;Dubbo&lt;/th&gt;
					&lt;th&gt;备注&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;3.2.x&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;2023.0.x&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2023.0.0.0&lt;/td&gt;
					&lt;td&gt;2.3.x+&lt;/td&gt;
					&lt;td&gt;1.8.6+&lt;/td&gt;
					&lt;td&gt;1.7+&lt;/td&gt;
					&lt;td&gt;3.2.x&lt;/td&gt;
					&lt;td&gt;最新版&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;3.1.x&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2022.0.4&lt;/td&gt;
					&lt;td&gt;2022.0.0.0-RC1&lt;/td&gt;
					&lt;td&gt;2.3.x&lt;/td&gt;
					&lt;td&gt;1.8.6&lt;/td&gt;
					&lt;td&gt;1.6+&lt;/td&gt;
					&lt;td&gt;3.2.x&lt;/td&gt;
					&lt;td&gt;次主流&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;3.0.x&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2022.0.x&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;2022.0.0.0&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2.2.x+&lt;/td&gt;
					&lt;td&gt;1.8.6&lt;/td&gt;
					&lt;td&gt;1.6+&lt;/td&gt;
					&lt;td&gt;3.1.x&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;本文基线&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2.7.x&lt;/td&gt;
					&lt;td&gt;2021.0.x&lt;/td&gt;
					&lt;td&gt;2021.0.x&lt;/td&gt;
					&lt;td&gt;1.4.x&lt;/td&gt;
					&lt;td&gt;1.8.4&lt;/td&gt;
					&lt;td&gt;1.5+&lt;/td&gt;
					&lt;td&gt;2.7.x&lt;/td&gt;
					&lt;td&gt;老项目在用&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;📌 &lt;strong&gt;实践:版本升级的&amp;quot;先小后大&amp;quot;原则&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先升小版本&lt;/strong&gt;(如 3.0.5 → 3.0.10),观察 1 周&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;再升次版本&lt;/strong&gt;(3.0 → 3.1),灰度 10% 流量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最后升大版本&lt;/strong&gt;(3.x → 4.x),&lt;strong&gt;至少 6 个月观察期&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;永远不要跨大版本直接升&lt;/strong&gt;——除非你已经放弃了兼容性的执念,愿意重写。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="九常见问题-faq"&gt;九、常见问题 FAQ
&lt;/h2&gt;&lt;h3 id="q1spring-cloud-alibaba-和阿里云微服务引擎mse是什么关系"&gt;Q1:Spring Cloud Alibaba 和&amp;quot;阿里云微服务引擎(MSE)&amp;ldquo;是什么关系?
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;:&lt;strong&gt;MSE 是 SCA 核心组件的阿里云商业版&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nacos 开源版 → MSE 商业版&lt;/li&gt;
&lt;li&gt;Sentinel 开源版 → AHAS(应用高可用服务)&lt;/li&gt;
&lt;li&gt;Seata 开源版 → GTS(全局事务服务)&lt;/li&gt;
&lt;li&gt;Spring Cloud Gateway 开源版 → 云原生 API 网关&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;关系&lt;/strong&gt;:&lt;strong&gt;核心代码同源,商业版加运维、监控、扩缩容能力&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;小规模(&amp;lt; 50 服务):&lt;strong&gt;用开源版自建&lt;/strong&gt;——成本低,够用&lt;/li&gt;
&lt;li&gt;中规模(50-500 服务):&lt;strong&gt;核心组件商业版,周边组件开源&lt;/strong&gt;——平衡&lt;/li&gt;
&lt;li&gt;大规模(&amp;gt; 500 服务):&lt;strong&gt;全面上云原生&lt;/strong&gt;——专业的事交给专业的&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;如果不想用阿里云&lt;/strong&gt;,&lt;strong&gt;SCA 的核心组件都是 ASF/Apache 项目,可以在腾讯云、AWS、Azure 上自建或用对应商业服务&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="q2dubbo-3-和-openfeign-能不能在一个项目里混用"&gt;Q2:Dubbo 3 和 OpenFeign 能不能在一个项目里混用?
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;:&lt;strong&gt;完全可以,本文架构就是混用&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;混用原则&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dubbo 3 Triple&lt;/strong&gt;:&lt;strong&gt;所有内部服务间的高 QPS 调用&lt;/strong&gt;——性能优先&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenFeign&lt;/strong&gt;:&lt;strong&gt;跨业务线服务、第三方服务、前端 BFF 聚合&lt;/strong&gt;——生态优先&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不要在同一服务的同一调用链上混用&lt;/strong&gt;——选择了一种就坚持到底&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;实战配比&lt;/strong&gt;:&lt;strong&gt;Dubbo 80% + OpenFeign 20%&lt;/strong&gt; 是健康的比例。&lt;/p&gt;
&lt;h3 id="q3升级到-spring-cloud-alibaba-2022000spring-boot-3x的最大坑是什么"&gt;Q3:升级到 Spring Cloud Alibaba 2022.0.0.0(Spring Boot 3.x)的最大坑是什么?
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;:&lt;strong&gt;javax → jakarta 命名空间切换&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Spring Boot 3.x 把 &lt;code&gt;javax.servlet.*&lt;/code&gt; 全部改成 &lt;code&gt;jakarta.servlet.*&lt;/code&gt;——&lt;strong&gt;所有第三方库必须升级&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MyBatis&lt;/strong&gt;:升级到 3.5.x+&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hibernate Validator&lt;/strong&gt;:升级到 8.x+&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Servlet 容器&lt;/strong&gt;:Spring Boot 3.x 内置 Tomcat 10+&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;所有 &lt;code&gt;@Resource&lt;/code&gt;、&lt;code&gt;@PostConstruct&lt;/code&gt; 等&lt;/strong&gt; 不受影响(javax.annotation 仍兼容)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;最稳的升级路径&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先升 Spring Boot 2.7 → 3.0(只改 spring-boot-starter 版本)&lt;/li&gt;
&lt;li&gt;再升 &lt;code&gt;javax.*&lt;/code&gt; → &lt;code&gt;jakarta.*&lt;/code&gt;(用 IDE 全局替换)&lt;/li&gt;
&lt;li&gt;最后升 Spring Cloud + SCA 到 2022.0.0.0&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预计工作量&lt;/strong&gt;:&lt;strong&gt;3 个月(50 个微服务规模)&lt;/strong&gt;。&lt;strong&gt;别在双 11 前升&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="q4nacos-配置中心的数据怎么加密"&gt;Q4:Nacos 配置中心的数据怎么加密?
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;:&lt;strong&gt;Nacos 1.4+ 支持配置加密&lt;/strong&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# nacos 控制台 → 配置管理 → 新建配置&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# DataId: order-service.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 加密配置:配置内容用 jasypt 或 nacos-aes 加密&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 客户端解密:配置 spring.cloud.nacos.config.ext-config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;更推荐的方式&lt;/strong&gt;:&lt;strong&gt;敏感配置放 KMS(密钥管理服务)&lt;/strong&gt;,不直接放 Nacos。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;阿里云 KMS、腾讯云 KMS、AWS KMS&lt;/li&gt;
&lt;li&gt;业务服务启动时从 KMS 拉取敏感配置,缓存在内存&lt;/li&gt;
&lt;li&gt;Nacos 只放&lt;strong&gt;非敏感配置&lt;/strong&gt;(超时时间、开关、限流阈值等)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="q5sentinel-集群限流怎么做"&gt;Q5:Sentinel 集群限流怎么做?
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;:&lt;strong&gt;Sentinel 集群限流依赖 Token Server&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;单机限流只能保护单实例,但&lt;strong&gt;总流量超限&lt;/strong&gt;时无法保护。集群限流把限流决策放到中心化 Token Server:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌─────────┐ ┌─────────┐ ┌─────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 实例 1 │ │ 实例 2 │ │ 实例 3 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ (Token │ │ (Token │ │ (Token │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Client) │ │ Client) │ │ Client) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└────┬────┘ └────┬────┘ └────┬────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └────────────┼────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Token Server │ ← 集群限流中心
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ (Cluster) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;生产配置&lt;/strong&gt;:&lt;strong&gt;3 个 Token Server 节点 + Nacos 配置规则&lt;/strong&gt;。所有 Sentinel Client 启动时连接 Token Server 拉取令牌。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;:集群限流增加 1-2ms 延迟,延迟敏感场景要权衡。&lt;/p&gt;
&lt;h3 id="q6seata-在分库分表下能用吗"&gt;Q6:Seata 在分库分表下能用吗?
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;:&lt;strong&gt;能用,有限制&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AT 模式&lt;/strong&gt;:&lt;strong&gt;支持分库分表&lt;/strong&gt;——每个分片都是独立的数据源,Seata 会在每个分片创建 &lt;code&gt;undo_log&lt;/code&gt; 表&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TCC 模式&lt;/strong&gt;:&lt;strong&gt;天然支持&lt;/strong&gt;——分库分表对 TCC 是透明的&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SAGA 模式&lt;/strong&gt;:&lt;strong&gt;支持&lt;/strong&gt;——补偿逻辑在分库分表上正常执行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ShardingJDBC + Seata 集成需要特殊配置:每个分片数据源都要注册到 Seata&lt;/li&gt;
&lt;li&gt;全局锁在分库分表下是&lt;strong&gt;跨分片锁&lt;/strong&gt;,性能会下降&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;建议&lt;/strong&gt;:核心交易用 AT + 简单分片(&amp;lt; 16 个),复杂分片场景用 TCC&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="q7spring-cloud-gateway-怎么实现按-ip-限流"&gt;Q7:Spring Cloud Gateway 怎么实现&amp;quot;按 IP 限流&amp;rdquo;?
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;:&lt;strong&gt;Sentinel 支持按 IP 限流&lt;/strong&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Bean&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GlobalFilter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;ipFilter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRequest&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getRemoteAddress&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getAddress&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getHostAddress&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 调 Sentinel API 限流&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Entry&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SphU&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ip-rate-limit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;doFinally&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;生产更推荐&lt;/strong&gt;:用 Sentinel 控制台配 IP 黑白名单,&lt;strong&gt;不用写代码&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="q8微服务怎么和单元化第-1-篇的异地多活结合"&gt;Q8:微服务怎么和单元化(第 1 篇的异地多活)结合?
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt;:&lt;strong&gt;这是 Java Web 微服务系列后续的重点&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;简短回答:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dubbo 3 标签路由&lt;/strong&gt;:Dubbo 内置&amp;quot;按机房标签路由&amp;quot;,结合 Nacos 的 &lt;code&gt;cluster-name&lt;/code&gt; 元数据,&lt;strong&gt;自动隔离跨机房调用&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sentinel 集群限流&lt;/strong&gt;:按机房分别限流,&lt;strong&gt;避免单机房过载拖垮全网&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seata&lt;/strong&gt;:跨机房分布式事务&lt;strong&gt;强烈不推荐&lt;/strong&gt;——跨机房延迟 30-100ms,事务延迟会飙升到秒级&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;消息&lt;/strong&gt;:RocketMQ 跨机房用 &lt;strong&gt;同城双写 + 异地灾备&lt;/strong&gt;,&lt;strong&gt;业务层做幂等消费&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;详细方案见系列第 7 篇&lt;/strong&gt;「异地多活下的微服务治理」。&lt;/p&gt;
&lt;h2 id="十系列预告--推荐阅读"&gt;十、系列预告 + 推荐阅读
&lt;/h2&gt;&lt;h3 id="101-系列预告"&gt;10.1 系列预告
&lt;/h3&gt;&lt;p&gt;这是 &lt;strong&gt;Java Web 微服务系列&lt;/strong&gt; 的第 4 篇。后续计划覆盖:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;序号&lt;/th&gt;
					&lt;th&gt;主题&lt;/th&gt;
					&lt;th&gt;状态&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;第 1 篇&lt;/td&gt;
					&lt;td&gt;异地多活(高可用终极形态)&lt;/td&gt;
					&lt;td&gt;✅ 已发布&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;第 2 篇&lt;/td&gt;
					&lt;td&gt;微服务拆分与领域建模&lt;/td&gt;
					&lt;td&gt;🔜 计划中&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;第 3 篇&lt;/td&gt;
					&lt;td&gt;服务治理:注册中心、配置中心、限流熔断&lt;/td&gt;
					&lt;td&gt;🔜 计划中&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;第 4 篇&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;技术选型(本文)&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;✅ &lt;strong&gt;本文&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;第 5 篇&lt;/td&gt;
					&lt;td&gt;Nacos 实战:集群搭建 + 配置灰度&lt;/td&gt;
					&lt;td&gt;🔜 计划中&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;第 6 篇&lt;/td&gt;
					&lt;td&gt;Sentinel 实战:限流规则 + 熔断降级&lt;/td&gt;
					&lt;td&gt;🔜 计划中&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;第 7 篇&lt;/td&gt;
					&lt;td&gt;Seata 实战:AT/TCC 模式选型&lt;/td&gt;
					&lt;td&gt;🔜 计划中&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;第 8 篇&lt;/td&gt;
					&lt;td&gt;Dubbo 3 实战:Triple + 标签路由&lt;/td&gt;
					&lt;td&gt;🔜 计划中&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;第 9 篇&lt;/td&gt;
					&lt;td&gt;异地多活下的微服务治理&lt;/td&gt;
					&lt;td&gt;🔜 计划中&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;第 10 篇&lt;/td&gt;
					&lt;td&gt;全链路压测 + 混沌工程&lt;/td&gt;
					&lt;td&gt;🔜 计划中&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;学习路径建议&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;入门&lt;/strong&gt;:本文 + Nacos 官方文档&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进阶&lt;/strong&gt;:Dubbo 3 官方文档(&lt;a class="link" href="https://dubbo.apache.org" target="_blank" rel="noopener"
 &gt;https://dubbo.apache.org&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实战&lt;/strong&gt;:研究 SCA 各组件 GitHub 仓库的 &lt;code&gt;spring-cloud-alibaba-examples&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;深潜&lt;/strong&gt;:动手搭一套完整 PoC(推荐 5 个服务:Order/Inventory/Account/Pay/Notify)&lt;/li&gt;
&lt;/ol&gt;

 &lt;/blockquote&gt;
&lt;h3 id="102-推荐阅读"&gt;10.2 推荐阅读
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;官方文档&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://spring-cloud-alibaba-group.github.io/" target="_blank" rel="noopener"
 &gt;Spring Cloud Alibaba 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://nacos.io/docs/latest/what-is-nacos/" target="_blank" rel="noopener"
 &gt;Nacos 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://sentinelguard.io/zh-cn/" target="_blank" rel="noopener"
 &gt;Sentinel 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://seata.apache.org/zh-cn/" target="_blank" rel="noopener"
 &gt;Seata 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://dubbo.apache.org/zh/" target="_blank" rel="noopener"
 &gt;Dubbo 3 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;书籍&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《Spring Cloud Alibaba 微服务原理与实战》(谭勇德)—— 国内最系统的 SCA 实战书&lt;/li&gt;
&lt;li&gt;《深入理解 Apache Dubbo 与实战》(诣极、林琳)—— Dubbo 原理 + 实战&lt;/li&gt;
&lt;li&gt;《数据密集型应用系统设计》(DDIA, Martin Kleppmann)—— 分布式系统圣经&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;开源项目&lt;/strong&gt;(学习用)：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;mall-swarm&lt;/strong&gt;:macrozheng 开源,微服务电商完整 demo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Cloud Alibaba Examples&lt;/strong&gt;:官方 example 集合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nepxion Discovery&lt;/strong&gt;:分布式链路追踪 + 灰度发布&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;博客&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;阿里中间件团队博客:Nacos/Sentinel/Seata 源码解析&lt;/li&gt;
&lt;li&gt;美团技术团队:分布式服务治理实践&lt;/li&gt;
&lt;li&gt;InfoQ 中文站:SCA 系列实战文章&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;📌 &lt;strong&gt;工程实践:技术选型不是一次性决策&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本文写于 2026 年 6 月,但&lt;strong&gt;技术选型是 3-5 年的事&lt;/strong&gt;。今天选的方案,2029 年大概率要再选一次。&lt;/p&gt;
&lt;p&gt;选型时考虑的不是&amp;quot;哪个最对&amp;quot;,而是&amp;quot;&lt;strong&gt;哪个能让我 3 年后再选一次&lt;/strong&gt;&amp;quot;。&lt;strong&gt;留有演进空间&lt;/strong&gt;比&amp;quot;一次选对&amp;quot;更重要。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="参考文章"&gt;参考文章
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://sca.aliyun.com/" target="_blank" rel="noopener"
 &gt;Spring Cloud Alibaba 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://dubbo.apache.org/zh/docs/advanced-features/protocols/triple/" target="_blank" rel="noopener"
 &gt;Dubbo 3 官方文档 - Triple 协议&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://nacos.io/docs/latest/architecture/" target="_blank" rel="noopener"
 &gt;Nacos 架构与原理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://sentinelguard.io/zh-cn/docs/basic-implementation/flow-control.html" target="_blank" rel="noopener"
 &gt;Sentinel 流量控制&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://seata.apache.org/zh-cn/docs/dev/mode/at-mode" target="_blank" rel="noopener"
 &gt;Seata AT 模式&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;本文完。下篇预告:第 5 篇 · Nacos 实战:集群搭建 + 配置灰度。&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>