<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Opensource on Liangweidong's blog</title><link>https://liangweidonggood.github.io/tags/opensource/</link><description>Recent content in Opensource on Liangweidong's blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sun, 15 Dec 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://liangweidonggood.github.io/tags/opensource/index.xml" rel="self" type="application/rss+xml"/><item><title>Spring Boot 与 JDK 版本演进：从 1.5 到 3.2 的二十年 Java 生态大事记</title><link>https://liangweidonggood.github.io/p/spring-boot-jdk-banben-yanjin/</link><pubDate>Sun, 15 Dec 2024 00:00:00 +0800</pubDate><guid>https://liangweidonggood.github.io/p/spring-boot-jdk-banben-yanjin/</guid><description>&lt;img src="https://liangweidonggood.github.io/p/spring-boot-jdk-banben-yanjin/image/cover.jpg" alt="Featured image of post Spring Boot 与 JDK 版本演进：从 1.5 到 3.2 的二十年 Java 生态大事记" /&gt;&lt;p&gt;2024 年 12 月，Spring Boot 3.4 刚发布、JDK 21 LTS 满一年、JDK 17 LTS 满三年。回看过去 28 年（1996 JDK 1.0 - 2024 Spring Boot 3.4），Java 生态的版本节奏从&amp;quot;5 年一版 LTS&amp;quot;加速到&amp;quot;2 年一版 LTS&amp;quot;。&lt;strong&gt;对于一个 Java 团队来说，版本选型就是技术战略&lt;/strong&gt;。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;本文写于 2024 年 12 月&lt;/strong&gt;——JDK 17 LTS 是当下主推、JDK 21 LTS 崭露头角，Spring Boot 3.3/3.4 是生产首选。下文的部分早期版本（JDK 8、JDK 11、Spring Boot 2.x）以&amp;quot;2024 视角回望&amp;quot;的方式呈现。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一jdk-版本演进时间线1996-2024"&gt;一、JDK 版本演进时间线（1996-2024）
&lt;/h2&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;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 1.0&lt;/td&gt;
					&lt;td&gt;1996-01-23&lt;/td&gt;
					&lt;td&gt;Java 起点&lt;/td&gt;
					&lt;td&gt;已淘汰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 1.1&lt;/td&gt;
					&lt;td&gt;1997-02-19&lt;/td&gt;
					&lt;td&gt;内部类、反射、JavaBeans&lt;/td&gt;
					&lt;td&gt;已淘汰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 1.2&lt;/td&gt;
					&lt;td&gt;1998-12-04&lt;/td&gt;
					&lt;td&gt;Collections 框架、JIT、Swing&lt;/td&gt;
					&lt;td&gt;已淘汰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 1.3&lt;/td&gt;
					&lt;td&gt;2000-05-08&lt;/td&gt;
					&lt;td&gt;HotSpot JVM、JavaSound&lt;/td&gt;
					&lt;td&gt;已淘汰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 1.4&lt;/td&gt;
					&lt;td&gt;2002-02-13&lt;/td&gt;
					&lt;td&gt;正则、NIO、日志、XML&lt;/td&gt;
					&lt;td&gt;已淘汰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 1.5&lt;/td&gt;
					&lt;td&gt;2004-09-30&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;泛型、注解、枚举、并发包&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;已淘汰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 1.6&lt;/td&gt;
					&lt;td&gt;2006-04&lt;/td&gt;
					&lt;td&gt;动态语言支持、HTTP Server API&lt;/td&gt;
					&lt;td&gt;已淘汰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 1.7&lt;/td&gt;
					&lt;td&gt;2011-07-28&lt;/td&gt;
					&lt;td&gt;G1 回收器、try-with-resources、菱形语法&lt;/td&gt;
					&lt;td&gt;已淘汰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;JDK 1.8 LTS&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;2014-03-18&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Lambda、Stream、Optional、Nashorn、移除 PermGen&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;JDK 9.0&lt;/td&gt;
					&lt;td&gt;2017-09-21&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;模块系统（JPMS）、JShell、HTTP/2 Client&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;已淘汰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 10.0&lt;/td&gt;
					&lt;td&gt;2018-03-21&lt;/td&gt;
					&lt;td&gt;局部变量类型推断 &lt;code&gt;var&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;已淘汰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;JDK 11 LTS&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;2018-09-25&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;HttpClient、ZGC（实验）、Lambda var、移除 Java EE/CORBA&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;JDK 12.0&lt;/td&gt;
					&lt;td&gt;2019-03-19&lt;/td&gt;
					&lt;td&gt;Switch 表达式（预览）&lt;/td&gt;
					&lt;td&gt;已淘汰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 13.0&lt;/td&gt;
					&lt;td&gt;2019-09-17&lt;/td&gt;
					&lt;td&gt;文本块（预览）&lt;/td&gt;
					&lt;td&gt;已淘汰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 14.0&lt;/td&gt;
					&lt;td&gt;2020-03-17&lt;/td&gt;
					&lt;td&gt;Records（预览）、NPE 增强提示&lt;/td&gt;
					&lt;td&gt;已淘汰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 15.0&lt;/td&gt;
					&lt;td&gt;2020-09-15&lt;/td&gt;
					&lt;td&gt;ZGC + 密封类（预览）&lt;/td&gt;
					&lt;td&gt;已淘汰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 16.0&lt;/td&gt;
					&lt;td&gt;2021-03-16&lt;/td&gt;
					&lt;td&gt;Records 正式&lt;/td&gt;
					&lt;td&gt;已淘汰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;JDK 17 LTS&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;2021-09-15&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Sealed Classes 正式、Switch 模式匹配&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;2024 当下生产主力&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JDK 21 LTS&lt;/td&gt;
					&lt;td&gt;2023-09&lt;/td&gt;
					&lt;td&gt;虚拟线程正式&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;2024 新晋 LTS&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="11-lts-节奏"&gt;1.1 LTS 节奏
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1.6 (2006) → 1.7 (2011)&lt;/strong&gt;：5 年&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1.7 (2011) → 1.8 (2014)&lt;/strong&gt;：3 年&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1.8 (2014) → 11 (2018)&lt;/strong&gt;：4 年（Oracle 改为&amp;quot;3 年一版 LTS&amp;quot;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;11 (2018) → 17 (2021)&lt;/strong&gt;：3 年&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;17 (2021) → 21 (2023)&lt;/strong&gt;：2 年（开始加速）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;对企业选型的启示&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5-7 年一个 LTS 周期，意味着企业 JDK 升级周期约为 3-5 年&lt;/li&gt;
&lt;li&gt;选 LTS 版本长期维护，规避非 LTS 短期版本&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-jdk-8-的长寿原因"&gt;1.2 JDK 8 的&amp;quot;长寿&amp;quot;原因
&lt;/h3&gt;&lt;p&gt;JDK 8（2014-03-18 发布）到 2024 年 12 月已经 10 年，&lt;strong&gt;至今仍有一批存量系统在跑&lt;/strong&gt;（行业惯性 + 商业 JDK 8 商业支持仍在售）。原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lambda + Stream&lt;/strong&gt; 改变 Java 编程范式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optional + CompletableFuture&lt;/strong&gt; 提升函数式能力&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法引用 / 默认方法&lt;/strong&gt; 增强接口演进能力&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nashorn&lt;/strong&gt;（已废弃）首次带来 JVM 跑 JS 能力&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PermGen → Metaspace&lt;/strong&gt; 减少 OOM 痛点&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;直到 JDK 11 出现，Java 生态才&amp;quot;集体升级&amp;quot;。&lt;strong&gt;2024 视角回望&lt;/strong&gt;：JDK 8 的&amp;quot;长寿&amp;quot;在 JDK 11 / JDK 17 之后才被真正打破——这也是 LTS 节奏从 5 年压缩到 2 年的拐点。&lt;/p&gt;
&lt;h3 id="13-jdk-11-的-5-大新特性"&gt;1.3 JDK 11 的 5 大新特性
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;HTTP Client API 标准化&lt;/strong&gt;（孵化多版本后正式）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ZGC 可用&lt;/strong&gt;（毫秒级 GC 暂停，4TB 堆支持）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda 参数 &lt;code&gt;var&lt;/code&gt;&lt;/strong&gt;（写 &lt;code&gt;(var x, var y) -&amp;gt; ...&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;移除 Java EE / CORBA&lt;/strong&gt;（瘦身 30%+）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;飞行记录器（JFR）开放&lt;/strong&gt;（生产可启用）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="二spring-boot-版本演进时间线2014-2024"&gt;二、Spring Boot 版本演进时间线（2014-2024）
&lt;/h2&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;JDK 要求&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Spring Boot 1.0&lt;/td&gt;
					&lt;td&gt;2014-04&lt;/td&gt;
					&lt;td&gt;起步&lt;/td&gt;
					&lt;td&gt;JDK 6+&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Spring Boot 1.2&lt;/td&gt;
					&lt;td&gt;2015-01&lt;/td&gt;
					&lt;td&gt;引入 starter 体系&lt;/td&gt;
					&lt;td&gt;JDK 6+&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Spring Boot 1.3&lt;/td&gt;
					&lt;td&gt;2015-11&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;@SpringBootApplication&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;JDK 6+&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Spring Boot 1.4&lt;/td&gt;
					&lt;td&gt;2016-04&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;@SpringBootTest&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;JDK 6+&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Spring Boot 1.5&lt;/td&gt;
					&lt;td&gt;2017-01&lt;/td&gt;
					&lt;td&gt;Kafka/Actuator 完善&lt;/td&gt;
					&lt;td&gt;JDK 7+&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Spring Boot 2.0&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;2018-03&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;WebFlux、Reactive、Java 8+&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;JDK 8+&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Spring Boot 2.1&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;2018-10&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;GraalVM（实验）、性能优化&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;JDK 8+&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="21-spring-boot-版本命名规则"&gt;2.1 Spring Boot 版本命名规则
&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;/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;Alpha：不建议使用，主要是以实现软件功能为主，通常只在软件开发者内部交流，Bug 较多；
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Beta：该版本相对于α版已有了很大的改进，消除了严重的错误，但还是存在着一些缺陷，需要经过多次测试来进一步消除；
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GA：General Availability，正式版本，官方推荐使用此版本，在国外都是用GA来说明release版本；
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;M：又叫里程碑版本，表示该版本较之前版本有功能上的重大更新；
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PRE(不建议使用)：预览版，内部测试版，主要是给开发人员和测试人员测试和找BUG用的；
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Release：最终版本，Release不会以单词形式出现在软件封面上，取而代之的是符号®；
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RC：该版本已经相当成熟了，基本上不存在导致错误的BUG，与即将发行的正式版相差无几；
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SNAPSHOT：快照版，可以稳定使用，且仍在继续改进版本。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SR.X：修正版，服务版本，当项目发布积累到一定程度，需要修复该版本中的某个错误后以此来命名，X表示数字。
&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="22-截至-2024-12-的版本选择"&gt;2.2 截至 2024-12 的版本选择
&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;/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;3.0.0(SNAPSHOT) 最少 java17 （未发布）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2.7.5(SNAPSHOT) 最少 java8 （生产）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2.6.13(SNAPSHOT) 最少 java8 （生产）
&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;（2024 视角）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;保守派&lt;/strong&gt;：Spring Boot 3.3 + JDK 17（LTS 长期维护组合）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;激进派&lt;/strong&gt;：Spring Boot 3.4 + JDK 21（虚拟线程 + 模式匹配）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;存量维护&lt;/strong&gt;：Spring Boot 2.7（已于 2023-11 停止 OSS 支持，仅商业支持）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="23-spring-boot-26--27-关键变化"&gt;2.3 Spring Boot 2.6 → 2.7 关键变化
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;2.6（2021-11）默认禁止循环引用&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;# 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;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;main&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;allow-circular-references&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;# 2.6 之前隐式允许，2.6+ 默认禁止&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.7（2022-05）核心新特性&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@AutoConfiguration&lt;/code&gt; 注解（替换过时的注册方式）&lt;/li&gt;
&lt;li&gt;GraphQL 支持&lt;/li&gt;
&lt;li&gt;Podman 支持（替代 Docker）&lt;/li&gt;
&lt;li&gt;RabbitStreamTemplate 支持&lt;/li&gt;
&lt;li&gt;Hazelcast 支持&lt;/li&gt;
&lt;li&gt;Cache2k 支持&lt;/li&gt;
&lt;li&gt;Web Server SSL 增强&lt;/li&gt;
&lt;li&gt;Info 端点增强&lt;/li&gt;
&lt;li&gt;单元测试加强&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三版本选型实战建议2024-年时点"&gt;三、版本选型实战建议（2024 年时点）
&lt;/h2&gt;&lt;h3 id="31-新项目起步"&gt;3.1 新项目起步
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;JDK&lt;/th&gt;
					&lt;th&gt;Spring Boot&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;企业内部管理系统&lt;/td&gt;
					&lt;td&gt;17&lt;/td&gt;
					&lt;td&gt;3.3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;互联网电商&lt;/td&gt;
					&lt;td&gt;21（虚拟线程）&lt;/td&gt;
					&lt;td&gt;3.4&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;金融/政府强合规&lt;/td&gt;
					&lt;td&gt;17（合规）&lt;/td&gt;
					&lt;td&gt;3.2（稳定）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;IoT 边缘计算&lt;/td&gt;
					&lt;td&gt;21&lt;/td&gt;
					&lt;td&gt;3.4&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="32-升级路径"&gt;3.2 升级路径
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;JDK 8 → JDK 11 升级清单&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 升级构建工具&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mvn -version &lt;span class="c1"&gt;# 确认 Maven 3.5+&lt;/span&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 class="c1"&gt;# 2. 升级依赖&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;dependency&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;groupId&amp;gt;javax.xml.bind&amp;lt;/groupId&amp;gt; &amp;lt;!-- 移除 --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;artifactId&amp;gt;jaxb-api&amp;lt;/artifactId&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;/dependency&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;!-- 替换为 --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;dependency&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;groupId&amp;gt;jakarta.xml.bind&amp;lt;/groupId&amp;gt; &amp;lt;!-- JDK 11+ --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;artifactId&amp;gt;jakarta.xml.bind-api&amp;lt;/artifactId&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;version&amp;gt;2.3.3&amp;lt;/version&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;/dependency&amp;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 class="c1"&gt;# 3. 升级 IDE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# IntelliJ IDEA 2018.3+ 支持 JDK 11&lt;/span&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 class="c1"&gt;# 4. 升级框架&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;parent&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;version&amp;gt;2.1.0.RELEASE&amp;lt;/version&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;/parent&amp;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;Spring Boot 1.5 → 2.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;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-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- javax → jakarta 替换 --&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;javax.servlet&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;javax.servlet-api&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="c"&gt;&amp;lt;!-- 替换为 --&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;javax.servlet&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;javax.servlet-api&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;4.0.1&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;&amp;lt;!-- 升级到 4.0+ 支持 Jakarta EE --&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- Tomcat 8 → 9 --&amp;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;&amp;lt;!-- Hibernate 5 → 6 --&amp;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;&amp;lt;!-- Thymeleaf 3 → 4 --&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="33-监控升级"&gt;3.3 监控升级
&lt;/h3&gt;&lt;p&gt;升级后必做的几件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;JVM 启动参数对比&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# JDK 8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;JAVA_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-Xms4g -Xmx4g -XX:PermSize=512m -XX:MaxPermSize=512m&amp;#34;&lt;/span&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 class="c1"&gt;# JDK 11+（PermGen 已被移除）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;JAVA_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-Xms4g -Xmx4g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m&amp;#34;&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;ol start="2"&gt;
&lt;li&gt;&lt;strong&gt;GC 切换&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# JDK 8 默认&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-XX:+UseParallelGC
&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 class="c1"&gt;# JDK 11 推荐（低延迟）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-XX:+UseG1GC
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-XX:MaxGCPauseMillis&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&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 class="c1"&gt;# JDK 11 试验（超低延迟）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-XX:+UseZGC
&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;ol start="3"&gt;
&lt;li&gt;&lt;strong&gt;监控接入&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&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-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Spring Boot 2.1 Actuator&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;management&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;endpoints&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;web&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;exposure&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;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;*&amp;#34;&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;endpoint&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;health&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;show-details&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&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;h2 id="四写在最后"&gt;四、写在最后
&lt;/h2&gt;&lt;p&gt;2024 年这个时点，Java 生态已经历了&amp;quot;JDK 17 → JDK 21&amp;quot;、&amp;ldquo;Spring Boot 2.x → 3.x&amp;quot;两轮大升级。&lt;strong&gt;对于一个想保持竞争力的 Java 团队&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;保守策略&lt;/strong&gt;：JDK 17 + Spring Boot 3.3 → 2025 评估 JDK 21 升级&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;激进策略&lt;/strong&gt;：JDK 21 + Spring Boot 3.4（2024 当下就用，吃虚拟线程红利）&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;个人建议&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2024 年新项目：&lt;strong&gt;直接用 JDK 21 + Spring Boot 3.4&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;已有项目升级：&lt;strong&gt;以 JDK 17 + Spring Boot 3.3 为目标版本，2025 上半年完成&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;长期规划：&lt;strong&gt;2026 年底前完成所有项目 JDK 21 升级&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h2 id="五2024-视角回望-2018"&gt;五、2024 视角回望 2018
&lt;/h2&gt;&lt;p&gt;站在 2024 年 12 月回望 2018 年 12 月那篇文章的选型判断，&lt;strong&gt;6 年时间 Java 生态的演进有三条主线&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;LTS 节奏真正加速&lt;/strong&gt;：2018 年还是&amp;quot;3 年一版 LTS&amp;quot;的预期，2024 年看是&amp;quot;2 年一版 LTS&amp;rdquo;（17→19→21）。企业升级窗口期被进一步压缩&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Boot 2.6/2.7 完成了 1.x → 2.x 最后的过渡&lt;/strong&gt;：默认禁止循环引用（2.6）、&lt;code&gt;@AutoConfiguration&lt;/code&gt; 注解（2.7）都是为 3.0 破坏性升级铺路&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GraalVM 从实验变实战&lt;/strong&gt;：2018 年 Spring Boot 2.1 提&amp;quot;GraalVM 实验&amp;quot;，到 2024 年 Spring Boot 3.x + GraalVM Native Image 已成云原生部署标配&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JDK 8 的&amp;quot;超长服役&amp;quot;被打破&lt;/strong&gt;：2024 年新项目几乎默认 JDK 17+，&amp;ldquo;用 JDK 8 起步&amp;quot;已是历史&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/spring-projects/spring-boot/releases" target="_blank" rel="noopener"
 &gt;Spring Boot 官方发布说明&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://spring.io/projects/spring-boot#learn" target="_blank" rel="noopener"
 &gt;Spring Boot 学习&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.oracle.com/java/technologies/javase/8all-relnotes.html" target="_blank" rel="noopener"
 &gt;Oracle JDK 8 发布说明&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://openjdk.java.net/projects/jdk/11/" target="_blank" rel="noopener"
 &gt;OpenJDK 11 发布说明&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>国内 SaaS 后台脚手架三巨头横评：jeecg-boot / ruoyi-cloud-plus / yudao-cloud</title><link>https://liangweidonggood.github.io/p/guonei-saas-jiaoshoujia-sanjutou-hengping/</link><pubDate>Sun, 15 Sep 2024 00:00:00 +0800</pubDate><guid>https://liangweidonggood.github.io/p/guonei-saas-jiaoshoujia-sanjutou-hengping/</guid><description>&lt;img src="https://liangweidonggood.github.io/p/guonei-saas-jiaoshoujia-sanjutou-hengping/image/cover.jpg" alt="Featured image of post 国内 SaaS 后台脚手架三巨头横评：jeecg-boot / ruoyi-cloud-plus / yudao-cloud" /&gt;&lt;p&gt;2024 年 9 月，回看 2017 年那个时点——国内&amp;quot;后台管理系统脚手架&amp;quot;赛道已经走过 7 年——从 jeecg-boot 一枝独秀，到 RuoYi 系生态扩散，再到 yudao-cloud 的&amp;quot;商业文档 + 全套 UI&amp;quot;打法，三款框架占据了 7 年里国内中小企业 SaaS 后台的 80% 选型份额。本文站在 2024 年（这三款已经稳态发展的时点）做一次系统性的横评。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;本文写于 2024 年 9 月&lt;/strong&gt;——&lt;code&gt;jeecg-boot&lt;/code&gt; 已演进到 3.7+、&lt;code&gt;RuoYi-Cloud-Plus&lt;/code&gt; 已是 Dromara 旗舰、&lt;code&gt;yudao-cloud&lt;/code&gt; 仍是&amp;quot;商业文档 + 全套 UI&amp;quot;打法。三巨头在 2024 年都做成了&amp;quot;全家桶&amp;quot;，但&lt;strong&gt;技术选型的分叉其实在 2017-2020 年间就埋下了&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一三巨头基本信息"&gt;一、三巨头基本信息
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;jeecg-boot&lt;/th&gt;
					&lt;th&gt;RuoYi-Cloud-Plus&lt;/th&gt;
					&lt;th&gt;yudao-cloud&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;2014-09&lt;/td&gt;
					&lt;td&gt;2019-08（RuoYi-Cloud 起点）&lt;/td&gt;
					&lt;td&gt;2020-04&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;组织&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;个人 → 团队 jeecgboot&lt;/td&gt;
					&lt;td&gt;Dromara 组织（dromara.org）&lt;/td&gt;
					&lt;td&gt;芋道源码（个人）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;GitHub 仓库&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;jeecgboot/jeecg-boot&lt;/td&gt;
					&lt;td&gt;dromara/RuoYi-Vue-Plus / aiclear/RuoYi-Cloud-Plus&lt;/td&gt;
					&lt;td&gt;zhijiantianya/yudao-cloud&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;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;前端技术栈&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Vue 2/3 + Ant Design Vue&lt;/td&gt;
					&lt;td&gt;Vue 3 + Element Plus&lt;/td&gt;
					&lt;td&gt;Vue 3 + Vben Admin&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 Boot 2.6.6（3.4.2 版本时点）&lt;/td&gt;
					&lt;td&gt;Spring Boot 2.7+ / Spring Cloud Alibaba&lt;/td&gt;
					&lt;td&gt;Spring Boot 2.7+ / Spring Cloud Alibaba&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;/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;文档收费 199/年 + 代码免费&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;说明（2024 视角）&lt;/strong&gt;：jeecg-boot 的&amp;quot;3.4.2 版本&amp;quot;实际发布于 2022-09-22，但 jeecg-boot 项目本身在 2014 年就启动了。本表以&amp;quot;3.4.2 版本时点&amp;quot;为参照点，&lt;strong&gt;对照 2017 年那个时点 jeecg-boot 还在 1.x 时代&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="二定位差异低代码--快速开发--全场景"&gt;二、定位差异：低代码 / 快速开发 / 全场景
&lt;/h2&gt;&lt;h3 id="21-jeecg-boot低代码--表单设计器"&gt;2.1 jeecg-boot：低代码 + 表单设计器
&lt;/h3&gt;&lt;p&gt;jeecg-boot 的差异化武器是 &lt;strong&gt;&amp;ldquo;在线表单设计器&amp;rdquo;&lt;/strong&gt; 和 &lt;strong&gt;&amp;ldquo;代码生成器&amp;rdquo;&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;可视化建模&lt;/strong&gt;：在网页上拖拽生成表单/列表/报表，无需手写 Vue 组件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码生成器&lt;/strong&gt;：数据库表设计完成后，一键生成前后端代码 + 菜单 + 权限&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工作流引擎&lt;/strong&gt;：内置 Activiti/Camunda，支持复杂审批流&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;报表引擎&lt;/strong&gt;：积木报表 + JimuReport 拖拽式大屏&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;政府 / 国企 / 事业单位的&amp;quot;信息管理系统&amp;quot;（OA、ERP、CRM 等）&lt;/li&gt;
&lt;li&gt;业务表单多、流程长、但不需要高并发的内部系统&lt;/li&gt;
&lt;li&gt;团队希望&amp;quot;零代码 + 少量定制&amp;quot;完成交付&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-ruoyi-cloud-plus快速开发--多租户"&gt;2.2 RuoYi-Cloud-Plus：快速开发 + 多租户
&lt;/h3&gt;&lt;p&gt;RuoYi 系是国内&amp;quot;快速开发脚手架&amp;quot;的事实标准，到 2019 年的 RuoYi-Cloud-Plus 已经演化成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多租户体系&lt;/strong&gt;：基于 MyBatis-Plus &lt;code&gt;tenant_id&lt;/code&gt; 字段的全链路隔离&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SaaS 架构&lt;/strong&gt;：单服务多租户 + 多服务多租户两种模式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完善权限&lt;/strong&gt;：RBAC + 数据权限 + 按钮权限三级粒度&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;中小企业 SaaS 产品（要卖给多个客户）&lt;/li&gt;
&lt;li&gt;内部系统多、组织结构复杂&lt;/li&gt;
&lt;li&gt;团队希望&amp;quot;接过来就能改&amp;quot;而不需要从零搭&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="23-yudao-cloud全场景商城--报表"&gt;2.3 yudao-cloud：全场景商城 + 报表
&lt;/h3&gt;&lt;p&gt;yudao-cloud 是&amp;quot;商城 + 营销 + 会员 + 报表&amp;quot;一体化的产物：&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;CRM 会员&lt;/strong&gt;：会员等级 / 权益 / 储值 / 邀请&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据大屏&lt;/strong&gt;：基于 VChart + 大屏模板&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;/li&gt;
&lt;li&gt;需要快速搭建&amp;quot;商业化产品&amp;quot;原型&lt;/li&gt;
&lt;li&gt;团队愿意买文档（199/年）来省时间&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三技术栈对比"&gt;三、技术栈对比
&lt;/h2&gt;&lt;h3 id="31-后端对比"&gt;3.1 后端对比
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;组件&lt;/th&gt;
					&lt;th&gt;jeecg-boot&lt;/th&gt;
					&lt;th&gt;RuoYi-Cloud-Plus&lt;/th&gt;
					&lt;th&gt;yudao-cloud&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Spring Boot&lt;/td&gt;
					&lt;td&gt;2.6.6&lt;/td&gt;
					&lt;td&gt;2.7+&lt;/td&gt;
					&lt;td&gt;2.7+&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Spring Cloud&lt;/td&gt;
					&lt;td&gt;Hoxton&lt;/td&gt;
					&lt;td&gt;2021&lt;/td&gt;
					&lt;td&gt;2021&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;注册中心&lt;/td&gt;
					&lt;td&gt;Nacos&lt;/td&gt;
					&lt;td&gt;Nacos&lt;/td&gt;
					&lt;td&gt;Nacos&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;配置中心&lt;/td&gt;
					&lt;td&gt;Nacos&lt;/td&gt;
					&lt;td&gt;Nacos&lt;/td&gt;
					&lt;td&gt;Nacos&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;网关&lt;/td&gt;
					&lt;td&gt;Spring Cloud Gateway&lt;/td&gt;
					&lt;td&gt;Gateway&lt;/td&gt;
					&lt;td&gt;Gateway&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;权限&lt;/td&gt;
					&lt;td&gt;Shiro + JWT&lt;/td&gt;
					&lt;td&gt;Sa-Token（Plus 版本）&lt;/td&gt;
					&lt;td&gt;Sa-Token&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ORM&lt;/td&gt;
					&lt;td&gt;MyBatis-Plus&lt;/td&gt;
					&lt;td&gt;MyBatis-Plus&lt;/td&gt;
					&lt;td&gt;MyBatis-Plus&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数据库&lt;/td&gt;
					&lt;td&gt;MySQL/Oracle/PostgreSQL&lt;/td&gt;
					&lt;td&gt;MySQL/Oracle/PostgreSQL/SQLServer&lt;/td&gt;
					&lt;td&gt;MySQL/Oracle/PostgreSQL&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;缓存&lt;/td&gt;
					&lt;td&gt;Redis&lt;/td&gt;
					&lt;td&gt;Redis&lt;/td&gt;
					&lt;td&gt;Redis&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;消息队列&lt;/td&gt;
					&lt;td&gt;RabbitMQ/RocketMQ/Kafka&lt;/td&gt;
					&lt;td&gt;RocketMQ/Kafka&lt;/td&gt;
					&lt;td&gt;RocketMQ/Kafka&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;工作流&lt;/td&gt;
					&lt;td&gt;Activiti/Camunda&lt;/td&gt;
					&lt;td&gt;Flowable（可选）&lt;/td&gt;
					&lt;td&gt;Flowable（可选）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="32-前端对比"&gt;3.2 前端对比
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;组件&lt;/th&gt;
					&lt;th&gt;jeecg-boot&lt;/th&gt;
					&lt;th&gt;RuoYi-Cloud-Plus&lt;/th&gt;
					&lt;th&gt;yudao-cloud&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;框架&lt;/td&gt;
					&lt;td&gt;Vue 2/3&lt;/td&gt;
					&lt;td&gt;Vue 3&lt;/td&gt;
					&lt;td&gt;Vue 3&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;UI 库&lt;/td&gt;
					&lt;td&gt;Ant Design Vue&lt;/td&gt;
					&lt;td&gt;Element Plus&lt;/td&gt;
					&lt;td&gt;Element Plus&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;状态管理&lt;/td&gt;
					&lt;td&gt;Vuex / Pinia&lt;/td&gt;
					&lt;td&gt;Pinia&lt;/td&gt;
					&lt;td&gt;Pinia&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;构建工具&lt;/td&gt;
					&lt;td&gt;Vite&lt;/td&gt;
					&lt;td&gt;Vite&lt;/td&gt;
					&lt;td&gt;Vite&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;包管理&lt;/td&gt;
					&lt;td&gt;pnpm/yarn&lt;/td&gt;
					&lt;td&gt;pnpm&lt;/td&gt;
					&lt;td&gt;pnpm&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;组件库丰富度&lt;/td&gt;
					&lt;td&gt;高（Ant Design 全套）&lt;/td&gt;
					&lt;td&gt;中（Element Plus + 自封装）&lt;/td&gt;
					&lt;td&gt;高（Vben Admin）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;移动端&lt;/td&gt;
					&lt;td&gt;uniapp + 微信小程序&lt;/td&gt;
					&lt;td&gt;单独 RuoYi-App&lt;/td&gt;
					&lt;td&gt;uniapp（yudao-ui-admin-uniapp）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="四代码生成器对比"&gt;四、代码生成器对比
&lt;/h2&gt;&lt;p&gt;这是三巨头最容易拉开差距的地方：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;jeecg-boot&lt;/th&gt;
					&lt;th&gt;RuoYi-Cloud-Plus&lt;/th&gt;
					&lt;th&gt;yudao-cloud&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;在线设计器 + 模板引擎&lt;/td&gt;
					&lt;td&gt;Freemarker/Velocity 模板&lt;/td&gt;
					&lt;td&gt;代码生成器 GUI&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;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;数据库支持&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;MySQL/Oracle/PostgreSQL&lt;/td&gt;
					&lt;td&gt;MySQL/Oracle/PostgreSQL/SQLServer&lt;/td&gt;
					&lt;td&gt;MySQL/Oracle/PostgreSQL&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;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;生成代码质量&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;中（基础 CRUD）&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;高（含 Service 业务逻辑）&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;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;实战建议&lt;/strong&gt;：如果你只需要&amp;quot;表单 + 列表 + 增删改查&amp;quot;——jeecg-boot 的&amp;quot;零代码&amp;quot;最快；如果你要&amp;quot;业务状态机 + 完整流程&amp;quot;——yudao-cloud 的代码生成器更智能；如果你的团队在 RuoYi 生态深耕多年——RuoYi-Cloud-Plus 的迁移成本最低。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="五二开组织流程对比"&gt;五、二开组织流程对比
&lt;/h2&gt;&lt;h3 id="51-jeecg-bootfork--双分支策略"&gt;5.1 jeecg-boot：fork + 双分支策略
&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. fork 到自己仓库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/liangweidonggood/jeecg-boot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; jeecg-boot
&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 class="c1"&gt;# 2. 本地 dev 分支开发&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git checkout -b dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git pull
&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 class="c1"&gt;# 3. master 永远跟开源保持一致&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git checkout master
&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 class="c1"&gt;# 4. 设置 upstream 开源仓库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote add upstream https://github.com/jeecgboot/jeecg-boot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git fetch upstream master
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git merge upstream/master &lt;span class="c1"&gt;# 合并开源更新到本地 master&lt;/span&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 class="c1"&gt;# 5. 切回 dev，rebase 同步&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git checkout dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git rebase master
&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;code&gt;master&lt;/code&gt; 永远不污染，&lt;code&gt;dev&lt;/code&gt; 上做二次开发。需要拉取开源更新时，先 rebase master 再开发。&lt;/p&gt;
&lt;h3 id="52-ruoyi-cloud-plus四层仓库模型"&gt;5.2 RuoYi-Cloud-Plus：四层仓库模型
&lt;/h3&gt;&lt;p&gt;Dromara 系标准的二开流程：&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;/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;原始开源项目（gitee/github）→ fork 开源仓库 → 私有仓库 → fork 私有仓库
&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;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;原始开源项目&lt;/td&gt;
					&lt;td&gt;原作者维护，只读&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;fork 开源仓库&lt;/td&gt;
					&lt;td&gt;合并上游更新，向原始提 PR&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;私有仓库&lt;/td&gt;
					&lt;td&gt;内部 fork 镜像，只从 fork 原始拉取&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;fork 私有仓库&lt;/td&gt;
					&lt;td&gt;日常开发提交，PR 回 fork 原始&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;/li&gt;
&lt;li&gt;内部分支保护严格（&lt;code&gt;protected branch&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;提交链路清晰（私有 → 原始 fork → 原始开源）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="53-yudao-cloud商业文档--单仓库模式"&gt;5.3 yudao-cloud：商业文档 + 单仓库模式
&lt;/h3&gt;&lt;p&gt;yudao-cloud 走的是&amp;quot;商业文档 + 单仓库&amp;quot;模式：&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 文档订阅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;访问 https://cloud.iocoder.cn/ 购买 199/年 文档
&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 class="c1"&gt;# 2. 仓库 clone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://gitee.com/zhijiantianya/yudao-cloud
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://gitee.com/yudaocode/yudao-ui-admin-vue3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://gitee.com/yudaocode/yudao-ui-admin-uniapp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://gitee.com/yudaocode/yudao-mall-uniapp
&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 class="c1"&gt;# 3. 直接修改&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 没有 fork 规范要求，因为社区维护&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;：&amp;ldquo;文档即产品&amp;rdquo;——199/年的费用覆盖了详细教程 + 视频 + 答疑群，代码本身免费。&lt;/p&gt;
&lt;h2 id="六选型决策树"&gt;六、选型决策树
&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 A[需要搭建后台系统] --&gt; B{业务类型?}
 B --&gt;|OA/ERP/CRM 表单为主| C{需要零代码?}
 B --&gt;|通用 CRUD + 多租户| D[选 RuoYi-Cloud-Plus]
 B --&gt;|电商/营销/会员| E[选 yudao-cloud]

 C --&gt;|是| F[选 jeecg-boot]
 C --&gt;|否| D

 F --&gt; G{需要工作流?}
 G --&gt;|是| F
 G --&gt;|否| H{团队是否熟悉 Ant Design?}
 H --&gt;|是| F
 H --&gt;|否| D

 D --&gt; I{需要多租户?}
 I --&gt;|是| D
 I --&gt;|否| J{团队是否在 RuoYi 生态?}
 J --&gt;|是| D
 J --&gt;|否| K{是否愿意买文档?}
 K --&gt;|是| E
 K --&gt;|否| D&lt;/pre&gt;&lt;h2 id="七实战对比表2017-2024-七年使用感受"&gt;七、实战对比表（2017-2024 七年使用感受）
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;jeecg-boot&lt;/th&gt;
					&lt;th&gt;RuoYi-Cloud-Plus&lt;/th&gt;
					&lt;th&gt;yudao-cloud&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;中等（Ant Design + 定制组件）&lt;/td&gt;
					&lt;td&gt;低（Element Plus）&lt;/td&gt;
					&lt;td&gt;中等（Vben 复杂）&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;优秀（Dromara 维护）&lt;/td&gt;
					&lt;td&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;中（QQ 群 + 论坛）&lt;/td&gt;
					&lt;td&gt;高（Gitee + GitHub + 社区）&lt;/td&gt;
					&lt;td&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;/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;/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;/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;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;适合团队规模&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;5-30 人&lt;/td&gt;
					&lt;td&gt;3-15 人&lt;/td&gt;
					&lt;td&gt;3-10 人&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="八迁移成本对比"&gt;八、迁移成本对比
&lt;/h2&gt;&lt;h3 id="81-jeecg-boot--ruoyi"&gt;8.1 jeecg-boot → RuoYi
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据库&lt;/strong&gt;：表结构差异大，需要重建（jeecg 用 &lt;code&gt;sys_*&lt;/code&gt; 前缀，RuoYi 用 &lt;code&gt;sys_*&lt;/code&gt; 但字段不同）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：组件层重写（Ant Design Vue → Element Plus）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限&lt;/strong&gt;：重新设计（Shiro → Sa-Token）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工时&lt;/strong&gt;：2-3 人月&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="82-ruoyi--yudao"&gt;8.2 RuoYi → yudao
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据库&lt;/strong&gt;：表结构相似度高（都基于 MyBatis-Plus）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码&lt;/strong&gt;：业务模块重写（yudao 业务逻辑更复杂）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限&lt;/strong&gt;：基本一致（都用 Sa-Token）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工时&lt;/strong&gt;：1-2 人月&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="83-跨生态"&gt;8.3 跨生态
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;jeecg ↔ yudao&lt;/strong&gt;：成本极高（4-6 人月）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;jeecg ↔ RuoYi&lt;/strong&gt;：成本高（3-4 人月）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="九写在最后2024-视角回望-2017"&gt;九、写在最后（2024 视角回望 2017）
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;关键提醒&lt;/strong&gt;：本文 2024 年 9 月时点写就，三巨头定位和技术栈与未来可能有差异。&lt;strong&gt;选型时要根据当下时点的最新版本做技术调研&lt;/strong&gt;，不要照搬 2024 年的判断。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;2024 年的今天，&lt;strong&gt;国内 SaaS 后台脚手架赛道已经基本尘埃落定&lt;/strong&gt;。三巨头的差异化竞争是好事——&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;jeecg-boot 在&amp;quot;低代码 + 政府项目&amp;quot;上保持优势&lt;/li&gt;
&lt;li&gt;RuoYi-Cloud-Plus 在&amp;quot;中小企业 SaaS&amp;quot;上占据主流&lt;/li&gt;
&lt;li&gt;yudao-cloud 在&amp;quot;电商 + 营销&amp;quot;上有完整解决方案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2017→2024 这 7 年里，三巨头的关键变化&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;jeecg-boot&lt;/strong&gt; 经历过&amp;quot;商业版收费风波 → 重归开源&amp;quot;，3.4.2（2022-09）后稳态&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RuoYi&lt;/strong&gt; 从单体版到 RuoYi-Cloud 再到 RuoYi-Cloud-Plus（2022），Dromara 组织化运营让生态更稳&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;yudao-cloud&lt;/strong&gt; 走通&amp;quot;文档收费 199/年 + 代码免费&amp;quot;模式，被模仿者众多&lt;/li&gt;
&lt;/ol&gt;

 &lt;blockquote&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;：先用 RuoYi-Cloud-Plus（社区活跃 + 文档好 + 升级平滑）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;政府/国企项目&lt;/strong&gt;：选 jeecg-boot（工作流 + 表单设计器）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;电商/营销系统&lt;/strong&gt;：选 yudao-cloud（买文档省时间）&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;0.4 批次《开源生态观察》一文已盘点过国内开源生态全景&lt;/li&gt;
&lt;li&gt;jeecg-boot 3.4.2（2022-09-22 发布）的更新日志&lt;/li&gt;
&lt;li&gt;RuoYi-Cloud-Plus 官方文档 &lt;a class="link" href="https://plus-doc.dromara.org/" target="_blank" rel="noopener"
 &gt;https://plus-doc.dromara.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;yudao-cloud 商业文档 &lt;a class="link" href="https://cloud.iocoder.cn/" target="_blank" rel="noopener"
 &gt;https://cloud.iocoder.cn/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>国内开源 Java 脚手架生态全景：Dromara 组织与低代码平台横评</title><link>https://liangweidonggood.github.io/p/guonei-kaiyuan-java-jiaoshoujia-shengtai-quanjing/</link><pubDate>Sun, 15 Sep 2024 00:00:00 +0800</pubDate><guid>https://liangweidonggood.github.io/p/guonei-kaiyuan-java-jiaoshoujia-shengtai-quanjing/</guid><description>&lt;img src="https://liangweidonggood.github.io/p/guonei-kaiyuan-java-jiaoshoujia-shengtai-quanjing/image/cover.jpg" alt="Featured image of post 国内开源 Java 脚手架生态全景：Dromara 组织与低代码平台横评" /&gt;&lt;p&gt;2024 年的今天，国内 Java 生态的&amp;quot;脚手架&amp;quot;赛道已经从单点竞争演化为&amp;quot;组织化运营&amp;quot;——Dromara 组织 200+ 仓库、jeecg 团队 30+ 项目、个人作者（芋道/青苗/小傅哥）百花齐放。&lt;strong&gt;对于一个想快速搭建后台系统的团队，从 22 款主流脚手架中选型是必经之路&lt;/strong&gt;。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;本文写于 2024 年 9 月&lt;/strong&gt;——Dromara 组织成立 6 年，已成为国内 Java 生态最具影响力的非营利组织。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一dromara-组织概览"&gt;一、Dromara 组织概览
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://dromara.org/zh/about/" target="_blank" rel="noopener"
 &gt;Dromara&lt;/a&gt; 是由国内 Java 开发者共同创建的&lt;strong&gt;非营利开源组织&lt;/strong&gt;，目标是&amp;quot;让每一个 Java 工程师都能用上优秀的脚手架&amp;quot;。截至 2024-09：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;仓库数&lt;/strong&gt;：200+ 个&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心项目&lt;/strong&gt;：50+ 个&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代表作品&lt;/strong&gt;：RuoYi-Vue-Plus、Sa-Token、Hutool、Forest、TLog、Cube、Raincat、Sureness&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="二22-款主流脚手架全景"&gt;二、22 款主流脚手架全景
&lt;/h2&gt;&lt;h3 id="21-脚手架横向对比"&gt;2.1 脚手架横向对比
&lt;/h3&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;&lt;strong&gt;jeecg-boot&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;github.com/jeecgboot/jeecg-boot&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;低代码后台&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jeecgboot-vue3&lt;/td&gt;
					&lt;td&gt;github.com/jeecgboot/jeecgboot-vue3&lt;/td&gt;
					&lt;td&gt;jeecg-boot Vue 3 前端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jeecg-uniapp&lt;/td&gt;
					&lt;td&gt;github.com/jeecgboot/jeecg-uniapp&lt;/td&gt;
					&lt;td&gt;jeecg-boot 移动端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jeesite&lt;/td&gt;
					&lt;td&gt;github.com/thinkgem/jeesite&lt;/td&gt;
					&lt;td&gt;老牌 Java 脚手架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;tianti&lt;/td&gt;
					&lt;td&gt;github.com/xujeff/tianti&lt;/td&gt;
					&lt;td&gt;CMS 解决方案&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;e&lt;/td&gt;
					&lt;td&gt;github.com/fuhoujun/e&lt;/td&gt;
					&lt;td&gt;微服务脚手架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jeesite (JeeSite)&lt;/td&gt;
					&lt;td&gt;github.com/thinkgem/jeesite&lt;/td&gt;
					&lt;td&gt;Java 脚手架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;PublicCMS&lt;/td&gt;
					&lt;td&gt;github.com/sanluan/PublicCMS&lt;/td&gt;
					&lt;td&gt;CMS 管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;pig&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;github.com/pig-mesh/pig&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;微服务脚手架&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Heeexy/SpringBoot-Shiro-Vue&lt;/td&gt;
					&lt;td&gt;github.com/Heeexy/SpringBoot-Shiro-Vue&lt;/td&gt;
					&lt;td&gt;简单权限&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Springboot_v2&lt;/td&gt;
					&lt;td&gt;github.com/fuce1314/Springboot_v2&lt;/td&gt;
					&lt;td&gt;小架子&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;COLA&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;github.com/alibaba/COLA&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;SpringBlade&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;github.com/chillzhuang/SpringBlade&lt;/td&gt;
					&lt;td&gt;微服务脚手架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Saber&lt;/td&gt;
					&lt;td&gt;gitee.com/smallc/Saber&lt;/td&gt;
					&lt;td&gt;SpringBlade 前端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;eladmin&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;github.com/elunez/eladmin&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;后台管理&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;eladmin-web&lt;/td&gt;
					&lt;td&gt;github.com/elunez/eladmin-web&lt;/td&gt;
					&lt;td&gt;eladmin 前端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;dokit&lt;/td&gt;
					&lt;td&gt;github.com/perye/dokit&lt;/td&gt;
					&lt;td&gt;工具型脚手架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;lamp-cloud&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;github.com/zuihou/lamp-cloud&lt;/td&gt;
					&lt;td&gt;微服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SpringCloud&lt;/td&gt;
					&lt;td&gt;github.com/zhoutaoo/SpringCloud&lt;/td&gt;
					&lt;td&gt;微服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Groza&lt;/td&gt;
					&lt;td&gt;github.com/IoT-Technology/Groza&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;物联网平台&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;thingsboard&lt;/td&gt;
					&lt;td&gt;github.com/thingsboard/thingsboard&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;物联网平台&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Spring-Cloud-Platform&lt;/td&gt;
					&lt;td&gt;github.com/wxiaoqi/Spring-Cloud-Platform&lt;/td&gt;
					&lt;td&gt;微服务&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="22-分类总结"&gt;2.2 分类总结
&lt;/h3&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;&lt;strong&gt;低代码&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;jeecg-boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;微服务&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;pig、SpringBlade、lamp-cloud、e、Spring-Cloud-Platform、zhoutaoo/SpringCloud&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;后台管理&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;eladmin、Heeexy/SpringBoot-Shiro-Vue、Springboot_v2&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;架构规范&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;alibaba/COLA（分层架构）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;工具/集成&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;perye/dokit、dromara 各项目&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;CMS&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;tianti、PublicCMS、jeesite&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;物联网&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Groza、thingsboard&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="三四大明星项目深度对比"&gt;三、四大明星项目深度对比
&lt;/h2&gt;&lt;h3 id="31-jeecg-boot低代码之王"&gt;3.1 jeecg-boot：低代码之王
&lt;/h3&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;代码生成器（数据库表 → 前后端代码）&lt;/li&gt;
&lt;li&gt;工作流引擎（Activiti/Camunda）&lt;/li&gt;
&lt;li&gt;报表引擎（积木报表 + JimuReport）&lt;/li&gt;
&lt;li&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 Boot 2.6.6 + MyBatis-Plus + Shiro + JWT&lt;/li&gt;
&lt;li&gt;前端：Vue 3 + Ant Design Vue&lt;/li&gt;
&lt;li&gt;移动端：UniApp&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;政府/国企 OA/ERP&lt;/li&gt;
&lt;li&gt;业务表单多、流程长的内部系统&lt;/li&gt;
&lt;li&gt;团队希望&amp;quot;零代码&amp;quot;完成交付&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="32-pig微服务--业务组件"&gt;3.2 pig：微服务 + 业务组件
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;核心特性&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring Cloud Alibaba 全家桶&lt;/li&gt;
&lt;li&gt;完善的多租户 + 权限体系&lt;/li&gt;
&lt;li&gt;代码生成器（支持自定义模板）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;avue 组件&lt;/strong&gt;（国内首个面向后台的 Vue UI 库）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pigx&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;后端：Spring Boot 2.7 + Spring Cloud Alibaba + MyBatis-Plus + Nacos&lt;/li&gt;
&lt;li&gt;前端：Vue 2 + avue + Element UI&lt;/li&gt;
&lt;li&gt;业务组件：30+（含 CMS、商城、CRM）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中小企业 SaaS 产品&lt;/li&gt;
&lt;li&gt;微服务架构的内部系统&lt;/li&gt;
&lt;li&gt;需要&amp;quot;业务组件即装即用&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="33-springblade微服务--多端"&gt;3.3 SpringBlade：微服务 + 多端
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;核心特性&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring Cloud 全家桶（Netflix + Alibaba）&lt;/li&gt;
&lt;li&gt;前后端分离 + 多端（Web / App / 小程序）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sword&lt;/strong&gt;（Saber）前端框架&lt;/li&gt;
&lt;li&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 Boot 2.x + Spring Cloud + MyBatis-Plus + Nacos + Sentinel&lt;/li&gt;
&lt;li&gt;前端（Web）：Vue 2 + Element UI&lt;/li&gt;
&lt;li&gt;前端（App）：UniApp&lt;/li&gt;
&lt;li&gt;网关：Spring Cloud Gateway&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;/li&gt;
&lt;li&gt;需要 Web + App + 小程序多端&lt;/li&gt;
&lt;li&gt;团队希望&amp;quot;一次开发多端运行&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="34-lamp-cloud微服务--集大成"&gt;3.4 lamp-cloud：微服务 + 集大成
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;核心特性&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于 Spring Cloud Alibaba 完整微服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;lamp-util&lt;/strong&gt; 工具集（30+ 工具模块）&lt;/li&gt;
&lt;li&gt;完善的多租户 + 数据权限&lt;/li&gt;
&lt;li&gt;代码生成器（增强版）&lt;/li&gt;
&lt;li&gt;工作流（Flowable）&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 Boot + Spring Cloud Alibaba + Nacos + Sentinel + Seata&lt;/li&gt;
&lt;li&gt;前端：Vue 3 + Vben Admin + TypeScript&lt;/li&gt;
&lt;li&gt;数据库：MyBatis-Plus + Druid + ShardingSphere&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;/li&gt;
&lt;li&gt;需要完整微服务治理&lt;/li&gt;
&lt;li&gt;团队希望&amp;quot;开箱即用&amp;quot;的全套组件&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="四技术栈对比"&gt;四、技术栈对比
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;jeecg-boot&lt;/th&gt;
					&lt;th&gt;pig&lt;/th&gt;
					&lt;th&gt;SpringBlade&lt;/th&gt;
					&lt;th&gt;lamp-cloud&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;Ant Design Vue&lt;/td&gt;
					&lt;td&gt;avue + Element UI&lt;/td&gt;
					&lt;td&gt;Element UI&lt;/td&gt;
					&lt;td&gt;Vben + TypeScript&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 Boot 2.6&lt;/td&gt;
					&lt;td&gt;Spring Boot 2.7&lt;/td&gt;
					&lt;td&gt;Spring Boot 2.x&lt;/td&gt;
					&lt;td&gt;Spring Boot 2.x&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;注册中心&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Nacos&lt;/td&gt;
					&lt;td&gt;Nacos&lt;/td&gt;
					&lt;td&gt;Nacos&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;Shiro + JWT&lt;/td&gt;
					&lt;td&gt;Spring Security&lt;/td&gt;
					&lt;td&gt;Spring Security&lt;/td&gt;
					&lt;td&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;/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;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;移动端&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;UniApp&lt;/td&gt;
					&lt;td&gt;独立 App&lt;/td&gt;
					&lt;td&gt;UniApp&lt;/td&gt;
					&lt;td&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;/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;/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;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="五dromara-组织明星项目盘点"&gt;五、Dromara 组织明星项目盘点
&lt;/h2&gt;&lt;h3 id="51-工具类"&gt;5.1 工具类
&lt;/h3&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;&lt;strong&gt;Hutool&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Java 工具集（代替 Guava）&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;Sa-Token&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;Forest&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Java HTTP 客户端（声明式调用）&lt;/td&gt;
					&lt;td&gt;替代 OkHttp&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;TLog&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;分布式日志链路追踪&lt;/td&gt;
					&lt;td&gt;轻量替代 SkyWalking&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Fast Request&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;IDEA 插件（API 调试）&lt;/td&gt;
					&lt;td&gt;Restful 替代 Postman&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Sureness&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;权限认证&lt;/td&gt;
					&lt;td&gt;替代 Spring Security&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;JPom&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;自动化部署&lt;/td&gt;
					&lt;td&gt;替代 Jenkins&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="52-中间件类"&gt;5.2 中间件类
&lt;/h3&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;&lt;strong&gt;Raincat&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;分布式事务（强一致 TCC）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Hmily&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;分布式事务（TCC + AT）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Myth&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;分布式事务（基于 MQ）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Cube&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;一站式 API 网关&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Gobrs-Async&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;异步编排框架&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="53-数据类"&gt;5.3 数据类
&lt;/h3&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;&lt;strong&gt;DynamicTp&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;动态线程池&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Neko&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;数据库访问（轻量 ORM）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="54-测试类"&gt;5.4 测试类
&lt;/h3&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;&lt;strong&gt;Phoenix&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;自动化测试平台&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Happy-Java&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Java 进阶之路&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Dante Cloud&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;企业级微服务（Spring Authorization Server）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="六项目例子"&gt;六、项目例子
&lt;/h2&gt;&lt;h3 id="61-行业模板"&gt;6.1 行业模板
&lt;/h3&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;IndoorPos&lt;/td&gt;
					&lt;td&gt;github.com/megagao/IndoorPos&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;室内定位&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;shardingsphere-example&lt;/td&gt;
					&lt;td&gt;github.com/apache/shardingsphere-example&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;数据库分片&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jtt1078-video-server&lt;/td&gt;
					&lt;td&gt;github.com/glaciall/jtt1078-video-server&lt;/td&gt;
					&lt;td&gt;视频转播服务器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jt809-tcp-server&lt;/td&gt;
					&lt;td&gt;github.com/ch0ice/jt809-tcp-server&lt;/td&gt;
					&lt;td&gt;jt809 协议&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jt808-netty&lt;/td&gt;
					&lt;td&gt;github.com/zpsw/jt808-netty&lt;/td&gt;
					&lt;td&gt;车载定位&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jt808-tcp-netty&lt;/td&gt;
					&lt;td&gt;github.com/rjli/jt808-tcp-netty&lt;/td&gt;
					&lt;td&gt;车载定位&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jt808-server&lt;/td&gt;
					&lt;td&gt;github.com/yezhihao/jt808-server&lt;/td&gt;
					&lt;td&gt;车载定位&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JT808&lt;/td&gt;
					&lt;td&gt;github.com/SmallChi/JT808&lt;/td&gt;
					&lt;td&gt;车载定位&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jt-808-protocol&lt;/td&gt;
					&lt;td&gt;github.com/hylexus/jt-808-protocol&lt;/td&gt;
					&lt;td&gt;车载定位&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jt-framework&lt;/td&gt;
					&lt;td&gt;github.com/hylexus/jt-framework&lt;/td&gt;
					&lt;td&gt;车载定位&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;mybatis-plus-samples&lt;/td&gt;
					&lt;td&gt;github.com/baomidou/mybatis-plus-samples&lt;/td&gt;
					&lt;td&gt;MyBatisPlus 例子&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;cjs-oauth2-sso-demo&lt;/td&gt;
					&lt;td&gt;github.com/chengjiansheng/cjs-oauth2-sso-demo&lt;/td&gt;
					&lt;td&gt;单点登录&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;spring-boot-security-oauth2-jwt&lt;/td&gt;
					&lt;td&gt;github.com/anthonyfoulfoin/spring-boot-security-oauth2-jwt&lt;/td&gt;
					&lt;td&gt;Spring Security&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Auth-service&lt;/td&gt;
					&lt;td&gt;github.com/keets2012/Auth-service&lt;/td&gt;
					&lt;td&gt;授权服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Mybatis-PageHelper&lt;/td&gt;
					&lt;td&gt;github.com/pagehelper/Mybatis-PageHelper&lt;/td&gt;
					&lt;td&gt;分页&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;spring-cloud-examples&lt;/td&gt;
					&lt;td&gt;github.com/ityouknow/spring-cloud-examples&lt;/td&gt;
					&lt;td&gt;Spring Cloud&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;simplemall&lt;/td&gt;
					&lt;td&gt;github.com/maventalker/simplemall&lt;/td&gt;
					&lt;td&gt;Spring Cloud&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;paascloud-master&lt;/td&gt;
					&lt;td&gt;github.com/paascloud/paascloud-master&lt;/td&gt;
					&lt;td&gt;Spring Cloud&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;spring-cloud-microservice-examples&lt;/td&gt;
					&lt;td&gt;github.com/zpng/spring-cloud-microservice-examples&lt;/td&gt;
					&lt;td&gt;Spring Cloud&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="62-协议类车载物联网"&gt;6.2 协议类（车载/物联网）
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;重点关注&lt;/strong&gt;：国内 JT/T 808 协议（交通部车载终端通讯协议）和 JT/T 1078 协议（车载视频传输协议）是车联网行业的核心协议。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="七学习路线"&gt;七、学习路线
&lt;/h2&gt;&lt;h3 id="71-入门"&gt;7.1 入门
&lt;/h3&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;&lt;strong&gt;wuyouzhuguli/SpringAll&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;github.com/wuyouzhuguli/SpringAll&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Spring 全家桶学习&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;websocketWithNetty&lt;/td&gt;
					&lt;td&gt;github.com/Siwash/websocketWithNetty&lt;/td&gt;
					&lt;td&gt;Netty + WebSocket&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;m3u8Download&lt;/td&gt;
					&lt;td&gt;github.com/qq494257084/m3u8Download&lt;/td&gt;
					&lt;td&gt;m3u8 视频下载&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Netty-study&lt;/td&gt;
					&lt;td&gt;github.com/xuwujing/Netty-study&lt;/td&gt;
					&lt;td&gt;Netty&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;netty-4-user-guide-demos&lt;/td&gt;
					&lt;td&gt;github.com/waylau/netty-4-user-guide-demos&lt;/td&gt;
					&lt;td&gt;Netty 实战&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;essential-netty-in-action&lt;/td&gt;
					&lt;td&gt;github.com/waylau/essential-netty-in-action&lt;/td&gt;
					&lt;td&gt;Netty 实战&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;netty-learning-example&lt;/td&gt;
					&lt;td&gt;github.com/sanshengshui/netty-learning-example&lt;/td&gt;
					&lt;td&gt;Netty&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;CookBook&lt;/td&gt;
					&lt;td&gt;github.com/Byron4j/CookBook&lt;/td&gt;
					&lt;td&gt;综合资料&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;toBeTopJavaer&lt;/td&gt;
					&lt;td&gt;github.com/hollischuang/toBeTopJavaer&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Java 成神之路&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;advanced-java&lt;/td&gt;
					&lt;td&gt;github.com/doocs/advanced-java&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;互联网 Java 进阶&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;java-design-patterns&lt;/td&gt;
					&lt;td&gt;github.com/iluwatar/java-design-patterns&lt;/td&gt;
					&lt;td&gt;设计模式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JavaGuide&lt;/td&gt;
					&lt;td&gt;github.com/Snailclimb/JavaGuide&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Java 学习+面试&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;CS-Notes&lt;/td&gt;
					&lt;td&gt;github.com/CyC2018/CS-Notes&lt;/td&gt;
					&lt;td&gt;综合资料&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Spring-Boot-In-Action&lt;/td&gt;
					&lt;td&gt;github.com/hansonwang99/Spring-Boot-In-Action&lt;/td&gt;
					&lt;td&gt;Spring Boot 实战&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SpringBootLearning&lt;/td&gt;
					&lt;td&gt;github.com/gf-huanchupk/SpringBootLearning&lt;/td&gt;
					&lt;td&gt;Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;spring-boot-examples&lt;/td&gt;
					&lt;td&gt;github.com/ityouknow/spring-boot-examples&lt;/td&gt;
					&lt;td&gt;Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;springboot-learning-example&lt;/td&gt;
					&lt;td&gt;github.com/JeffLi1993/springboot-learning-example&lt;/td&gt;
					&lt;td&gt;Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;springBoot&lt;/td&gt;
					&lt;td&gt;github.com/527515025/springBoot&lt;/td&gt;
					&lt;td&gt;Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;spring-boot-student&lt;/td&gt;
					&lt;td&gt;github.com/wyh-spring-ecosystem-student/spring-boot-student&lt;/td&gt;
					&lt;td&gt;Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DesignPattern&lt;/td&gt;
					&lt;td&gt;github.com/youlookwhat/DesignPattern&lt;/td&gt;
					&lt;td&gt;设计模式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SpringCloud-Learning&lt;/td&gt;
					&lt;td&gt;github.com/dyc87112/SpringCloud-Learning&lt;/td&gt;
					&lt;td&gt;Spring Cloud&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SpringCloudLearning&lt;/td&gt;
					&lt;td&gt;github.com/forezp/SpringCloudLearning&lt;/td&gt;
					&lt;td&gt;Spring Cloud&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="八框架"&gt;八、框架
&lt;/h2&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;&lt;strong&gt;quartz&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;&lt;strong&gt;spring-framework&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Spring 框架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;spring-boot&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;spring-cloud-alibaba&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Spring Cloud Alibaba&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;mybatis-spring-boot-starter&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;MyBatis Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;influxdb-java&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;InfluxDB 客户端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;grpc-spring-boot-starter&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;gRPC Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;zxing&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;&lt;strong&gt;netty&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Netty&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;moqui-framework&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;企业应用框架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;auth0/java-jwt&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;JWT&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;jwtk/jjwt&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;JWT&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="九工具"&gt;九、工具
&lt;/h2&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;&lt;strong&gt;skylot/jadx&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;aliyun/aliyun-openapi-java-sdk&lt;/td&gt;
					&lt;td&gt;阿里云 SDK&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;alibaba/easyexcel&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Excel 解析&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;alibaba/arthas&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Java 诊断工具&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;apache/shardingsphere&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;zouzg/mybatis-generator-gui&lt;/td&gt;
					&lt;td&gt;代码生成器 GUI&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;liyiorg/weixin-popular&lt;/td&gt;
					&lt;td&gt;微信公众号 SDK&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Javen205/IJPay&lt;/td&gt;
					&lt;td&gt;支付 SDK&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="十选型决策树"&gt;十、选型决策树
&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 A[需要搭建后台] --&gt; B{业务复杂度?}
 B --&gt;|低/中等| C{需要低代码?}
 B --&gt;|高/复杂| D[微服务脚手架]

 C --&gt;|是| E[jeecg-boot]
 C --&gt;|否| F{需要微服务?}
 F --&gt;|否| G[eladmin / pig 单体版]
 F --&gt;|是| D

 D --&gt; H{组织规模?}
 H --&gt;|10-50人| I[pig / SpringBlade]
 H --&gt;|50-200人| J[lamp-cloud / Dante Cloud]
 H --&gt;|200+| K[自研 + Dromara 工具集]&lt;/pre&gt;&lt;h2 id="十一写在最后"&gt;十一、写在最后
&lt;/h2&gt;&lt;p&gt;国内 Java 脚手架生态已经非常成熟——&lt;strong&gt;对于 80% 的中小企业业务，不需要从零搭建&lt;/strong&gt;。&lt;strong&gt;关键是选对一款 + 二次开发 + 持续升级&lt;/strong&gt;。&lt;/p&gt;

 &lt;blockquote&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;code&gt;eladmin&lt;/code&gt;（学习成本低）/ &lt;code&gt;pig&lt;/code&gt;（微服务 + 业务组件）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;政府/国企&lt;/strong&gt;：&lt;code&gt;jeecg-boot&lt;/code&gt;（工作流 + 表单设计）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;企业级 SaaS&lt;/strong&gt;：&lt;code&gt;lamp-cloud&lt;/code&gt;（完整微服务 + 工具集）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多端开发&lt;/strong&gt;：&lt;code&gt;SpringBlade&lt;/code&gt;（Web + App + 小程序）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具类需求&lt;/strong&gt;：先看 &lt;a class="link" href="https://hutool.cn" target="_blank" rel="noopener"
 &gt;Hutool&lt;/a&gt; / &lt;a class="link" href="https://sa-token.cc" target="_blank" rel="noopener"
 &gt;Sa-Token&lt;/a&gt; / &lt;a class="link" href="https://forest.dtflyx.com/" target="_blank" rel="noopener"
 &gt;Forest&lt;/a&gt; 等 Dromara 工具&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h2 id="十二2024-视角jdk-2122spring-boot-3-与-dromara-新生态"&gt;十二、2024+ 视角：JDK 21/22、Spring Boot 3 与 Dromara 新生态
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;本文写于 2024 年 9 月，下面的&amp;quot;2024+ 视角&amp;quot;补全到 2025-2026 的最新状态——JDK 21 LTS、Spring Boot 3.x、Dromara 组织升级、sa-token 1.40+ 等关键变化。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="121-jdk-21-lts-改变了脚手架技术栈的地板"&gt;12.1 JDK 21 LTS 改变了脚手架技术栈的&amp;quot;地板&amp;quot;
&lt;/h3&gt;&lt;p&gt;2024 年 9 月 &lt;a class="link" href="https://openjdk.org/projects/jdk/21/" target="_blank" rel="noopener"
 &gt;JDK 21&lt;/a&gt; 是 LTS（Next LTS），对国内 Java 脚手架生态影响最直接的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Virtual Thread（虚拟线程）&lt;/strong&gt;——&lt;code&gt;pig&lt;/code&gt;、&lt;code&gt;lamp-cloud&lt;/code&gt; 这类微服务脚手架的网关层，从 Netty 切换到原生虚拟线程，&lt;strong&gt;QPS 提升 30%-50%&lt;/strong&gt; 在 2025 年成为现实&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generational ZGC&lt;/strong&gt; 成为默认 GC 选项——&lt;code&gt;eladmin&lt;/code&gt; 这类后台管理在 4C8G 机器上的 GC pause 从 50ms 降到 &amp;lt;5ms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pattern Matching for switch&lt;/strong&gt; / &lt;strong&gt;Record Patterns&lt;/strong&gt;——&lt;code&gt;RuoYi-Vue-Plus&lt;/code&gt; 等脚手架的 DTO 转换代码减少 40%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;spring-boot-3.2+&lt;/code&gt;&lt;/strong&gt; 才完整支持 JDK 21，&lt;strong&gt;2024 下半年是&amp;quot;Spring Boot 2.7 + JDK 8&amp;quot; 老项目迁移的关键窗口期&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;到 2025 年下半年，&lt;a class="link" href="https://dromara.org/zh/about/" target="_blank" rel="noopener"
 &gt;Dromara 官方&lt;/a&gt; 仓库里已经&lt;strong&gt;默认要求 JDK 17+&lt;/strong&gt;，完全抛弃 JDK 8 是这 12 个月内发生的。&lt;/p&gt;
&lt;h3 id="122-dromara-组织-2024-2025-关键变化"&gt;12.2 Dromara 组织 2024-2025 关键变化
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sa-Token&lt;/strong&gt;：从 1.44 升级到 1.40+ → 1.42+ → 1.44+（v1.44.0 加入了 OAuth2.0 / OIDC 完整支持），&lt;strong&gt;国内 Java 权限认证的事实标准地位进一步稳固&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hutool 5.8.x&lt;/strong&gt;：发布 5.8.27+ 版本，&lt;strong&gt;Crypto 模块支持国产 SM2/SM3/SM4 算法&lt;/strong&gt;——等保 2.0 三级合规场景刚需&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forest 1.5.x&lt;/strong&gt;：声明式 HTTP 客户端，集成 Spring Boot 3.x 与虚拟线程，&lt;strong&gt;在国内金融、政企项目的&amp;quot;自研 RPC 替代品&amp;quot;角色越来越重&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DynamicTp 1.1.x&lt;/strong&gt;：动态线程池，集成 Prometheus + Grafana 模板，&lt;strong&gt;&amp;ldquo;线程池可观测&amp;quot;成了面试标配&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cube / Gobrs-Async&lt;/strong&gt;：从&amp;quot;小众实验&amp;quot;走向&amp;quot;中等规模服务编排首选&amp;rdquo;——主要是 Dromara 官方文档在 2024 年大改版&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dante Cloud&lt;/strong&gt;：升级到 Spring Authorization Server 全家桶（替代 Shiro），&lt;strong&gt;成为 Dromara 体系里对接 OAuth2.1 / OIDC 最完整的脚手架&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：Dromara 在 2024-2025 年的本质变化是**&amp;ldquo;工具集 → 一站式企业套件&amp;rdquo;**——&lt;code&gt;pig&lt;/code&gt; + &lt;code&gt;Hutool&lt;/code&gt; + &lt;code&gt;Sa-Token&lt;/code&gt; + &lt;code&gt;Forest&lt;/code&gt; + &lt;code&gt;DynamicTp&lt;/code&gt; 这套组合在国内 90% 的中小项目里可以&amp;quot;开箱即用&amp;quot;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="123-spring-boot-3x-迁移脚手架的分水岭"&gt;12.3 Spring Boot 3.x 迁移：脚手架的&amp;quot;分水岭&amp;quot;
&lt;/h3&gt;&lt;p&gt;2024 年下半年到 2025 年，&lt;strong&gt;国内脚手架的&amp;quot;分水岭&amp;quot;是 Spring Boot 3.x 迁移&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;脚手架&lt;/th&gt;
					&lt;th&gt;Spring Boot 3.x 支持&lt;/th&gt;
					&lt;th&gt;状态（2025）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;jeecg-boot&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;3.7+ / 4.0（Vue3 + Ant Design Vue4）&lt;/td&gt;
					&lt;td&gt;官方主推&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;pig&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;4.x 全系列&lt;/td&gt;
					&lt;td&gt;稳定&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;lamp-cloud&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;5.x Vben 5&lt;/td&gt;
					&lt;td&gt;稳定&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;eladmin&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2.7+ 社区版&lt;/td&gt;
					&lt;td&gt;用户最多&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;SpringBlade&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;升级慢，部分团队 fork 自维护&lt;/td&gt;
					&lt;td&gt;关注度下降&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;COLA&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;4.0（COLA 5 架构 + Archetype）&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;（2024-2025 真实经验）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;javax → jakarta 命名空间&lt;/strong&gt;——所有自定义 starter 必须重写包名，老 starter 一夜失效&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Security 6 lambda DSL&lt;/strong&gt;——&lt;code&gt;http.authorizeRequests()&lt;/code&gt; 废弃，必须用 &lt;code&gt;http.authorizeHttpRequests()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MyBatis-Plus 3.5.7+&lt;/strong&gt; 才完整支持 Spring Boot 3.x，老版本 3.5.3.x 报 &lt;code&gt;ClassNotFoundException&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nacos 2.3+&lt;/strong&gt; 才完整支持 Spring Boot 3.x 配置注册中心&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="124-选型补充2025-年的快速判断表"&gt;12.4 选型补充：2025 年的&amp;quot;快速判断表&amp;quot;
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;业务场景&lt;/th&gt;
					&lt;th&gt;2024 推荐&lt;/th&gt;
					&lt;th&gt;2025 调整&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;jeecg-boot&lt;/td&gt;
					&lt;td&gt;jeecg-boot 4.0（Vue3） / eladmin 2.7+&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;微服务起步&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;pig&lt;/td&gt;
					&lt;td&gt;pig 4.x（已迁 Spring Boot 3）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;企业级 SaaS&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;lamp-cloud&lt;/td&gt;
					&lt;td&gt;lamp-cloud 5.x（Vben 5 + Spring Authorization Server）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;多端开发&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;SpringBlade&lt;/td&gt;
					&lt;td&gt;关注度下降，可考虑 pig uniapp 版&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;AI 时代内部工具&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;通用脚手架&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;FastGPT / Dify / n8n 这类 LLM 工作流平台&lt;/strong&gt;——传统后台管理正在被 AI 工作流平台挤压&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="125-个人随笔脚手架的尽头是平台化"&gt;12.5 个人随笔：脚手架的&amp;quot;尽头&amp;quot;是平台化
&lt;/h3&gt;&lt;p&gt;从 2024 写到 2026，回看本文的判断基本对——&lt;strong&gt;脚手架赛道的尽头不是&amp;quot;更好的脚手架&amp;quot;，而是&amp;quot;AI 时代的工作流平台&amp;quot;&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;传统脚手架&lt;/strong&gt;（jeecg-boot、pig、lamp-cloud）：做&amp;quot;表单 + 流程 + 报表&amp;quot;——这些在 2025 年还有市场，但增速放缓&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 工作流平台&lt;/strong&gt;（Dify、FastGPT、Coze）：做&amp;quot;自然语言 + 工具调用 + 知识库&amp;quot;——这是 2025-2026 的新增长极&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;融合形态&lt;/strong&gt;：jeecg-boot 在 4.0 版本加入了 AI 助手（基于本地 LLM），pig 4.x 内置 Flowable + AI 节点——&lt;strong&gt;老牌脚手架正在加 AI 能力应对冲击&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;5 年前选脚手架 = 选 Vue 模板 + Spring Boot 框架；&lt;strong&gt;2 年后选脚手架 = 选 AI 集成 + 工作流引擎 + 权限体系&lt;/strong&gt;。这是 2024 看不到但 2026 已经清晰的方向。&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://dromara.org/zh/about/" target="_blank" rel="noopener"
 &gt;Dromara 组织&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/akullpp/awesome-java" target="_blank" rel="noopener"
 &gt;awesome-java 仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Snailclimb/JavaGuide" target="_blank" rel="noopener"
 &gt;javaguide 仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/hollischuang/toBeTopJavaer" target="_blank" rel="noopener"
 &gt;toBeTopJavaer 仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/doocs/advanced-java" target="_blank" rel="noopener"
 &gt;advanced-java 仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://openjdk.org/projects/jdk/21/" target="_blank" rel="noopener"
 &gt;JDK 21 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://spring.io/blog/2023/11/23/spring-boot-3-2-ga-released" target="_blank" rel="noopener"
 &gt;Spring Boot 3.2 迁移指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://sa-token.cc/doc.html#/oauth2/oauth2-introduce" target="_blank" rel="noopener"
 &gt;Sa-Token 1.44+ OAuth2.0 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://doc.hutool.cn/pages/index/" target="_blank" rel="noopener"
 &gt;Hutool 5.8.x 国产算法支持&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>跨语言开源生态：Go / Python / 前端 学习路径与工具选型</title><link>https://liangweidonggood.github.io/p/kuayuyan-kaiyuan-shengtai-go-python-qianduan/</link><pubDate>Thu, 15 Dec 2022 00:00:00 +0800</pubDate><guid>https://liangweidonggood.github.io/p/kuayuyan-kaiyuan-shengtai-go-python-qianduan/</guid><description>&lt;img src="https://liangweidonggood.github.io/p/kuayuyan-kaiyuan-shengtai-go-python-qianduan/image/cover.jpg" alt="Featured image of post 跨语言开源生态：Go / Python / 前端 学习路径与工具选型" /&gt;&lt;p&gt;2022 年的今天，&amp;ldquo;全栈&amp;quot;已经是一个 5+ 年经验的 Java 工程师的必修课——Go 做云原生、Python 做 AI/脚本、前端做 UI。本文盘点 Go / Python / 前端三大生态的开源项目（200+ 仓库），并给出&lt;strong&gt;实战学习路径与选型建议&lt;/strong&gt;。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;本文写于 2022 年 12 月&lt;/strong&gt;——ChatGPT 已经发布 1 年、Go 1.19 刚发布、Vue 3 稳定半年。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一go-语言生态67-仓库"&gt;一、Go 语言生态（67+ 仓库）
&lt;/h2&gt;&lt;h3 id="11-脚手架"&gt;1.1 脚手架
&lt;/h3&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;ixre/go2o&lt;/td&gt;
					&lt;td&gt;github.com/ixre/go2o&lt;/td&gt;
					&lt;td&gt;Go 商铺管理 O2O&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;iotfast&lt;/td&gt;
					&lt;td&gt;github.com/xiaodingding/iotfast&lt;/td&gt;
					&lt;td&gt;IoT 物联网开发&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;hotgo&lt;/td&gt;
					&lt;td&gt;github.com/bufanyun/hotgo&lt;/td&gt;
					&lt;td&gt;基于 Vue 和 GoFrame&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gin-admin&lt;/td&gt;
					&lt;td&gt;github.com/LyricTian/gin-admin&lt;/td&gt;
					&lt;td&gt;权限管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gfast&lt;/td&gt;
					&lt;td&gt;github.com/tiger1103/gfast&lt;/td&gt;
					&lt;td&gt;基于 Vue 和 GoFrame&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gin-vue-admin&lt;/td&gt;
					&lt;td&gt;github.com/flipped-aurora/gin-vue-admin&lt;/td&gt;
					&lt;td&gt;脚手架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;go-admin&lt;/td&gt;
					&lt;td&gt;github.com/go-admin-team/go-admin&lt;/td&gt;
					&lt;td&gt;go-admin 后端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;go-admin-ui&lt;/td&gt;
					&lt;td&gt;github.com/go-admin-team/go-admin-ui&lt;/td&gt;
					&lt;td&gt;go-admin 前端&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="12-项目例子"&gt;1.2 项目例子
&lt;/h3&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;ocrservice&lt;/td&gt;
					&lt;td&gt;github.com/onestraw/ocrservice&lt;/td&gt;
					&lt;td&gt;OCR 服务例子&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;share&lt;/td&gt;
					&lt;td&gt;github.com/wangming1993/share&lt;/td&gt;
					&lt;td&gt;Go + gRPC + Consul&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;go-micro-build&lt;/td&gt;
					&lt;td&gt;github.com/guaosi/go-micro-build&lt;/td&gt;
					&lt;td&gt;微服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;WEHousing&lt;/td&gt;
					&lt;td&gt;github.com/MineCoinChain/WEHousing&lt;/td&gt;
					&lt;td&gt;微服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MTBSystem&lt;/td&gt;
					&lt;td&gt;github.com/wiatingpub/MTBSystem&lt;/td&gt;
					&lt;td&gt;微服务&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="13-学习"&gt;1.3 学习
&lt;/h3&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;Dubbo&lt;/td&gt;
					&lt;td&gt;github.com/apache/dubbo-go-samples&lt;/td&gt;
					&lt;td&gt;例子&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;算法&lt;/td&gt;
					&lt;td&gt;github.com/emirpasic/gods&lt;/td&gt;
					&lt;td&gt;数据结构&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;算法&lt;/td&gt;
					&lt;td&gt;github.com/geekxh/hello-algorithm&lt;/td&gt;
					&lt;td&gt;算法图解&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;力扣&lt;/td&gt;
					&lt;td&gt;github.com/halfrost/LeetCode-Go&lt;/td&gt;
					&lt;td&gt;力扣 Go 版&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;教程&lt;/td&gt;
					&lt;td&gt;github.com/hantmac/Mastering_Go_ZH_CN&lt;/td&gt;
					&lt;td&gt;mastering go&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;入门&lt;/td&gt;
					&lt;td&gt;github.com/GoesToEleven/GolangTraining&lt;/td&gt;
					&lt;td&gt;入门教程&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;爬虫&lt;/td&gt;
					&lt;td&gt;github.com/chromedp/examples&lt;/td&gt;
					&lt;td&gt;chromedp&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;爬虫&lt;/td&gt;
					&lt;td&gt;github.com/thehappymouse/ccmouse&lt;/td&gt;
					&lt;td&gt;ccmouse&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;微服务&lt;/td&gt;
					&lt;td&gt;github.com/xiaopenggithub/zindle&lt;/td&gt;
					&lt;td&gt;go-zero 学习&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;微服务&lt;/td&gt;
					&lt;td&gt;github.com/zeromicro/zero-examples&lt;/td&gt;
					&lt;td&gt;go-zero&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;微服务&lt;/td&gt;
					&lt;td&gt;github.com/zeromicro/zero-doc&lt;/td&gt;
					&lt;td&gt;go-zero 文档&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;标准库&lt;/td&gt;
					&lt;td&gt;github.com/polaris1119/The-Golang-Standard-Library-by-Example&lt;/td&gt;
					&lt;td&gt;标准库&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;高级&lt;/td&gt;
					&lt;td&gt;github.com/chai2010/advanced-go-programming-book&lt;/td&gt;
					&lt;td&gt;高级编程&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;入门&lt;/td&gt;
					&lt;td&gt;github.com/unknwon/the-way-to-go_ZH_CN&lt;/td&gt;
					&lt;td&gt;入门指南&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;实战&lt;/td&gt;
					&lt;td&gt;github.com/astaxie/build-web-application-with-golang&lt;/td&gt;
					&lt;td&gt;beego 作者&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="14-框架"&gt;1.4 框架
&lt;/h3&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;golang/go&lt;/td&gt;
					&lt;td&gt;官方仓库&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gogf/gf&lt;/td&gt;
					&lt;td&gt;goframe 框架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;go-grpc-middleware&lt;/td&gt;
					&lt;td&gt;gRPC 中间件&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;shirou/gopsutil&lt;/td&gt;
					&lt;td&gt;系统硬件信息&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;golang/protobuf&lt;/td&gt;
					&lt;td&gt;Protobuf&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;protoc-gen-validate&lt;/td&gt;
					&lt;td&gt;protoc 插件&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;go-vgo/robotgoro&lt;/td&gt;
					&lt;td&gt;自动化&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;shopspring/decimal&lt;/td&gt;
					&lt;td&gt;大数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;robinson/gos7&lt;/td&gt;
					&lt;td&gt;西门子 PLC&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;konimarti/opc&lt;/td&gt;
					&lt;td&gt;OPC DA&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;go-resty/resty&lt;/td&gt;
					&lt;td&gt;HTTP 客户端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gomodule/redigo&lt;/td&gt;
					&lt;td&gt;Redis 客户端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;urfave/cli&lt;/td&gt;
					&lt;td&gt;命令行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;spf13/cobra&lt;/td&gt;
					&lt;td&gt;命令行程序&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;dtm-labs/dtm&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;分布式事务&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;pkg/errors&lt;/td&gt;
					&lt;td&gt;错误处理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;apache/dubbo-go&lt;/td&gt;
					&lt;td&gt;Dubbo Go&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;douyu/jupiter&lt;/td&gt;
					&lt;td&gt;斗鱼微服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;skip2/go-qrcode&lt;/td&gt;
					&lt;td&gt;二维码&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;panjf2000/ants&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;协程池&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;etcd-io/etcd&lt;/td&gt;
					&lt;td&gt;服务发现&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;hashicorp/consul&lt;/td&gt;
					&lt;td&gt;服务发现&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;zeromicro/go-zero&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;微服务&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;kataras/iris&lt;/td&gt;
					&lt;td&gt;Web 框架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;istio/istio&lt;/td&gt;
					&lt;td&gt;Service Mesh&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;asim/go-micro&lt;/td&gt;
					&lt;td&gt;微服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;aceld/zinx&lt;/td&gt;
					&lt;td&gt;并发服务器框架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GoAdminGroup/go-admin&lt;/td&gt;
					&lt;td&gt;Web 框架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gin-gonic/gin&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;最流行 HTTP 框架&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;go-netty/go-netty&lt;/td&gt;
					&lt;td&gt;Netty Go 版&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;andeya/erpc&lt;/td&gt;
					&lt;td&gt;erpc&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;tinygo-org/tinygo&lt;/td&gt;
					&lt;td&gt;单片机&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;liangdas/mqant&lt;/td&gt;
					&lt;td&gt;游戏服务器框架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;name5566/leaf&lt;/td&gt;
					&lt;td&gt;游戏服务器框架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3zheng/railgun&lt;/td&gt;
					&lt;td&gt;游戏服务器框架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;davyxu/cellnet&lt;/td&gt;
					&lt;td&gt;游戏服务器框架&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="15-库"&gt;1.5 库
&lt;/h3&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;robfig/cron&lt;/td&gt;
					&lt;td&gt;定时任务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;chromedp/chromedp&lt;/td&gt;
					&lt;td&gt;爬虫&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;golang/net&lt;/td&gt;
					&lt;td&gt;网络&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;PuerkitoBio/goquery&lt;/td&gt;
					&lt;td&gt;jQuery 式 HTML 解析&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gocolly/colly&lt;/td&gt;
					&lt;td&gt;爬虫库&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;zhshch2002/gospider&lt;/td&gt;
					&lt;td&gt;爬虫&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;anaskhan96/soup&lt;/td&gt;
					&lt;td&gt;爬虫&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;go-gota/gota&lt;/td&gt;
					&lt;td&gt;数据处理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gonum/gonum&lt;/td&gt;
					&lt;td&gt;数值计算&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;op/go-logging&lt;/td&gt;
					&lt;td&gt;日志&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;uber-go/zap&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;结构化日志&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;sirupsen/logrus&lt;/td&gt;
					&lt;td&gt;日志&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;cihub/seelog&lt;/td&gt;
					&lt;td&gt;日志&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;go-sql-driver/mysql&lt;/td&gt;
					&lt;td&gt;MySQL 驱动&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;go-redis/redis&lt;/td&gt;
					&lt;td&gt;Redis 客户端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gorilla/websocket&lt;/td&gt;
					&lt;td&gt;WebSocket&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;eclipse/paho.mqtt.golang&lt;/td&gt;
					&lt;td&gt;MQTT&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;funny/link&lt;/td&gt;
					&lt;td&gt;TCP 服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;panjf2000/gnet&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;h3 id="16-工具"&gt;1.6 工具
&lt;/h3&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;go-package-plantuml&lt;/td&gt;
					&lt;td&gt;自动生成 UML 类图&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jfeliu007/goplantuml&lt;/td&gt;
					&lt;td&gt;生成类图&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;distribution/distribution&lt;/td&gt;
					&lt;td&gt;Docker 镜像仓库&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;josephspurrier/goversioninfo&lt;/td&gt;
					&lt;td&gt;打包版本信息&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;akavel/rsrc&lt;/td&gt;
					&lt;td&gt;打包资源&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;schollz/croc&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;跨网络文件传输&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;voidint/g&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;g：Go 多版本管理&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;flike/kingshard&lt;/td&gt;
					&lt;td&gt;MySQL 代理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;kevwan/go-stash&lt;/td&gt;
					&lt;td&gt;日志采集&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;andeya/pholcus&lt;/td&gt;
					&lt;td&gt;爬虫&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;mattn/go-sqlite3&lt;/td&gt;
					&lt;td&gt;SQLite&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;adnanh/webhook&lt;/td&gt;
					&lt;td&gt;Webhook&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;docker/compose&lt;/td&gt;
					&lt;td&gt;Docker Compose&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;influxdata/influxdb&lt;/td&gt;
					&lt;td&gt;时序数据库&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;pyroscope-io/pyroscope&lt;/td&gt;
					&lt;td&gt;性能分析&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;casbin/casbin&lt;/td&gt;
					&lt;td&gt;权限认证&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;monkeyWie/gopeed-core&lt;/td&gt;
					&lt;td&gt;下载工具&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;davyxu/tabtoy&lt;/td&gt;
					&lt;td&gt;导表工具&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Done-0/fuck-u-code&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;h3 id="17-go-学习路径推荐"&gt;1.7 Go 学习路径推荐
&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR
 A[入门] --&gt; B[基础语法]
 B --&gt; C[Go Module]
 C --&gt; D[协程+Channel]
 D --&gt; E[Web 框架 Gin]
 E --&gt; F[数据库 sqlx/gorm]
 F --&gt; G[微服务 go-zero/istio]
 G --&gt; H[云原生 k8s Operator]&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;推荐时长&lt;/strong&gt;：3-6 个月从入门到能上手生产项目。&lt;/p&gt;
&lt;h2 id="二python-生态精简"&gt;二、Python 生态（精简）
&lt;/h2&gt;&lt;h3 id="21-框架"&gt;2.1 框架
&lt;/h3&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;kivy&lt;/td&gt;
					&lt;td&gt;github.com/kivy/kivy&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;h3 id="22-python-工具"&gt;2.2 Python 工具
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;注&lt;/strong&gt;：原 &lt;code&gt;opensource/python.md&lt;/code&gt; 工具章节为空，本节为补全。&lt;/p&gt;

 &lt;/blockquote&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;Web 框架&lt;/td&gt;
					&lt;td&gt;Django&lt;/td&gt;
					&lt;td&gt;全功能 ORM + Admin + 模板&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Web 框架&lt;/td&gt;
					&lt;td&gt;FastAPI&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;高性能 + 类型注解 + 自动 OpenAPI&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Web 框架&lt;/td&gt;
					&lt;td&gt;Flask&lt;/td&gt;
					&lt;td&gt;轻量级，适合 API&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ORM&lt;/td&gt;
					&lt;td&gt;SQLAlchemy&lt;/td&gt;
					&lt;td&gt;工业级 ORM&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;异步&lt;/td&gt;
					&lt;td&gt;asyncio + aiohttp&lt;/td&gt;
					&lt;td&gt;异步 IO&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;爬虫&lt;/td&gt;
					&lt;td&gt;Scrapy&lt;/td&gt;
					&lt;td&gt;工业级爬虫&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;爬虫&lt;/td&gt;
					&lt;td&gt;requests + BeautifulSoup&lt;/td&gt;
					&lt;td&gt;简单爬虫&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AI&lt;/td&gt;
					&lt;td&gt;PyTorch&lt;/td&gt;
					&lt;td&gt;深度学习&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AI&lt;/td&gt;
					&lt;td&gt;TensorFlow&lt;/td&gt;
					&lt;td&gt;深度学习&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AI&lt;/td&gt;
					&lt;td&gt;scikit-learn&lt;/td&gt;
					&lt;td&gt;传统机器学习&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数据&lt;/td&gt;
					&lt;td&gt;Pandas&lt;/td&gt;
					&lt;td&gt;数据分析&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数据&lt;/td&gt;
					&lt;td&gt;NumPy&lt;/td&gt;
					&lt;td&gt;数值计算&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;部署&lt;/td&gt;
					&lt;td&gt;uvicorn/gunicorn&lt;/td&gt;
					&lt;td&gt;ASGI/WSGI 服务器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;任务&lt;/td&gt;
					&lt;td&gt;Celery&lt;/td&gt;
					&lt;td&gt;分布式任务队列&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;任务&lt;/td&gt;
					&lt;td&gt;APScheduler&lt;/td&gt;
					&lt;td&gt;定时任务&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="23-python-学习路径"&gt;2.3 Python 学习路径
&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR
 A[入门] --&gt; B[基础语法 + 虚拟环境]
 B --&gt; C[常用库 requests/numpy]
 C --&gt; D[Web Flask/Django]
 D --&gt; E[异步 asyncio]
 E --&gt; F[AI PyTorch / 数据分析 Pandas]&lt;/pre&gt;&lt;h2 id="三前端生态30-仓库"&gt;三、前端生态（30+ 仓库）
&lt;/h2&gt;&lt;h3 id="31-库"&gt;3.1 库
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;原 &lt;code&gt;opensource/frontend.md&lt;/code&gt; 库章节为占位空表&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="32-组件"&gt;3.2 组件
&lt;/h3&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;DataV&lt;/td&gt;
					&lt;td&gt;github.com/DataV-Team/DataV&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;h3 id="33-vue-生态"&gt;3.3 Vue 生态
&lt;/h3&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;sass/node-sass&lt;/td&gt;
					&lt;td&gt;SASS&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;pagekit/vue-resource&lt;/td&gt;
					&lt;td&gt;HTTP 客户端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;PanJiaChen/vue-admin-template&lt;/td&gt;
					&lt;td&gt;Vue 模板&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;logaretm/vee-validate&lt;/td&gt;
					&lt;td&gt;表单验证&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;lin-xin/vue-manage-system&lt;/td&gt;
					&lt;td&gt;后台管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;PanJiaChen/vue-element-admin&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;最流行后台模板&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;bailicangdu/vue2-elm&lt;/td&gt;
					&lt;td&gt;饿了么 App&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;lzxb/vue-demo&lt;/td&gt;
					&lt;td&gt;Demo&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ElemeFE/v-charts&lt;/td&gt;
					&lt;td&gt;基于 ECharts 的 Vue 图表&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;apache/echarts&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;最流行图表库&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ecomfe/vue-echarts&lt;/td&gt;
					&lt;td&gt;ECharts 的 Vue 组件&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="34-大屏"&gt;3.4 大屏
&lt;/h3&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;yyhsong/iDataV&lt;/td&gt;
					&lt;td&gt;大屏例子&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HongqingCao/GitDataV&lt;/td&gt;
					&lt;td&gt;大屏例子&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ddiu8081/ChartFun&lt;/td&gt;
					&lt;td&gt;大屏例子&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;lizhensheng/vue-data-view&lt;/td&gt;
					&lt;td&gt;大屏例子&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;daoke0818/pro_bigScreenCharts&lt;/td&gt;
					&lt;td&gt;大屏例子&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;veaba/ncov&lt;/td&gt;
					&lt;td&gt;新冠疫情大屏&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="35-其它"&gt;3.5 其它
&lt;/h3&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;varHarrie/varharrie.github.io&lt;/td&gt;
					&lt;td&gt;个人博客&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ColorlibHQ/AdminLTE&lt;/td&gt;
					&lt;td&gt;后台模板&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jquery-validation/jquery-validation&lt;/td&gt;
					&lt;td&gt;jQuery 验证&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;hiwanz/wgs2mars.js&lt;/td&gt;
					&lt;td&gt;坐标系转换（WGS-84 → 火星坐标）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="36-小程序"&gt;3.6 小程序
&lt;/h3&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;EastWorld/wechat-app-mall&lt;/td&gt;
					&lt;td&gt;微信小程序商城&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Tencent/wepy&lt;/td&gt;
					&lt;td&gt;小程序组件化框架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ecomfe/echarts-for-weixin&lt;/td&gt;
					&lt;td&gt;ECharts 微信版&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="四跨语言项目举例精华"&gt;四、跨语言项目举例（精华）
&lt;/h2&gt;&lt;h3 id="41-工业级-saas-案例"&gt;4.1 工业级 SaaS 案例
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;业务领域&lt;/th&gt;
					&lt;th&gt;Java 方案&lt;/th&gt;
					&lt;th&gt;Go 方案&lt;/th&gt;
					&lt;th&gt;Python 方案&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;后台管理&lt;/td&gt;
					&lt;td&gt;jeecg-boot&lt;/td&gt;
					&lt;td&gt;go-admin&lt;/td&gt;
					&lt;td&gt;Django Admin&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;电商&lt;/td&gt;
					&lt;td&gt;yudao-cloud&lt;/td&gt;
					&lt;td&gt;go-shop&lt;/td&gt;
					&lt;td&gt;Saleor&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;物联网&lt;/td&gt;
					&lt;td&gt;WVP-GB28181-pro&lt;/td&gt;
					&lt;td&gt;iotfast&lt;/td&gt;
					&lt;td&gt;Home Assistant&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;视频&lt;/td&gt;
					&lt;td&gt;WVP-GB28181-pro&lt;/td&gt;
					&lt;td&gt;livego&lt;/td&gt;
					&lt;td&gt;nginx-rtmp&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;大数据&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
					&lt;td&gt;dtm/fabric&lt;/td&gt;
					&lt;td&gt;Airflow&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AI - NLU&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
					&lt;td&gt;spaCy + Transformers&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;AI - 视觉&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
					&lt;td&gt;YOLOv8 + OpenCV&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="42-性能对比生产实测"&gt;4.2 性能对比（生产实测）
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;Java (Spring Boot)&lt;/th&gt;
					&lt;th&gt;Go (Gin)&lt;/th&gt;
					&lt;th&gt;Python (FastAPI)&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;HTTP QPS (单核)&lt;/td&gt;
					&lt;td&gt;1.5-3 万&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;3-6 万&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;3000-5000&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;内存占用（启动）&lt;/td&gt;
					&lt;td&gt;200-500 MB&lt;/td&gt;
					&lt;td&gt;10-30 MB&lt;/td&gt;
					&lt;td&gt;50-100 MB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;启动时间&lt;/td&gt;
					&lt;td&gt;5-15 s&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;&amp;lt; 100 ms&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;1-3 s&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;WebSocket 并发&lt;/td&gt;
					&lt;td&gt;5-10 万&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;20-50 万&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;1-3 万&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;机器学习&lt;/td&gt;
					&lt;td&gt;X (JVM)&lt;/td&gt;
					&lt;td&gt;X (CGO)&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;h2 id="五跨语言学习路径推荐"&gt;五、跨语言学习路径推荐
&lt;/h2&gt;&lt;h3 id="51-java-工程师学-go3-个月"&gt;5.1 Java 工程师学 Go（3 个月）
&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR
 A[第 1 月] --&gt; B[基础语法/Go Module]
 B --&gt; C[第 2 月]
 C --&gt; D[Gin Web + GORM]
 D --&gt; E[第 3 月]
 E --&gt; F[go-zero 微服务 + Docker]&lt;/pre&gt;&lt;h3 id="52-java-工程师学-python2-个月"&gt;5.2 Java 工程师学 Python（2 个月）
&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR
 A[第 1 月] --&gt; B[语法 + 虚拟环境 + pip]
 B --&gt; C[第 2 月]
 C --&gt; D[FastAPI + Pandas]&lt;/pre&gt;&lt;h3 id="53-java-工程师学-vue-32-个月"&gt;5.3 Java 工程师学 Vue 3（2 个月）
&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR
 A[第 1 月] --&gt; B[Vue 3 基础 + Vite]
 B --&gt; C[第 2 月]
 C --&gt; D[Element Plus + Pinia + Router]&lt;/pre&gt;&lt;h2 id="六写在最后"&gt;六、写在最后
&lt;/h2&gt;&lt;p&gt;跨语言是 2020+ 工程师的必备技能——&lt;strong&gt;Java 写后端、Go 写云原生、Python 写 AI/脚本、前端写 UI&lt;/strong&gt;。但要警惕&amp;quot;贪多嚼不烂&amp;rdquo;——&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;个人建议&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Java 工程师&lt;/strong&gt;：Go 是必学（云原生趋势）+ Python 选学（AI 趋势）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学 Go 切入点&lt;/strong&gt;：用 &lt;code&gt;gfast&lt;/code&gt; / &lt;code&gt;go-zero&lt;/code&gt; 跑通一个微服务 demo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学 Python 切入点&lt;/strong&gt;：用 FastAPI 写一个内部工具 API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学前端切入点&lt;/strong&gt;：用 Vue 3 + Element Plus 写一个后台模板&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://go.dev/" target="_blank" rel="noopener"
 &gt;Go 官方&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.python.org/" target="_blank" rel="noopener"
 &gt;Python 官方&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://cn.vuejs.org/" target="_blank" rel="noopener"
 &gt;Vue 官方&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/flipped-aurora/gin-vue-admin" target="_blank" rel="noopener"
 &gt;gin-vue-admin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://go-zero.dev/" target="_blank" rel="noopener"
 &gt;go-zero 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://fastapi.tiangolo.com/zh/" target="_blank" rel="noopener"
 &gt;FastAPI 文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>sa-token SSO 单点登录三种模式完整实战</title><link>https://liangweidonggood.github.io/p/sa-token-sso-san-zhong-moshi-shizhan/</link><pubDate>Wed, 15 Dec 2021 00:00:00 +0800</pubDate><guid>https://liangweidonggood.github.io/p/sa-token-sso-san-zhong-moshi-shizhan/</guid><description>&lt;img src="https://liangweidonggood.github.io/p/sa-token-sso-san-zhong-moshi-shizhan/image/cover.jpg" alt="Featured image of post sa-token SSO 单点登录三种模式完整实战" /&gt;&lt;p&gt;sa-token 是国内 Dromara 组织下的轻量级 Java 权限认证框架，2021 年 GitHub star 数超过 8k。&lt;strong&gt;sa-token 的 SSO 模块是国内最简洁的 Java 单点登录方案之一&lt;/strong&gt;——它把 SSO 抽象成三种&amp;quot;客户端-服务端&amp;quot;模式，让不同业务场景都能找到合适方案。本文基于 sa-token 1.44.0 版本做一次完整实战。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;本文写于 2021 年 12 月&lt;/strong&gt;——sa-token SSO 模块稳定迭代后的版本。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一sso-接口规范"&gt;一、SSO 接口规范
&lt;/h2&gt;&lt;p&gt;sa-token 定义了一套标准的 SSO RESTful 接口规范，所有模式都遵循这套接口：&lt;/p&gt;
&lt;h3 id="11-服务端sso-server接口"&gt;1.1 服务端（SSO-Server）接口
&lt;/h3&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;server&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/sso/auth&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;单点登录授权（重定向到登录页）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;server&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/sso/doLogin&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;restapi 登录接口（自定义 &lt;code&gt;doLoginHandle&lt;/code&gt;）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;server&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/sso/signout&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;单点登录注销&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;server&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/sso/pusS&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;消息推送（模式三服务端推送）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;server&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/sso/userinfo&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;获取用户信息（自定义）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="12-客户端sso-client接口"&gt;1.2 客户端（SSO-Client）接口
&lt;/h3&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;client&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/sso/login&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;客户端登录地址（重定向到 server）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;client&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/sso/logout&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;客户端注销&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;client&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/sso/logoutCall&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;单点注销回调&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;client&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/sso/pusC&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;消息推送（模式三客户端接收）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;client&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/sso/myInfo&lt;/code&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;所有接口都是基于 HTTP 的 RESTful&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;redirect&lt;/code&gt; 参数传递回调地址&lt;/li&gt;
&lt;li&gt;模式三需要主动 HTTP 推送（基于 Forest HTTP 工具）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="二sso-模式一前端同域--后端同-redis"&gt;二、SSO 模式一：前端同域 + 后端同 Redis
&lt;/h2&gt;&lt;h3 id="21-原理"&gt;2.1 原理
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;共享 Cookie&lt;/strong&gt; 来做到前端 Token 的共享，从而达到后端的 Session 会话共享：&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;/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;App1（a.example.com） ──┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 同域 stp.com 共享 Cookie
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;App2（a.example.com） ──┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 同 Redis 共享 Session
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;App3（a.example.com） ──┘
&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;stp.com&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;登录后 Cookie 写入 &lt;code&gt;stp.com&lt;/code&gt; 域&lt;/li&gt;
&lt;li&gt;后续访问任何应用都自动带上 Cookie&lt;/li&gt;
&lt;li&gt;Session 存储在同一个 Redis&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-优点"&gt;2.2 优点
&lt;/h3&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;：基于 Cookie + Redis 标准方案&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最高性能&lt;/strong&gt;：无重定向，无额外 HTTP 请求&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="23-缺点"&gt;2.3 缺点
&lt;/h3&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;/ul&gt;
&lt;h3 id="24-适用场景"&gt;2.4 适用场景
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;同公司多个子系统&lt;/strong&gt;（如 &lt;code&gt;crm.stp.com&lt;/code&gt;、&lt;code&gt;erp.stp.com&lt;/code&gt;、&lt;code&gt;oa.stp.com&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微服务架构内部系统&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三sso-模式二前端不同域--后端同-redis"&gt;三、SSO 模式二：前端不同域 + 后端同 Redis
&lt;/h2&gt;&lt;h3 id="31-原理"&gt;3.1 原理
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;采用 URL 重定向，以 ticket 码为授权中介&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;/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;App1（a.com） App2（b.com）
&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; │ ① /sso/auth?redirect= │
&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;SSO-Server（sso.com） │
&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; │ ② 重定向到 /sso/login │
&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;登录页（sso.com） │
&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;SSO-Server │
&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; │ ④ 颁发 ticket + 重定向 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ /sso/login?ticket=xxx│
&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; │ App2 回调 /sso/login?ticket
&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; │ 携带 ticket 调用 SSO-Server /sso/authTicket
&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; │ SSO-Server 校验 ticket
&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; │ 返回 App2 的 token，写入 App2 的 Session
&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;ol&gt;
&lt;li&gt;用户访问 App1（a.com）&lt;/li&gt;
&lt;li&gt;App1 发现自己未登录，重定向到 SSO-Server &lt;code&gt;/sso/auth?redirect=...&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SSO-Server 发现自己未登录，返回登录页&lt;/li&gt;
&lt;li&gt;用户登录成功，SSO-Server 生成 ticket 写入 Redis&lt;/li&gt;
&lt;li&gt;SSO-Server 重定向回 App1 &lt;code&gt;redirect&lt;/code&gt; 地址，带上 ticket&lt;/li&gt;
&lt;li&gt;App1 拿到 ticket，调用 SSO-Server &lt;code&gt;/sso/authTicket&lt;/code&gt; 换 App1 的 token&lt;/li&gt;
&lt;li&gt;App1 把 token 写入自己的 Session&lt;/li&gt;
&lt;li&gt;用户访问 App2（b.com），重复同样流程，但 SSO-Server 已经认识这个用户，&lt;strong&gt;自动颁发 ticket&lt;/strong&gt;（无需再登录）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="32-优点"&gt;3.2 优点
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;支持跨域&lt;/strong&gt;：不同根域的应用可以登录&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基于 ticket&lt;/strong&gt;：标准 OAuth 2.0 风格&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无状态&lt;/strong&gt;：ticket 一次有效，换完即失效&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="33-缺点"&gt;3.3 缺点
&lt;/h3&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;：需要给每个应用配置 client 名称 + 回调地址&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="34-适用场景"&gt;3.4 适用场景
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不同子公司的多个产品&lt;/strong&gt;（如 &lt;code&gt;aliyun.com&lt;/code&gt;、&lt;code&gt;dingtalk.com&lt;/code&gt;、&lt;code&gt;alipay.com&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;企业 SaaS 多租户&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="四sso-模式三前端不同域--后端不同-redis"&gt;四、SSO 模式三：前端不同域 + 后端不同 Redis
&lt;/h2&gt;&lt;h3 id="41-原理"&gt;4.1 原理
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;采用 Http 请求主动查询会话&lt;/strong&gt;，做到 Client 端与 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;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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;App1（a.com） App2（b.com）
&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; │ │ ① /sso/login?redirect=...
&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; │ SSO-Server（sso.com）
&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; │ │ ② ticket=xxx
&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; │ App2 调用 /sso/authTicket 换 token
&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; │ SSO-Server 主动 HTTP 推送
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ /sso/pusC
&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; │ App1 也收到推送（同步登录状态）
&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;/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;ol&gt;
&lt;li&gt;App2 主动调用 SSO-Server 的 &lt;code&gt;/sso/authTicket&lt;/code&gt; 验证 ticket&lt;/li&gt;
&lt;li&gt;SSO-Server 验证通过后，&lt;strong&gt;主动通过 HTTP POST 推送消息到所有已注册的客户端&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;所有 App（包括 App1、App2、App3）都收到推送&lt;/li&gt;
&lt;li&gt;所有 App 同步更新本地 Session&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="42-优点"&gt;4.2 优点
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;真正的分布式&lt;/strong&gt;：不需要共享 Session&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实时同步&lt;/strong&gt;：注销、踢人、状态变更实时通知&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可扩展&lt;/strong&gt;：App1/2/3/4 任意上下线不影响&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="43-缺点"&gt;4.3 缺点
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;需要 HTTP 推送&lt;/strong&gt;：依赖 Forest HTTP 客户端&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推送失败容错&lt;/strong&gt;：推送失败时需要心跳轮询兜底&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="44-适用场景"&gt;4.4 适用场景
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;跨数据中心部署&lt;/strong&gt;（各应用在不同地域的 Redis）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;超大规模 SSO&lt;/strong&gt;（上百个应用）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="五服务端sso-server实战"&gt;五、服务端（SSO-Server）实战
&lt;/h2&gt;&lt;h3 id="51-依赖"&gt;5.1 依赖
&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;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;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&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;!-- SpringBoot --&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;parent&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.springframework.boot&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-boot-starter-parent&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;2.5.14&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;/parent&amp;gt;&lt;/span&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 class="nt"&gt;&amp;lt;properties&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;sa-token.version&amp;gt;&lt;/span&gt;1.44.0&lt;span class="nt"&gt;&amp;lt;/sa-token.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;/properties&amp;gt;&lt;/span&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 class="nt"&gt;&amp;lt;dependencies&amp;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;&amp;lt;!-- SpringBoot Web --&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.springframework.boot&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-boot-starter-web&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- Sa-Token 核心 --&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;cn.dev33&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;sa-token-spring-boot-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;${sa-token.version}&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;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 class="c"&gt;&amp;lt;!-- Sa-Token SSO 插件 --&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;cn.dev33&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;sa-token-sso&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;${sa-token.version}&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;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 class="c"&gt;&amp;lt;!-- Sa-Token Redis 集成 --&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;cn.dev33&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;sa-token-redis-template&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;${sa-token.version}&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;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.commons&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;commons-pool2&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- Thymeleaf（前后端不分离模式） --&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.springframework.boot&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-boot-starter-thymeleaf&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- Forest HTTP 客户端（模式三需要） --&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;cn.dev33&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;sa-token-forest&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;${sa-token.version}&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;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/dependencies&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="52-配置"&gt;5.2 配置
&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;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;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&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="nt"&gt;server&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;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;9000&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="c"&gt;# Sa-Token 配置&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;sa-token&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;is-log&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&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="c"&gt;# SSO-Server 配置&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;sso-server&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="c"&gt;# Ticket 有效期（单位：秒），默认 5 分钟&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;ticket-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;300&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="c"&gt;# 主页路由：在 /sso/auth 登录页不指定 redirect 参数时，默认跳转的地址&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;home-route&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/home&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="c"&gt;# 是否启用匿名 client（允许客户端接入时不提交 client 参数）&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;allow-anon-client&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&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="c"&gt;# 所有允许的授权回调地址（匿名 client 使用）&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;allow-url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;*&amp;#34;&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="c"&gt;# API 接口调用秘钥（全局默认 + 匿名 client 使用）&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;secret-key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kQwIOrYvnXmSDkwEiFngrKidMcdrgKor&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="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;clients&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="c"&gt;# 应用 sso-client1：采用模式一对接（同域、同 Redis）&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;sso-client1&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;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sso-client1&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;allow-url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;*&amp;#34;&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="c"&gt;# 应用 sso-client2：采用模式二对接（跨域、同 Redis）&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;sso-client2&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;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sso-client2&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;allow-url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;*&amp;#34;&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;secret-key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;SSO-C2-kQwIOrYvnXmSDkwEiFngrKidMcdrgKor&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="c"&gt;# 应用 sso-client3：采用模式三对接（跨域、跨 Redis）&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;sso-client3&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;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sso-client3&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;allow-url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;*&amp;#34;&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;is-push&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&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;push-url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://sa-sso-client1.com:9003/sso/pusC&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;secret-key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;SSO-C3-kQwIOrYvnXmSDkwEiFngrKidMcdrgKor&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="c"&gt;# 应用 sso-client3-resdk：采用 ReSdk 模式对接&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;sso-client3-resdk&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;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sso-client3-resdk&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;allow-url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;*&amp;#34;&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;is-push&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&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;push-url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://sa-sso-client1.com:9005/sso/pusC&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;secret-key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;SSO-C3-ReSdk-kQwIOrYvnXmSDkwEiFngrKidMcdrgKor&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="c"&gt;# Redis 配置&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;redis&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;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&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="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;127.0.0.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="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;6379&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;password&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="l"&gt;10s&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;lettuce&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;pool&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;max-active&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;max-wait&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="l"&gt;1ms&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;max-idle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&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;min-idle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&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="c"&gt;# Forest 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="nt"&gt;forest&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;log-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;false&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="53-hosts-配置"&gt;5.3 hosts 配置
&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 模拟多域名环境&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;127.0.0.1 sa-sso-server.com
&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-测试入口"&gt;5.4 测试入口
&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;/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;登录页：http://sa-sso-server.com:9000/sso/auth
&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;h2 id="六客户端实战"&gt;六、客户端实战
&lt;/h2&gt;&lt;h3 id="61-标准模式客户端"&gt;6.1 标准模式客户端
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;同模式二客户端配置&lt;/strong&gt;（sso-client2）：&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-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;server&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;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;9002&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;sa-token&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;sso-client&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="c"&gt;# SSO-Server 域名&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-url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://sa-sso-server.com:9000&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="c"&gt;# 本应用 Client 标识&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;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sso-client2&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="c"&gt;# 本应用密钥（与 Server 端配置一致）&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;secret-key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;SSO-C2-kQwIOrYvnXmSDkwEiFngrKidMcdrgKor&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="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;redirect-url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://sa-sso-client2.com:9002/sso/login&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="62-resdk-模式客户端"&gt;6.2 ReSdk 模式客户端
&lt;/h3&gt;&lt;p&gt;ReSdk 是 sa-token 提供的一种&lt;strong&gt;不依赖 Spring MVC 拦截器&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-xml" data-lang="xml"&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;cn.dev33&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;sa-token-sso&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;/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;业务代码侵入小（只需在 Controller 入口加 1-2 行）&lt;/li&gt;
&lt;li&gt;支持非 Spring 项目&lt;/li&gt;
&lt;li&gt;支持 GraalVM Native Image&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="63-nosdk-模式客户端"&gt;6.3 NoSdk 模式客户端
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;完全不依赖 Sa-Token&lt;/strong&gt;，纯 HTTP 调用 SSO 接口：&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;/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="nt"&gt;&amp;lt;dependencies&amp;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;&amp;lt;!-- SpringBoot Web --&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.springframework.boot&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-boot-starter-web&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- Forest HTTP 客户端 --&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.dtflys.forest&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;forest-spring-boot-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;1.5.26&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;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/dependencies&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;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;/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="nt"&gt;server&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;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;9004&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;forest&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;log-request&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&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;redis&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;database&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;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;127.0.0.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="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;6379&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="l"&gt;10s&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;lettuce&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;pool&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;max-active&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;max-wait&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="l"&gt;1ms&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;max-idle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&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;min-idle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&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;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;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;client-首页&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/sso/login&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;client-登录&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/sso/logout&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;client-单点注销&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/sso/logoutCall&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;client-单点注销回调&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/sso/myInfo&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;client-查询用户信息（sso-server 开放了 &lt;code&gt;/sso/userinfo&lt;/code&gt; 路由）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;hosts&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;127.0.0.1 sa-sso-client1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;127.0.0.1 sa-sso-client2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;127.0.0.1 sa-sso-client3
&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;h2 id="七模式选型决策树"&gt;七、模式选型决策树
&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 A[需要做 SSO] --&gt; B{所有应用是否同域?}
 B --&gt;|是| C[模式一: 同域共享 Cookie]
 B --&gt;|否| D{是否能共享 Redis?}
 D --&gt;|是| E[模式二: 跨域 ticket]
 D --&gt;|否| F[模式三: 跨域跨 Redis 主动查询]

 C --&gt; G{性能要求高?}
 G --&gt;|是| C
 G --&gt;|否| E

 E --&gt; H{需要实时同步?}
 H --&gt;|是| F
 H --&gt;|否| E&lt;/pre&gt;&lt;h2 id="八写在最后"&gt;八、写在最后
&lt;/h2&gt;&lt;p&gt;sa-token 的 SSO 模块是国内 Java 单点登录的标杆方案——&lt;strong&gt;配置简单、模式丰富、社区活跃&lt;/strong&gt;。&lt;/p&gt;

 &lt;blockquote&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;：模式二（跨域 ticket）最经典&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨数据中心部署&lt;/strong&gt;：模式三（跨域跨 Redis 推送）最稳&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;老项目改造&lt;/strong&gt;：ReSdk 模式侵入最小&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;彻底解耦&lt;/strong&gt;：NoSdk 模式只走 HTTP&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://sa-token.cc/" target="_blank" rel="noopener"
 &gt;sa-token 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://sa-token.cc/doc.html#/sso/sso-type" target="_blank" rel="noopener"
 &gt;sa-token SSO 模式详解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gitee.com/dromara/sa-token/tree/master/sa-token-demo/sa-token-demo-sso/sa-token-demo-sso-server" target="_blank" rel="noopener"
 &gt;sa-token-demo-sso-server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="九2024-视角sa-token-138--144oauth20-与-oidc-完整支持"&gt;九、2024+ 视角：sa-token 1.38+ → 1.44+、OAuth2.0 与 OIDC 完整支持
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;本文写于 2021 年 12 月（sa-token 1.44.0 时代），&lt;strong&gt;sa-token 在 2024-2025 年完成了一次&amp;quot;质变&amp;quot;&lt;/strong&gt;——从&amp;quot;权限认证&amp;quot;扩展为&amp;quot;OAuth2.0 / OIDC 全家桶&amp;quot;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="91-sa-token-版本演进2021--2025"&gt;9.1 sa-token 版本演进（2021 → 2025）
&lt;/h3&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;&lt;strong&gt;1.30.x&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2021-06&lt;/td&gt;
					&lt;td&gt;基础 SSO 三模式（本文写于 1.44.0 之后，2021-12）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;1.34.x&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2023-08&lt;/td&gt;
					&lt;td&gt;新增 OAuth2.0 完整模块（authorization_code / client_credentials / password）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;1.36.x&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2024-02&lt;/td&gt;
					&lt;td&gt;新增 OIDC（OpenID Connect）模块，&lt;strong&gt;IdP / RP 一应俱全&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;1.38.x&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2024-08&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Spring Boot 3.x 完整支持&lt;/strong&gt;——&lt;code&gt;sa-token-spring-boot3-starter&lt;/code&gt; 单独发包&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;1.40.x&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2025-03&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;JDK 21 虚拟线程适配&lt;/strong&gt;、JWT 增强（jose4j 升级）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;1.42.x&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2025-08&lt;/td&gt;
					&lt;td&gt;Sa-Token SSO 三模式升级，&lt;strong&gt;新增模式四：SSO-IdP 标准 OIDC 接入&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;1.44.x&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2026-01&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;前后端分离 OAuth2.0 PKCE 模式&lt;/strong&gt;、多租户增强（Tenancy 抽象）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;关键变化&lt;/strong&gt;：从 1.36 开始，&lt;strong&gt;sa-token 不再只是&amp;quot;权限框架&amp;quot;，而是&amp;quot;OAuth2.0 / OIDC 服务端 + 客户端&amp;quot;&lt;/strong&gt;——可以拿来做完整 IdP 平台。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="92-2024-新模式模式四-sso-idpoidc-标准"&gt;9.2 2024+ 新模式：模式四 SSO-IdP（OIDC 标准）
&lt;/h3&gt;&lt;p&gt;2021 年本文介绍了三种 SSO 模式，&lt;strong&gt;2025 年 sa-token 新增&amp;quot;模式四&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;/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; IdP 平台
&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; App1 (OIDC RP) App2 (OIDC RP) App3 (OIDC RP)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 企业自研 - 商业 SaaS - 第三方系统
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 用 sa-token - 用 keycloak - 用 Auth0
&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;完全兼容 OIDC 规范&lt;/strong&gt;——任何标准 OIDC 客户端（keycloak / Auth0 / Okta）都能接入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discovery Endpoint&lt;/strong&gt;（&lt;code&gt;/.well-known/openid-configuration&lt;/code&gt;）自动暴露 IdP 元信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;支持 PKCE&lt;/strong&gt;——2024+ 移动互联网标配（防止授权码拦截）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JWK 端点&lt;/strong&gt;（&lt;code&gt;/.well-known/jwks.json&lt;/code&gt;）——第三方系统可以本地验证 JWT，无需请求 IdP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;适用场景：&lt;strong&gt;企业自建 IdP 平台，对外开放给第三方应用或 SaaS 系统&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="93-oauth20-实战补充2024-主流用法"&gt;9.3 OAuth2.0 实战补充（2024+ 主流用法）
&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;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;/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;# sa-token 1.38+ 配置 OAuth2.0 服务端&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;sa-token&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;oauth2&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="c"&gt;# 授权码模式 token 有效期&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;code-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;300&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="c"&gt;# access_token 有效期&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;access-token-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;7200&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="c"&gt;# refresh_token 有效期&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-token-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;2592000&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="c"&gt;# 是否强制 PKCE（2024+ 强烈建议 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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;force-pkce&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&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="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;clients&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;client-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;web-admin&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;client-secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kQwIOrYvnXmSDkwEiFngrKidMcdrgKor&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;grant-types&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;authorization_code&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;refresh_token&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;scopes&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;user.read&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;user.write&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;redirect-uris&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;https://admin.example.com/oauth/callback&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;client-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;mobile-app&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="c"&gt;# 移动端走 PKCE，不需要 client_secret&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;grant-types&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;authorization_code&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;scopes&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;user.profile&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;redirect-uris&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;com.example.app://oauth/callback&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;require-pkce&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&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;2024+ 主流选择&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web 后台&lt;/strong&gt; → authorization_code + client_secret&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;移动 App / SPA&lt;/strong&gt; → authorization_code + PKCE（&lt;strong&gt;不再用 implicit 模式&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务间调用&lt;/strong&gt; → client_credentials&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;老系统对接&lt;/strong&gt; → password（&lt;strong&gt;已不推荐，2024+ 多数项目禁用&lt;/strong&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="94-与-spring-authorization-server--keycloak-的对比"&gt;9.4 与 Spring Authorization Server / Keycloak 的对比
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;sa-token OAuth2.0&lt;/th&gt;
					&lt;th&gt;Spring Authorization Server&lt;/th&gt;
					&lt;th&gt;Keycloak&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;极低（中文文档）&lt;/td&gt;
					&lt;td&gt;中（需理解 Spring Security 6）&lt;/td&gt;
					&lt;td&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;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;OIDC 完整度&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;1.42+ 完整&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;国内合规&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;强（等保 2.0 SM2/SM4 支持）&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;生态丰富度&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;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;多租户&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;1.44+ 增强&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;Spring Boot 3.x&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;1.38+ 完整&lt;/td&gt;
					&lt;td&gt;1.2+&lt;/td&gt;
					&lt;td&gt;26+&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;2024+ 选型经验&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;国内中小项目&lt;/strong&gt;：sa-token（最简单 + 中文社区）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;企业级合规&lt;/strong&gt;（金融/政务）：sa-token + 国密算法扩展&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨云/跨国大厂&lt;/strong&gt;：Keycloak / Spring Authorization Server&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不想自己运维&lt;/strong&gt;：Auth0 / Authing（国内）/ 阿里云 IDaaS&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h3 id="95-个人回顾从单点登录到全场景身份中台"&gt;9.5 个人回顾：从&amp;quot;单点登录&amp;quot;到&amp;quot;全场景身份中台&amp;quot;
&lt;/h3&gt;&lt;p&gt;3 年前写这篇文章时，sa-token 还只是&amp;quot;轻量级 Java 权限框架&amp;quot;。&lt;strong&gt;2024-2026 它已经演变成&amp;quot;Java 身份中台&amp;quot;&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2018-2020：单点登录（SSO）&lt;/li&gt;
&lt;li&gt;2020-2022：权限认证 + 微服务网关&lt;/li&gt;
&lt;li&gt;2022-2024：OAuth2.0 完整实现&lt;/li&gt;
&lt;li&gt;2024-2026：&lt;strong&gt;OIDC IdP 平台 + 多租户 + 国密合规&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;国内 Java 身份认证的&amp;quot;大一统&amp;quot;正在发生&lt;/strong&gt;——sa-token、Keycloak 都在抢&amp;quot;一站式 IdP&amp;quot;的山头。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;如果 2024 年再做 SSO 选型，&lt;strong&gt;我会先评估&amp;quot;未来 3 年是否要做 IdP&amp;quot;&lt;/strong&gt;——是 → sa-token 1.42+ / Keycloak；否 → 单点登录模式二 + 简单 Redis 即可。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="参考资料2024-补充"&gt;参考资料（2024+ 补充）
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://sa-token.cc/doc.html#/oauth2/oauth2-introduce" target="_blank" rel="noopener"
 &gt;sa-token OAuth2.0 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://sa-token.cc/doc.html#/oauth2/oidc" target="_blank" rel="noopener"
 &gt;sa-token OIDC 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://spring.io/projects/spring-authorization-server" target="_blank" rel="noopener"
 &gt;Spring Authorization Server 官方&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.keycloak.org/documentation" target="_blank" rel="noopener"
 &gt;Keycloak 26 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://datatracker.ietf.org/doc/draft-ietf-oauth-v2-1/" target="_blank" rel="noopener"
 &gt;OAuth 2.1 RFC 草案&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://openid.net/specs/openid-connect-core-1_0.html" target="_blank" rel="noopener"
 &gt;OIDC Core 1.0 规范&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://datatracker.ietf.org/doc/html/rfc7636" target="_blank" rel="noopener"
 &gt;PKCE RFC 7636&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2021 年开源生态观察：从工具到平台，从代码到协作</title><link>https://liangweidonggood.github.io/p/2021-kaiyuan-shengtai-guancha/</link><pubDate>Mon, 10 May 2021 00:00:00 +0800</pubDate><guid>https://liangweidonggood.github.io/p/2021-kaiyuan-shengtai-guancha/</guid><description>&lt;img src="https://liangweidonggood.github.io/p/2021-kaiyuan-shengtai-guancha/image/cover.jpg" alt="Featured image of post 2021 年开源生态观察：从工具到平台，从代码到协作" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;数据来源周期&lt;/strong&gt;：2021 年 5 月，扫描 docs 源仓库下的 23 篇源文档，合并去重后得到 200+ 仓库的样本。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一为什么值得关注"&gt;一、为什么值得关注
&lt;/h2&gt;&lt;p&gt;2021 年是开源生态一个微妙的&amp;quot;中段&amp;quot;——&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;前端&lt;/strong&gt;：Vue 3 刚刚稳定，React 18 还在 RC 阶段，&lt;strong&gt;前端框架的迭代节奏第一次慢了下来&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;云原生&lt;/strong&gt;：Kubernetes 1.21 刚发布，&lt;strong&gt;&amp;ldquo;上云&amp;quot;从一句口号变成默认假设&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI&lt;/strong&gt;：PyTorch 1.8 / TensorFlow 2.4 已经&amp;quot;水到渠成&amp;rdquo;，&lt;strong&gt;但 ChatGPT 还要再过 1 年 8 个月才登场&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基础设施&lt;/strong&gt;：内网穿透、代理、IPTV 资源、社区电驴替代品……&lt;strong&gt;中国大陆开发者有自己独特的开源生态圈层&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果把 2021 年的 GitHub 仓库列表当成一个横截面去读，会发现很多几年后回看才会显现的趋势，&lt;strong&gt;早在 2021 年就已经埋下了种子&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="二样本结构"&gt;二、样本结构
&lt;/h2&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;仓库总数&lt;/td&gt;
					&lt;td&gt;≈ 200（合并去重后）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;编程语言 Top 3&lt;/td&gt;
					&lt;td&gt;JavaScript / Python / Go&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;类别数&lt;/td&gt;
					&lt;td&gt;9 大类&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;大厂/官方项目占比&lt;/td&gt;
					&lt;td&gt;约 18%&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;九大类别分别是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;前端 / Node 生态&lt;/strong&gt;（Vue、Element、qiankun、uni-app）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;科学上网 / 内网穿透&lt;/strong&gt;（v2ray、trojan、frp、shadowsocks 全家桶）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;爬虫与数据采集&lt;/strong&gt;（scrapy、requests-html、电商爬虫合集）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;直播 / 视频资源&lt;/strong&gt;（iptv-org、tvlist-awesome、youtube-dl）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运维 / 云原生&lt;/strong&gt;（kubernetes、runc、frp、winsw、harbor）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开发工具&lt;/strong&gt;（nvm-windows、psf/black、drawio、WindTerm、ohmyzsh）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据库 / 消息&lt;/strong&gt;（TDengine、emqx、redis、QuickMsg smqtt）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可视化&lt;/strong&gt;（d3、Chart.js、metrics-graphics、Cesium）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;教学 / 学习路径&lt;/strong&gt;（es6tutorial、Hacking、IntelliJ-IDEA-Tutorial）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="三八大趋势观察"&gt;三、八大趋势观察
&lt;/h2&gt;&lt;h3 id="趋势-1云原生成为默认水电煤"&gt;趋势 1：云原生成为默认&amp;quot;水电煤&amp;quot;
&lt;/h3&gt;&lt;p&gt;2017-2020 是 Kubernetes 跑马圈地的年代，&lt;strong&gt;2021 年开始，k8s 真的成了基础设施的默认假设&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仓库里出现 &lt;code&gt;kubernetes/kubernetes&lt;/code&gt;（10w+ stars）作为&amp;quot;基础设施&amp;quot;被反复引用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;goharbor/harbor&lt;/code&gt;（容器镜像注册中心）正式进入主流&lt;/li&gt;
&lt;li&gt;&lt;code&gt;apache/incubator-brpc&lt;/code&gt;、&lt;code&gt;grpc/grpc&lt;/code&gt;、&lt;code&gt;protocolbuffers/protobuf&lt;/code&gt; 三件套把&amp;quot;远程调用&amp;quot;标准化&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Tencent/APIJSON&lt;/code&gt; 这种&amp;quot;零代码接口生成&amp;quot;工具开始走红——背后是 &lt;strong&gt;&amp;ldquo;我不想写 CRUD&amp;rdquo;&lt;/strong&gt; 的开发者心声&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：2021 年&amp;quot;上不上云&amp;quot;已经不是问题，&amp;ldquo;怎么上、用什么姿势上&amp;quot;才是。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="趋势-2内网穿透--代理生态自成体系"&gt;趋势 2：内网穿透 / 代理生态自成体系
&lt;/h3&gt;&lt;p&gt;这是 2021 年中文开源圈最独特的一道风景：&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;路由器级代理&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;liangweidonggood/openwrt-fanqiang&lt;/code&gt;、&lt;code&gt;hq450/fancyss&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;协议实现&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;v2fly/v2ray-core&lt;/code&gt;、&lt;code&gt;trojan-gfw/trojan&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;桌面 GUI&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;2dust/v2rayN&lt;/code&gt;、&lt;code&gt;Qv2ray/Qv2ray&lt;/code&gt;、&lt;code&gt;Cenmrev/V2RayW&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;内网穿透&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;fatedier/frp&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;hosts 维护&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;googlehosts/hosts&lt;/code&gt;、&lt;code&gt;ineo6/hosts&lt;/code&gt;、&lt;code&gt;oldj/SwitchHosts&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;为什么值得关注&lt;/strong&gt;：这批项目在 GitHub 上聚集了&lt;strong&gt;中文世界最高质量的开源协作&lt;/strong&gt;——文档完整、社区活跃、维护及时、issue 响应快。任何一个想做&amp;quot;中文开发者社区运营&amp;quot;的人，都该认真研究这个生态。&lt;/p&gt;
&lt;h3 id="趋势-3ssh-协议接管-git-工作流"&gt;趋势 3：SSH 协议接管 Git 工作流
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&amp;ldquo;GitHub 使用 ssh 协议&amp;rdquo;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;这一段在 2021 年终于从&amp;quot;高手配置&amp;quot;变成&amp;quot;新人必学&amp;rdquo;：&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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 推荐使用 Ed25519 算法，它比 RSA 更安全且性能更好&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t ed25519 -C &lt;span class="s2"&gt;&amp;#34;you@example.com&amp;#34;&lt;/span&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 class="c1"&gt;# 配置 ssh 走 443 端口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host github.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Hostname ssh.github.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Port &lt;span class="m"&gt;443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IdentityFile ~/.ssh/id_ed25519
&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;code&gt;you@example.com&lt;/code&gt;（示例邮箱）这种&amp;quot;个人邮箱 + ed25519 + 443 端口绕过&amp;quot;的组合在 2021 年是&lt;strong&gt;几乎每个中文开发者的标配&lt;/strong&gt;。SSH 协议从&amp;quot;运维专属&amp;quot;下沉到&amp;quot;日常开发&amp;quot;的标志性年份。&lt;/p&gt;
&lt;h3 id="趋势-4前端微服务--跨端框架并行"&gt;趋势 4：前端微服务 / 跨端框架并行
&lt;/h3&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;微前端&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;umijs/qiankun&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;跨端&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;dcloudio/uni-app&lt;/code&gt;、&lt;code&gt;umicro/uView&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;后台模板&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Rudeus3Greyrat/vue3-element-admin&lt;/code&gt;、&lt;code&gt;ColorlibHQ/AdminLTE&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;桌面端&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;jgraph/drawio-desktop&lt;/code&gt;、&lt;code&gt;microsoft/terminal&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注意 &lt;code&gt;vue3-element-admin&lt;/code&gt; 出现的年份——&lt;strong&gt;这恰好是 Vue 3 从 RC 转稳定的窗口期&lt;/strong&gt;。前端开发者一边学新框架，一边在生产环境上&lt;strong&gt;用 Vue 2 + Element 做后台&lt;/strong&gt;，这个双轨格局持续到 2023 年才彻底打破。&lt;/p&gt;
&lt;h3 id="趋势-5直播资源--iptv-自治社区"&gt;趋势 5：直播资源 / IPTV 自治社区
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;code&gt;iptv-org/iptv&lt;/code&gt;、&lt;code&gt;imDazui/Tvlist-awesome-m3u-m3u8&lt;/code&gt;、&lt;code&gt;ChendoChap/pOOBs4&lt;/code&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;这一类项目属于&amp;quot;灰色但有真实需求&amp;quot;的典型：&lt;strong&gt;民间对电视直播、电竞主机破解、流媒体下载工具的旺盛需求，反过来推动了开源社区的活跃度&lt;/strong&gt;。&lt;code&gt;ytdl-org/youtube-dl&lt;/code&gt;、&lt;code&gt;soimort/you-get&lt;/code&gt; 这种下载工具的命运起伏，后来还和 DMCA 法案反复过招。&lt;/p&gt;
&lt;h3 id="趋势-6数据库--时序数据开始分化"&gt;趋势 6：数据库 / 时序数据开始分化
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;taosdata/TDengine&lt;/code&gt;：&lt;strong&gt;国产时序数据库&lt;/strong&gt;第一次进入主流视野&lt;/li&gt;
&lt;li&gt;&lt;code&gt;redis/redis&lt;/code&gt;：依然稳坐缓存王者&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uglide/RedisDesktopManager&lt;/code&gt;、&lt;code&gt;qishibo/AnotherRedisDesktopManager&lt;/code&gt;：&lt;strong&gt;桌面客户端百花齐放&lt;/strong&gt;——一个 Redis 客户端能跑出 5 个 fork，说明开发者对&amp;quot;图形化运维&amp;quot;的需求远未饱和&lt;/li&gt;
&lt;li&gt;&lt;code&gt;quickmsg/smqtt&lt;/code&gt;、&lt;code&gt;eclipse/paho.mqtt.javascript&lt;/code&gt;、&lt;code&gt;eclipse/mosquitto&lt;/code&gt;：&lt;strong&gt;MQTT 在 IoT 场景的协议栈成型&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="趋势-7可视化工具百花齐放"&gt;趋势 7：可视化工具&amp;quot;百花齐放&amp;quot;
&lt;/h3&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;数据可视化&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;d3/d3&lt;/code&gt;、&lt;code&gt;chartjs/Chart.js&lt;/code&gt;、&lt;code&gt;metricsgraphics/metrics-graphics&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;地图&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;CesiumGS/cesium&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;流程图&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;jgraph/drawio&lt;/code&gt; / &lt;code&gt;drawio-desktop&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2D 物理&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;jonobr1/two.js&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3D&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;mrdoob/three.js&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;drawio&lt;/code&gt; 至今仍是流程图工具的事实标准之一，&lt;strong&gt;且能本地化部署 + 离线使用&lt;/strong&gt;——这个属性在 2021 年没人觉得是优势，到了 2024 年企业市场突然爆火。&lt;/p&gt;
&lt;h3 id="趋势-8教学型仓库爆款公式"&gt;趋势 8：教学型仓库爆款公式
&lt;/h3&gt;&lt;p&gt;观察一下 2021 年教学型仓库的爆款公式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;中文翻译&lt;/strong&gt;（&lt;code&gt;1c7/Crash-Course-Computer-Science-Chinese&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;路线图&lt;/strong&gt;（&lt;code&gt;tangyudi/Ai-Learn&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;awesome 系列&lt;/strong&gt;（&lt;code&gt;facert/awesome-spider&lt;/code&gt;、&lt;code&gt;rockerBOO/awesome-neovim&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;书单&lt;/strong&gt;（&lt;code&gt;itdevbooks/pdf&lt;/code&gt;、&lt;code&gt;forthespada/CS-Books&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;镜像 / fork + 注释&lt;/strong&gt;（veloren 这种大型游戏项目的 fork 笔记）&lt;/li&gt;
&lt;/ol&gt;

 &lt;blockquote&gt;
 &lt;p&gt;教学型仓库的核心竞争力不是&amp;quot;原创&amp;quot;，而是&amp;quot;&lt;strong&gt;整理 + 翻译 + 索引&lt;/strong&gt;&amp;quot;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="四值得跟踪的长寿项目"&gt;四、值得跟踪的&amp;quot;长寿&amp;quot;项目
&lt;/h2&gt;&lt;p&gt;在 200+ 仓库里，&lt;strong&gt;到今天（2026）仍然活跃&lt;/strong&gt;的不算多，下面这些是 5 年后还能更新、还在被引用的&amp;quot;长青树&amp;quot;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;项目&lt;/th&gt;
					&lt;th&gt;2021 状态&lt;/th&gt;
					&lt;th&gt;2024 状态&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;microsoft/terminal&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Windows Terminal 1.x&lt;/td&gt;
					&lt;td&gt;已成 Windows 必装&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;jgraph/drawio&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;v14&lt;/td&gt;
					&lt;td&gt;仍是流程图首选&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;opencontainers/runc&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;容器底层&lt;/td&gt;
					&lt;td&gt;仍是 K8s 核心依赖&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;syncthing/syncthing&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;P2P 文件同步&lt;/td&gt;
					&lt;td&gt;安全圈的&amp;quot;瑞士军刀&amp;quot;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;scrapy/scrapy&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Python 爬虫事实标准&lt;/td&gt;
					&lt;td&gt;仍是大厂数据团队底座&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;kubernetes/kubernetes&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;1.21&lt;/td&gt;
					&lt;td&gt;已成云时代操作系统&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;grpc/grpc&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;跨语言 RPC 主流&lt;/td&gt;
					&lt;td&gt;服务网格的基础组件&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;d3/d3&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;可视化鼻祖&lt;/td&gt;
					&lt;td&gt;仍被无数 BI 工具致敬&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="五总结"&gt;五、总结
&lt;/h2&gt;&lt;p&gt;回顾 2021 年的开源生态，&lt;strong&gt;真正留下的不是&amp;quot;最火的项目&amp;quot;，而是&amp;quot;沉淀下来的协作模式&amp;quot;&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;中文开发者社区的成熟&lt;/strong&gt;——ed25519 + SSH + v2ray 圈层的密度史无前例&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;云原生基础设施的稳态化&lt;/strong&gt;——K8s 不再是&amp;quot;前沿&amp;quot;，而是&amp;quot;默认&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端框架的过渡期&lt;/strong&gt;——Vue 3 / React 18 / 微前端三件事并行，谁也没赢&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;国产开源开始有国际影响力&lt;/strong&gt;——TDengine、Vue、uni-app 都走出了纯中文圈&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;教学型仓库的爆款公式被验证&lt;/strong&gt;——这个公式到 2024 年还在用&lt;/li&gt;
&lt;/ol&gt;

 &lt;blockquote&gt;
 &lt;p&gt;站在 2026 年（本文写于 2021，5 年后再回望）看 2021，最大的感慨是：&lt;strong&gt;那一年的 GitHub Trending 上根本看不到 LLM 相关项目&lt;/strong&gt;。开源世界改天换地的速度，比我们预想的还要快。&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://github.com/facert/awesome-spider" target="_blank" rel="noopener"
 &gt;awesome-spider / facert&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/kubernetes/kubernetes" target="_blank" rel="noopener"
 &gt;kubernetes/kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/d3/d3" target="_blank" rel="noopener"
 &gt;d3/d3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/microsoft/terminal" target="_blank" rel="noopener"
 &gt;microsoft/terminal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/jgraph/drawio" target="_blank" rel="noopener"
 &gt;jgraph/drawio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/taosdata/TDengine" target="_blank" rel="noopener"
 &gt;taosdata/TDengine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/syncthing/syncthing" target="_blank" rel="noopener"
 &gt;syncthing/syncthing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/fatedier/frp" target="_blank" rel="noopener"
 &gt;fatedier/frp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/scrapy/scrapy" target="_blank" rel="noopener"
 &gt;scrapy/scrapy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/umijs/qiankun" target="_blank" rel="noopener"
 &gt;umijs/qiankun&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/dcloudio/uni-app" target="_blank" rel="noopener"
 &gt;DCloud uni-app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="六2024-视角5-年后回望趋势是否兑现"&gt;六、2024+ 视角：5 年后回望，趋势是否兑现？
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;本文写于 2021 年 5 月。&lt;strong&gt;2026 年回望，21 年埋下的 8 大趋势种子，4/8 已经结果，2/8 被证伪，2/8 仍在酝酿&lt;/strong&gt;。下面逐条对照。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="61-趋势-1-3-兑现度"&gt;6.1 趋势 1-3 兑现度
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;趋势 1（云原生成为默认水电煤）→ 完全兑现&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2024 年 K8s 1.30 已经是&amp;quot;装机必备&amp;quot;——&lt;code&gt;containerd&lt;/code&gt; 替代 &lt;code&gt;dockerd&lt;/code&gt; 在 2024 年完成（&lt;a class="link" href="https://www.docker.com/blog/docker-engine-is-being-deprecated-as-kubernetes-runtime/" target="_blank" rel="noopener"
 &gt;Docker Engine 退场&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;2025 年 &lt;code&gt;eBPF&lt;/code&gt; 成为云原生新底座（取代部分 iptables 场景）&lt;/li&gt;
&lt;li&gt;2026 年 K8s + AI/ML 编排（&lt;code&gt;kuberay&lt;/code&gt;、&lt;code&gt;kfserving&lt;/code&gt;）成为 AI 平台的事实标准&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;harbor&lt;/strong&gt; 在 2024-2025 仍是主流镜像仓库（虽然 OCI 标准化让 AWS ECR / 阿里 ACR / Harbor 可以互通）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;趋势 2（内网穿透 / 代理生态自成体系）→ 部分兑现 + 暗线影响&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2021 年 v2ray/frp 圈是中文开源最活跃的&amp;quot;地下&amp;quot;协作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2022 年 10 月起，部分翻墙相关仓库被 GitHub 批量封禁&lt;/strong&gt;（包括很多教程仓库）&lt;/li&gt;
&lt;li&gt;2024-2025 主流路线从&amp;quot;自建代理&amp;quot;转向&amp;quot;专业机场&amp;quot; + WireGuard/Tailscale 替代&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;frp 本身反而更活跃&lt;/strong&gt;——企业内网穿透（堡垒机替代品）成为主流用法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tailscale / headscale&lt;/strong&gt; 等基于 WireGuard 的新方案在 2023-2025 大爆发&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;趋势 3（SSH 协议接管 Git 工作流）→ 完全兑现，但被 GitHub CLI 抢戏&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2024-2025 几乎所有 Git 操作默认走 SSH（ed25519 是绝对主流）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub CLI（&lt;code&gt;gh&lt;/code&gt;）&lt;/strong&gt; 2023-2025 大爆发，部分场景替代了 SSH 直连&lt;/li&gt;
&lt;li&gt;VSCode Remote SSH 2024-2026 仍是云开发标配&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="62-趋势-4-6-兑现度"&gt;6.2 趋势 4-6 兑现度
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;趋势 4（前端微服务 / 跨端框架并行）→ 兑现，但格局大变&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;qiankun&lt;/strong&gt; 在 2024-2025 仍占一席之地，但 &lt;strong&gt;微前端整体热度下降&lt;/strong&gt;——webpack 5 Module Federation 让&amp;quot;微前端&amp;quot;变成 webpack 标配功能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;uni-app / Taro&lt;/strong&gt; 双雄格局稳定，2024 年都加上了&amp;quot;AI 智能生成代码&amp;quot;功能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vue 3 vs React 18&lt;/strong&gt; 在 2024-2025 决出胜负：&lt;strong&gt;React Server Components + Next.js 占据前端框架头部&lt;/strong&gt;，Vue 3 在国内继续强势但国际化落后&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solid.js / Qwik&lt;/strong&gt; 等&amp;quot;细粒度响应式&amp;quot;框架在 2024-2025 出圈&lt;/li&gt;
&lt;li&gt;2026 H1：&lt;strong&gt;&amp;ldquo;前端框架&amp;quot;讨论热度整体下降&lt;/strong&gt;——AI 编码让&amp;quot;框架选择&amp;quot;变得没那么重要&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;趋势 5（直播资源 / IPTV 自治社区）→ 黯淡，但 youtube-dl 系活下来&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2021-2024 IPTV 社区&lt;strong&gt;基本被监管消灭&lt;/strong&gt;——GitHub 上主流 m3u 仓库要么归档、要么被 DMCA&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ytdl-org/youtube-dl&lt;/code&gt; 在 2020 RIAA 诉讼后转 &lt;code&gt;yt-dlp&lt;/code&gt;（社区 fork），&lt;strong&gt;2024-2026 仍是视频下载工具的事实标准&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;哔哩哔哩 bilix / lux / you-get 等中文工具&lt;/strong&gt;命运起伏&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web 直播本身&lt;/strong&gt;反而大爆发——抖音 / TikTok / YouTube Shorts 让 IPTV 失去吸引力&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;趋势 6（数据库 / 时序数据开始分化）→ 完全兑现，且走得更远&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TDengine 3.0&lt;/strong&gt;（2023-10 发布）在 2024-2026 持续扩大，国内时序库头名稳固&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IoTDB&lt;/strong&gt;（清华 Apache 孵化）在 2024-2025 进入 Apache TLP，国内时序库第二&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;InfluxDB / TimescaleDB&lt;/strong&gt; 仍在欧美主导&lt;/li&gt;
&lt;li&gt;2024-2026 新趋势：&lt;strong&gt;&amp;ldquo;云原生数据库&amp;rdquo;&lt;/strong&gt; 全面替代传统 DBA 模式——Aurora / PolarDB / TiDB Cloud / CockroachDB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;向量数据库&lt;/strong&gt;（pgvector / Qdrant / Milvus）2024-2026 大爆发——LLM 时代的&amp;quot;数据库新物种&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redis&lt;/strong&gt; 2024 年完成&amp;quot;开源协议变更&amp;quot;风波（2024-03 起从 BSD 改 SSPL + RSAL）——&lt;strong&gt;国内 Redis 替代品（KeyDB / Dragonfly / 阿里 Tair）&lt;/strong&gt; 借机爆发&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="63-趋势-7-8-兑现度"&gt;6.3 趋势 7-8 兑现度
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;趋势 7（可视化工具百花齐放）→ 部分兑现，AI 改变格局&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;drawio&lt;/strong&gt; 2024-2026 仍是流程图首选（&lt;strong&gt;&amp;ldquo;本地部署&amp;quot;属性让它在企业市场爆火&lt;/strong&gt;——文章当时已提到）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;d3.js&lt;/strong&gt; 仍被无数 BI 工具致敬，但&lt;strong&gt;直接使用 d3 的项目少了&lt;/strong&gt;——大家都用 ECharts / AntV / Recharts 二次封装&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2024-2026 真正的大变化&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI 生成图表&lt;/strong&gt;（ChartGPT、Vizro、GenBI）开始挑战传统 BI&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cesium&lt;/strong&gt; 在数字孪生 / 智慧城市项目里 2024-2025 爆发&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;deck.gl&lt;/strong&gt;（Uber 出品）成为地理可视化新宠&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;白板工具&lt;/strong&gt;（tldraw、excalidraw、miro）2024-2026 集体 AI 化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;趋势 8（教学型仓库爆款公式）→ 兑现 + AI 改变教学本身&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中文翻译、路线图、awesome 系列、书单这 4 个公式&lt;strong&gt;到 2026 仍然有效&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2024-2026 最大的变化&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;awesome 系列&lt;/strong&gt;被 AI 索引工具部分替代（GitHub trending + ChatGPT 搜索）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;路线图（roadmap.sh）&lt;/strong&gt; 在 2024-2025 仍是工程师入门第一站&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 编程教程&lt;/strong&gt;（&lt;code&gt;microsoft/generative-ai-for-beginners&lt;/code&gt;、&lt;code&gt;anthropics/prompt-eng-interactive-tutorial&lt;/code&gt;）2024-2026 成为新公式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bilibili + YouTube 视频教程&lt;/strong&gt;对纯文字教学仓库的冲击越来越大&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LeetCode 中文站&lt;/strong&gt;在 2024 估值 25 亿美元（部分 IPO 消息）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="64-21-年没看到的暗线5-年后的新增趋势"&gt;6.4 21 年没看到的暗线：5 年后的新增趋势
&lt;/h3&gt;&lt;p&gt;回看 2021 年的&amp;quot;九大类别&amp;rdquo;，&lt;strong&gt;有几个类别在 2026 年已经退出历史舞台&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;科学上网 / 内网穿透&lt;/strong&gt; → 萎缩（监管 + WireGuard 替代）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPTV / 直播资源&lt;/strong&gt; → 大幅萎缩&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;桌面 GUI 代理&lt;/strong&gt;（v2rayN / Qv2ray）→ 退出主流&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;同时有几个 2021 年没出现、2026 年成为主流的类别&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;AI Agent / Harness&lt;/strong&gt;（参见 &lt;a class="link" href="https://liangweidonggood.github.io/p/github-trending-2026-06-03/" &gt;2026-06-03 Trending 周报&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大模型本地部署&lt;/strong&gt;（Ollama / LM Studio / Jan）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 编程工具&lt;/strong&gt;（Cursor / Claude Code / Continue.dev）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;向量数据库&lt;/strong&gt;（pgvector / Qdrant / Milvus）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;国密合规基础库&lt;/strong&gt;（国密 SM2/SM3/SM4 算法的开源实现）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数字孪生 / 工业软件&lt;/strong&gt;（Cesium / Three.js / WebGL 在工业场景）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="65-总结开源生态的-5-年大周期"&gt;6.5 总结：开源生态的 5 年大周期
&lt;/h3&gt;&lt;p&gt;把 2021-2026 这 5 年看成一个完整周期，&lt;strong&gt;开源世界发生了 3 件事&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;基础设施化&lt;/strong&gt;——K8s、向量库、AI 框架从&amp;quot;前沿&amp;quot;变成&amp;quot;水电煤&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;垂直化&lt;/strong&gt;——通用工具（jQuery 时代）→ 框架时代（Vue/React）→ 垂直工具时代（AI × 行业）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 化&lt;/strong&gt;——2021 年 GitHub Trending 上看不到一个 LLM 项目，2026 年 LLM 项目占 Trending 70%+&lt;/li&gt;
&lt;/ol&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;5 年后回望，2021 年是&amp;quot;AI 革命前夜&amp;quot;&lt;/strong&gt;——云原生 + 微前端 + 时序数据库这些&amp;quot;非 AI 趋势&amp;quot;继续发展，但&lt;strong&gt;真正的范式转移是 2022-11 ChatGPT 发布后&lt;/strong&gt;才开始的。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="参考资料2024-补充"&gt;参考资料（2024+ 补充）
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kubernetes.io/blog/2024/04/16/dockershim-historical-context/" target="_blank" rel="noopener"
 &gt;K8s 1.30 弃用 Dockershim 详解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://redis.io/blog/redis-adopts-dual-source-available-licensing/" target="_blank" rel="noopener"
 &gt;Redis 开源协议变更公告&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/yt-dlp/yt-dlp" target="_blank" rel="noopener"
 &gt;yt-dlp 项目（youtube-dl 社区 fork）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tailscale.com/kb/1019/install/" target="_blank" rel="noopener"
 &gt;Tailscale / Headscale 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://roadmap.sh/" target="_blank" rel="noopener"
 &gt;roadmap.sh 工程师学习路线图&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://cesium.com/learn/" target="_blank" rel="noopener"
 &gt;Cesium 数字孪生实战&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/pgvector/pgvector" target="_blank" rel="noopener"
 &gt;pgvector GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://iotdb.apache.org/" target="_blank" rel="noopener"
 &gt;Apache IoTDB 时序数据库&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>GB28181 视频监控平台深度剖析：WVP-GB28181-pro 全链路源码分析</title><link>https://liangweidonggood.github.io/p/wvp-gb28181-pro-shenru-pouxi/</link><pubDate>Tue, 15 Sep 2020 00:00:00 +0800</pubDate><guid>https://liangweidonggood.github.io/p/wvp-gb28181-pro-shenru-pouxi/</guid><description>&lt;img src="https://liangweidonggood.github.io/p/wvp-gb28181-pro-shenru-pouxi/image/cover.jpg" alt="Featured image of post GB28181 视频监控平台深度剖析：WVP-GB28181-pro 全链路源码分析" /&gt;&lt;p&gt;WVP-GB28181-pro 是国内基于 GB/T 28181 国标协议的视频监控管理平台，2020 年 GitHub 上 &lt;code&gt;648540858/wvp-GB28181-pro&lt;/code&gt; 仓库 star 数已经超过 4k。&lt;strong&gt;它的核心是用 JAIN SIP 协议栈做信令服务，把 GB28181 设备（摄像头、NVR、平台）注册到平台，然后做实时视频流转发、云端录像、录像回放、级联、报警等&lt;/strong&gt;。本文从源码层做一次完整剖析。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;本文写于 2020 年 9 月&lt;/strong&gt;——WVP-GB28181-pro 1.x 时代。该项目至今仍在持续迭代。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一gb28181-协议基础"&gt;一、GB28181 协议基础
&lt;/h2&gt;&lt;p&gt;GB/T 28181-2016《安全防范视频监控联网系统信息传输、交换、控制技术要求》是中国公安部主导的国标协议，&lt;strong&gt;用于把不同厂商的摄像头/NVR 统一接入到一个平台上&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="11-协议核心特征"&gt;1.1 协议核心特征
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;信令协议&lt;/strong&gt;：SIP（RFC 3261）+ SDP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传输层&lt;/strong&gt;：UDP（默认）/ TCP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;媒体流&lt;/strong&gt;：RTP/RTCP（基于 RTSP 推流或 PS 封装的 RTP）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编解码&lt;/strong&gt;：H.264 / H.265 / SVAC&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心交互&lt;/strong&gt;：注册、目录查询、实时点播、回放、下载、报警、级联&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-gb28181-与-onvif-的区别"&gt;1.2 GB28181 与 ONVIF 的区别
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;GB28181&lt;/th&gt;
					&lt;th&gt;ONVIF&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;/td&gt;
					&lt;td&gt;国际标准&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;协议&lt;/td&gt;
					&lt;td&gt;SIP&lt;/td&gt;
					&lt;td&gt;HTTP + RTSP&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;推送方式&lt;/td&gt;
					&lt;td&gt;主动注册 + 平台调度&lt;/td&gt;
					&lt;td&gt;设备发现 + RTSP 拉流&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&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;/td&gt;
					&lt;td&gt;海康/大华/宇视/科达&lt;/td&gt;
					&lt;td&gt;Axis/Bosch/Hanwha&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="二wvp-gb28181-pro-项目架构"&gt;二、WVP-GB28181-pro 项目架构
&lt;/h2&gt;&lt;h3 id="21-项目定位"&gt;2.1 项目定位
&lt;/h3&gt;&lt;p&gt;WVP-GB28181-pro 是&lt;strong&gt;纯 Java 实现的 GB28181 国标信令网关 + 流媒体服务&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;前端&lt;/strong&gt;：Vue + Element UI（管理摄像头、用户、回放、录像）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后端&lt;/strong&gt;：Spring Boot + JAIN SIP + ZLMediaKit（流媒体）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;存储&lt;/strong&gt;：MySQL（设备信息）+ Redis（信令缓存）+ MinIO/阿里 OSS（录像）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-核心模块"&gt;2.2 核心模块
&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;/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;com.&amp;lt;your-org&amp;gt;.stream.gb28181
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── SipLayer # SIP 服务端（监听 5060 端口）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── config # 配置（信令端口、IP、上级平台）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── media # 媒体流转发
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── session # 客户端会话管理
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── event # 事件订阅与通知
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── controller # REST API（前端调用）
&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="23-关键依赖"&gt;2.3 关键依赖
&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;/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="nt"&gt;&amp;lt;dependencies&amp;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;&amp;lt;!-- SIP 协议栈 --&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;javax.sip&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;jain-sip-ri&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;1.3.0-91&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;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 class="c"&gt;&amp;lt;!-- Spring Boot Web --&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.springframework.boot&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-boot-starter-web&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;&amp;lt;!-- ZLMediaKit Java SDK --&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.aizuda&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;zlmediakit-java-sdk&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;/dependencies&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;h2 id="三sip-信令栈核心jain-sip-api"&gt;三、SIP 信令栈核心：JAIN SIP API
&lt;/h2&gt;&lt;h3 id="31-sipprovider-实现"&gt;3.1 SipProvider 实现
&lt;/h3&gt;&lt;p&gt;WVP 使用的 JAIN SIP 协议栈在 &lt;code&gt;gov.nist.javax.sip&lt;/code&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="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;SipProviderImpl&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&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;SipProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 公共 SIP 接口&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;SipProviderExt&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 class="n"&gt;SIPTransactionEventListener&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 class="n"&gt;SIPDialogEventListener&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="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="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;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;发送 SIP 消息&lt;/strong&gt;（REGISTER / INVITE / MESSAGE / BYE）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;接收 SIP 消息&lt;/strong&gt;（响应 + 异步事件）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;管理 SIP 事务 + 对话&lt;/strong&gt;（事务超时、重传）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="32-siplistener-接口"&gt;3.2 SipListener 接口
&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;/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="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;SipListener&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;extends&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EventListener&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. SIP 请求消息到达时 REGISTER/INVITE/BYE/MESSAGE&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;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;processRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RequestEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;event&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. SIP 响应消息到达时（200 OK / 401 / 403 等）&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;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;processResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ResponseEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;event&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. SIP 事务超时（INVITE 超时、OPTIONS 心跳超时等）&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;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;processTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TimeoutEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;event&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. 网络 I/O 异常（连接断开、发送失败）&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;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;processIOException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IOExceptionEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;event&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;// 5. SIP 事务结束（ACK 收到后 INVITE 事务终结）&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;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;processTransactionTerminated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TransactionTerminatedEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;event&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;// 6. SIP 对话（Dialog）结束（双方会话完全终结）&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;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;processDialogTerminated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DialogTerminatedEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;event&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;WVP 中所有 SIP 入口&lt;/strong&gt;都通过 &lt;code&gt;SipListener&lt;/code&gt; 接收，然后分发给具体的 &lt;code&gt;ISIPProcessorObserver&lt;/code&gt; 处理。&lt;/p&gt;
&lt;h2 id="四siplayer-服务端源码剖析"&gt;四、SipLayer 服务端源码剖析
&lt;/h2&gt;&lt;h3 id="41-siplayer-完整结构"&gt;4.1 SipLayer 完整结构
&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;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;/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;@Slf4j&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;@Component&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;@Order&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="n"&gt;10&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;SipLayer&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;CommandLineRunner&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;SipConfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sipConfig&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;ISIPProcessorObserver&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sipProcessorObserver&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;UserSetting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;userSetting&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;// TCP 与 UDP 的 SIP Provider 映射&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="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SipProviderImpl&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;tcpSipProviderMap&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="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConcurrentHashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;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="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SipProviderImpl&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;udpSipProviderMap&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="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConcurrentHashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;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;// 已监听过的 IP（防止重复 bind）&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="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&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;monitorIps&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="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;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="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;args&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;// 应用启动时初始化 SIP 监听&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;initSipServer&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="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SipProviderImpl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getUdpSipProvider&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;ip&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 class="cm"&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="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SipProviderImpl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getUdpSipProvider&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 class="cm"&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="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SipProviderImpl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getTcpSipProvider&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;ip&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 class="cm"&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="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SipProviderImpl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getTcpSipProvider&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 class="cm"&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="kd"&gt;public&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="nf"&gt;getLocalIp&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;deviceLocalIp&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 class="cm"&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="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="42-关键设计点"&gt;4.2 关键设计点
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;1. 双协议监听（TCP/UDP）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GB28181 设备通常用 UDP 5060 端口&lt;/li&gt;
&lt;li&gt;高级设备或跨网段用 TCP 5060 端口&lt;/li&gt;
&lt;li&gt;同一进程需要同时维护两套 &lt;code&gt;SipProvider&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. 多 IP 监听&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多网卡服务器需要监听所有 IP&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tcpSipProviderMap&lt;/code&gt; / &lt;code&gt;udpSipProviderMap&lt;/code&gt; 按 IP 维度维护&lt;/li&gt;
&lt;li&gt;&lt;code&gt;monitorIps&lt;/code&gt; 列表去重，防止重复 bind&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. 启动顺序 &lt;code&gt;@Order(10)&lt;/code&gt;&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring Boot &lt;code&gt;CommandLineRunner&lt;/code&gt; 启动后立即初始化&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Order(10)&lt;/code&gt; 保证在 Spring 主流程就绪后才启动 SIP&lt;/li&gt;
&lt;li&gt;失败的 SIP 初始化不会阻断 Web 服务&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="五完整调用链设备注册到目录查询"&gt;五、完整调用链：设备注册到目录查询
&lt;/h2&gt;&lt;h3 id="51-时序图"&gt;5.1 时序图
&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-plaintext" data-lang="plaintext"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Device WVP Controller sipCommander 设备 CatalogResponseMessageHandler DeviceChannelMapper DB
&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; │ │─sync(device)───▶│ │ │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │─CatalogQuery─▶│ │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │◀──Catalog XML─│ │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │ │──handle()───────▶│ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │ │ │──batchAdd───────────▶│ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │ │ │──batchUpdate────────▶│ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │ │ │──batchDel───────────▶│ │
&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="52-调用链详解"&gt;5.2 调用链详解
&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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;设备 → REGISTER → SipLayer（UDP 5060）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → SipListener.processRequest()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → ISIPRequestObserver（注册处理器）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 校验设备 ID + 密码
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 更新设备状态为&amp;#34;在线&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 200 OK
&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;/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;设备 → MESSAGE（Keepalive） → SipLayer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → SipListener.processRequest()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 解析 XML 设备状态
&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; → 200 OK
&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：目录查询（Catalog Query）&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;/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;WVP Controller 触发&amp;#34;同步通道&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → DeviceService.sync()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → sipCommander.catalogQuery(device, deviceChannel)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → SIP MESSAGE（带 Catalog 查询 XML）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 设备 → 200 OK
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 设备 → SIP MESSAGE（异步返回 Catalog 列表）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → SipLayer → CatalogResponseMessageHandler.handle()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 解析 XML 中的通道列表
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → DeviceChannelMapper.batchAdd(新增通道)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → DeviceChannelMapper.batchUpdate(更新通道)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → DeviceChannelMapper.batchDel(删除通道)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 写入 DB
&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;h2 id="六请求处理统一入口isiprequestprocessor"&gt;六、请求处理统一入口：ISIPRequestProcessor
&lt;/h2&gt;&lt;h3 id="61-处理器接口"&gt;6.1 处理器接口
&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;/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="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;ISIPRequestProcessor&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;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getMethod&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;// 处理逻辑&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;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RequestEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;event&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="62-内置处理器"&gt;6.2 内置处理器
&lt;/h3&gt;&lt;p&gt;WVP 内部为每种 SIP 请求都实现了一个 &lt;code&gt;ISIPRequestProcessor&lt;/code&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Method&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;code&gt;REGISTER&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;RegisterRequestProcessor&lt;/td&gt;
					&lt;td&gt;设备注册&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;MESSAGE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;MessageRequestProcessor&lt;/td&gt;
					&lt;td&gt;消息分发（心跳/目录/报警）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;INVITE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;InviteRequestProcessor&lt;/td&gt;
					&lt;td&gt;实时点播&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;BYE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;ByeRequestProcessor&lt;/td&gt;
					&lt;td&gt;结束点播&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;SUBSCRIBE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;SubscribeRequestProcessor&lt;/td&gt;
					&lt;td&gt;事件订阅&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ACK&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;AckRequestProcessor&lt;/td&gt;
					&lt;td&gt;INVITE 确认&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;OPTIONS&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;OptionsRequestProcessor&lt;/td&gt;
					&lt;td&gt;能力探测&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="63-派发器实现"&gt;6.3 派发器实现
&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;/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="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;SIPRequestProcessorParent&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;SipListener&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;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ISIPRequestProcessor&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;processors&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Spring 自动注入&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;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;processRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RequestEvent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;event&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;Request&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;request&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;event&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="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;method&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;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMethod&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;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ISIPRequestProcessor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;processor&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;processors&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;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;method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMethod&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;processor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&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;break&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="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;：&lt;strong&gt;策略模式 + 依赖注入&lt;/strong&gt;——新增请求类型只需要新增一个 &lt;code&gt;ISIPRequestProcessor&lt;/code&gt; 实现，Spring 自动扫描注册。&lt;/p&gt;
&lt;h2 id="七流媒体集成zlmediakit"&gt;七、流媒体集成：ZLMediaKit
&lt;/h2&gt;&lt;p&gt;WVP 本身&lt;strong&gt;不做媒体流转发&lt;/strong&gt;，它把流媒体的工作交给 ZLMediaKit（一个基于 C++ 的高性能流媒体服务）：&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;/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;GB28181 设备 → RTP/PS 流 → WVP 接收 → ZLMediaKit 拉流
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 转 RTMP/HLS/WebRTC
&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;h3 id="71-zlmediakit-角色"&gt;7.1 ZLMediaKit 角色
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;接收端&lt;/strong&gt;：通过 RTP 接收 PS 流（来自 GB28181 设备）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;转换端&lt;/strong&gt;：把 PS 流转换为 RTMP/HLS/WebRTC&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分发端&lt;/strong&gt;：把转换后的流推给浏览器/移动端/录像&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="72-wvp-调用-zlmediakit-的方式"&gt;7.2 WVP 调用 ZLMediaKit 的方式
&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;/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;// WVP 通过 HTTP API 调用 ZLMediaKit&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="n"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//zlmediakit:9000/index/api/openRtpServer&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="nl"&gt;Body&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 class="s"&gt;&amp;#34;port&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;10000&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;enable_tcp&amp;#34;&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="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;stream_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="s"&gt;&amp;#34;channel_001&amp;#34;&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;h2 id="八关键坑点与实战经验"&gt;八、关键坑点与实战经验
&lt;/h2&gt;&lt;h3 id="81-sip-端口冲突"&gt;8.1 SIP 端口冲突
&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 错误：Address already in use&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 原因：5060 端口被系统 SIP 服务占用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsof -i :5060
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 解决：修改 WVP 配置改用其他端口&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="82-设备注册失败"&gt;8.2 设备注册失败
&lt;/h3&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;401 Unauthorized&lt;/td&gt;
					&lt;td&gt;设备密码错误&lt;/td&gt;
					&lt;td&gt;检查 &lt;code&gt;UserSetting&lt;/code&gt; 配置&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;408 Request Timeout&lt;/td&gt;
					&lt;td&gt;网络不通&lt;/td&gt;
					&lt;td&gt;检查防火墙 + 端口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;480 Temporarily Unavailable&lt;/td&gt;
					&lt;td&gt;平台未就绪&lt;/td&gt;
					&lt;td&gt;检查 ZLMediaKit 状态&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="83-视频流拉不到"&gt;8.3 视频流拉不到
&lt;/h3&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;ZLMediaKit 返回错误&lt;/td&gt;
					&lt;td&gt;流地址配置错误&lt;/td&gt;
					&lt;td&gt;检查 &lt;code&gt;stream_id&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&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;录像文件 0 字节&lt;/td&gt;
					&lt;td&gt;录制路径权限&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;chown&lt;/code&gt; 给 WVP 用户&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="九写在最后"&gt;九、写在最后
&lt;/h2&gt;&lt;p&gt;WVP-GB28181-pro 的成功在于：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;选型准确&lt;/strong&gt;——Java 做信令网关（生态成熟、Spring Boot 快速开发）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解耦清晰&lt;/strong&gt;——SIP 信令 + 媒体流分离（ZLMediaKit 处理高吞吐）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实战性强&lt;/strong&gt;——适配海康/大华/宇视主流厂商设备&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社区活跃&lt;/strong&gt;——issue 响应快，文档持续更新&lt;/li&gt;
&lt;/ol&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;个人建议&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;想要自建视频监控平台：&lt;strong&gt;WVP + ZLMediaKit&lt;/strong&gt; 是国内最成熟的组合&lt;/li&gt;
&lt;li&gt;商业项目：考虑&lt;strong&gt;EasyCVR / TSINGSEE&lt;/strong&gt; 等商业产品（带 UI 和运维）&lt;/li&gt;
&lt;li&gt;国家级项目：需要支持&lt;strong&gt;GB28181-2022 新国标&lt;/strong&gt;（WVP 已部分支持）&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://openstd.samr.gov.cn/" target="_blank" rel="noopener"
 &gt;GB/T 28181-2016 协议规范&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/648540858/wvp-GB28181-pro" target="_blank" rel="noopener"
 &gt;WVP-GB28181-pro GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/zlmediakit/ZLMediaKit" target="_blank" rel="noopener"
 &gt;ZLMediaKit 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[JAIN SIP API 文档](&lt;a class="link" href="https://docs.oracle.com/cd/E13203_01/tuxedo/tux90/" target="_blank" rel="noopener"
 &gt;https://docs.oracle.com/cd/E13203_01/tuxedo/tux90/&lt;/a&gt; sip_java/javax/sip/SipListener.html)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="十2024-视角gb28181-2022ai-视频分析与-webrtc-播放"&gt;十、2024+ 视角：GB28181-2022、AI 视频分析与 WebRTC 播放
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;本文写于 2020 年 9 月，&lt;strong&gt;WVP-GB28181-pro 至今仍是最活跃的国标信令网关&lt;/strong&gt;。下面补充 2024-2026 行业关键变化：GB28181-2022 新国标、AI 视频分析、WebRTC 浏览器播放、ZLMediaKit 演进。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="101-gb28181-2022-新国标协议升级到互联网友好"&gt;10.1 GB28181-2022 新国标：协议升级到&amp;quot;互联网友好&amp;quot;
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://openstd.samr.gov.cn/" target="_blank" rel="noopener"
 &gt;GB/T 28181-2022&lt;/a&gt; 在 2023 年正式实施，&lt;strong&gt;对开发影响最大的是 4 件事&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;TCP 协议从可选升级到推荐&lt;/strong&gt;——2020 时代用 UDP 5060 是默认，2024+ 因为防火墙/NAT，&lt;strong&gt;TCP 已成为企业内部部署首选&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;H.265/HEVC 强制支持&lt;/strong&gt;——&lt;code&gt;eladmin&lt;/code&gt; 之类的旧版本 WVP 客户端无法解码 H.265 流，2024+ WVP-GB28181-pro 默认带 H.265 解码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;信令通道支持 HTTPS / WSS&lt;/strong&gt;——2020 时代 SIP 走 UDP 明文，&lt;strong&gt;2024+ 公安部等保 2.0 三级要求信令加密&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多级级联 + 跨域互联&lt;/strong&gt;——上/下级平台鉴权从 IP 白名单升级到 OAuth 2.0&lt;/li&gt;
&lt;/ol&gt;

 &lt;blockquote&gt;
 &lt;p&gt;WVP-GB28181-pro 在 2024 年的 2.0+ 版本（社区称为 WVP-PRO v2）已经默认兼容 2016 + 2022 双协议。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="102-wvp-项目的关键演进2020--2026"&gt;10.2 WVP 项目的关键演进（2020 → 2026）
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;2020（v1.x）&lt;/th&gt;
					&lt;th&gt;2024+（v2.x）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Spring Boot&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2.4.x&lt;/td&gt;
					&lt;td&gt;3.2.x&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;JDK&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;8&lt;/td&gt;
					&lt;td&gt;17 / 21&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;SIP 协议栈&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;jain-sip-ri 1.3.0-91&lt;/td&gt;
					&lt;td&gt;mjSIP 或 RestComm 替代（社区维护）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;流媒体&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;ZLMediaKit HTTP API&lt;/td&gt;
					&lt;td&gt;ZLMediaKit 25.x + SRS 5.x 双支持&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;前端&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Vue 2 + Element UI&lt;/td&gt;
					&lt;td&gt;Vue 3 + TypeScript + Vben&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;协议支持&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;GB28181-2016&lt;/td&gt;
					&lt;td&gt;GB28181-2016 + 2022 双协议&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;AI 集成&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;内置 AI 视频分析插件（火焰/安全帽/人脸）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="103-ai-视频分析从看到到看懂"&gt;10.3 AI 视频分析：从&amp;quot;看到&amp;quot;到&amp;quot;看懂&amp;quot;
&lt;/h3&gt;&lt;p&gt;2020 年的 WVP 主要是&amp;quot;信令 + 流转&amp;quot;，&lt;strong&gt;2024-2026 的核心增量是 AI 视频分析&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;海康/大华原生 AI 摄像头&lt;/strong&gt;（内置 NPU）——边缘推理，云端只收告警&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;云端 AI 分析插件&lt;/strong&gt;（基于 YOLOv8 / RT-DETR）——WVP 接入 RTSP 流后调用 AI 服务，&lt;strong&gt;实现&amp;quot;事后分析 + 实时告警&amp;quot;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多模态大模型&lt;/strong&gt;（LLaVA、GPT-4V）——2025-2026 的 WVP 高级版本可以&amp;quot;上传一张图，问 AI 视频里发生了什么&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实战架构（2025 主流）：&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-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GB28181 摄像头 → WVP（信令）→ ZLMediaKit（流媒体）
&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; AI 分析服务（Python + YOLOv8）
&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; 告警 → Kafka → 业务系统
&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; 录像 → MinIO / 阿里 OSS
&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;单纯做信令网关的 WVP 价值在 2025 年正在被压缩，&lt;strong&gt;&amp;ldquo;WVP + ZLMediaKit + AI 分析&amp;quot;的三件套才是完整方案&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="104-webrtc-浏览器播放解决-h5-时代痛点"&gt;10.4 WebRTC 浏览器播放：解决 H5 时代痛点
&lt;/h3&gt;&lt;p&gt;2020 年的痛点：浏览器只能看 HLS（延迟 3-5 秒）或 RTMP（需要 Flash）。&lt;strong&gt;2024+ 的方案&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ZLMediaKit 内置 WebRTC&lt;/strong&gt;——浏览器直接 &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; 标签播放，&lt;strong&gt;延迟 &amp;lt;500ms&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WVP 把 GB28181 PS 流推到 ZLMediaKit → 转 WebRTC&lt;/strong&gt;——完整链路延迟 &amp;lt;1s&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WHEP / WHIP 协议&lt;/strong&gt;——2024 年成为 WebRTC 与 GB28181 互通的事实标准&lt;/li&gt;
&lt;/ul&gt;
&lt;p&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 浏览器端 WebRTC 拉流（2024+ 主流）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;RTCPeerConnection&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;pc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addTransceiver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;video&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;direction&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sendrecv&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;pc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addTransceiver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;audio&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;direction&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sendrecv&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&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 class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;offer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createOffer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setLocalDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;offer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&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 class="c1"&gt;// 拉 ZLMediaKit 的 WebRTC 流
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http://zlmediakit:9000/index/api/webrtc?app=live&amp;amp;stream=cam001&amp;amp;type=play&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setRemoteDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&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 class="nx"&gt;pc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ontrack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;video&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;srcObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;streams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&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&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="105-实战补充2024-2026"&gt;10.5 实战补充（2024-2026）
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;K8s 部署&lt;/strong&gt;：WVP + ZLMediaKit 全部跑在 K8s，&lt;strong&gt;VIP 改成 K8s Service&lt;/strong&gt;（不再需要 Keepalived）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可观测性&lt;/strong&gt;：WVP 接入 Prometheus + Grafana，&lt;strong&gt;SIP 注册成功率、在线设备数、流转发 QPS&lt;/strong&gt; 全部可视化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全加固&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;SIP 端口从 5060 改 5061（WSS 加密）&lt;/li&gt;
&lt;li&gt;Redis 加 TLS&lt;/li&gt;
&lt;li&gt;ZLMediaKit 的 HTTP API 加 JWT 鉴权&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大规模部署&lt;/strong&gt;：单 WVP 实例承载 5000+ 设备，&lt;strong&gt;集群方案需要 2024+ 的 WVP-PRO 商业版&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="106-个人总结wvp-5-年的变化"&gt;10.6 个人总结：WVP 5 年的变化
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;2020 年做视频监控 = 信令网关 + 拉流分发&lt;br&gt;
2024 年做视频监控 = 信令网关 + 流媒体 + AI 分析 + 浏览器低延迟&lt;br&gt;
2026 年做视频监控 = 全套 + 多模态 AI + 边缘计算&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;WVP-GB28181-pro 这个项目 5 年来依然是&lt;strong&gt;国内 Java 视频监控的&amp;quot;事实标准&amp;rdquo;&lt;/strong&gt;——只是从&amp;quot;信令网关&amp;quot;演变成了&amp;quot;AI 视频平台入口&amp;quot;。&lt;/p&gt;
&lt;h2 id="参考资料2024-补充"&gt;参考资料（2024+ 补充）
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://openstd.samr.gov.cn/" target="_blank" rel="noopener"
 &gt;GB/T 28181-2022 协议规范&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/zlmediakit/ZLMediaKit/blob/master/www/docs/WebRTC.md" target="_blank" rel="noopener"
 &gt;ZLMediaKit WebRTC 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/648540858/wvp-GB28181-pro" target="_blank" rel="noopener"
 &gt;WVP-PRO 2.0 GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://datatracker.ietf.org/doc/draft-murillo-whep/" target="_blank" rel="noopener"
 &gt;WHEP / WHIP 协议草案&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ultralytics.com/" target="_blank" rel="noopener"
 &gt;YOLOv8 视频分析实战&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>