<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>技术选型 on 武成龙</title><link>https://orangon.github.io/categories/%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B/</link><description>Recent content in 技术选型 on 武成龙</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Tue, 30 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://orangon.github.io/categories/%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>后端框架选型：Fastify / FastAPI / Spring Boot / Go 怎么选？</title><link>https://orangon.github.io/posts/2026-06-30-web-framework-selection/</link><pubDate>Tue, 30 Jun 2026 00:00:00 +0000</pubDate><guid>https://orangon.github.io/posts/2026-06-30-web-framework-selection/</guid><description>&lt;p&gt;我在为一个小型信息管理 Web 项目做后端选型，候选有 Node.js (Fastify)、Python (FastAPI)、Java (Spring Boot)、Go (Gin)。为了不被&amp;quot;听说&amp;quot;带节奏，我读了两篇风格迥异的性能对比文章，把结论提炼出来，并给出针对这类项目的明确推荐。&lt;/p&gt;
&lt;p&gt;先说结论：&lt;strong&gt;对小型信息管理系统，我会首选 Python (FastAPI)；如果团队是 JS/TS 背景，选 Fastify；只有当你在意单二进制部署或预期流量会快速增长时，才需要认真考虑 Go (Gin)。Spring Boot 对这个量级偏重，除非你本来就是 Java 栈。&lt;/strong&gt; 下面是依据。&lt;/p&gt;
&lt;h2 id="一第一篇travis-luong-的单机-wrk-基准测试"&gt;一、第一篇：Travis Luong 的单机 wrk 基准测试
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;来源：&lt;a class="link" href="https://www.travisluong.com/fastapi-vs-fastify-vs-spring-boot-vs-gin-benchmark/" target="_blank" rel="noopener"
 &gt;FastAPI vs Fastify vs Spring Boot vs Gin Benchmark&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;这篇是相对&amp;quot;实验室&amp;quot;式的测试：每个框架写一个接口，从 PostgreSQL 查 100 行数据返回 JSON，用 wrk 压 10 秒。作者非常坦诚，多次更新修正了&amp;quot;进程数不对等&amp;quot;等测试缺陷。它的价值不在于绝对数字，而在于揭示了&lt;strong&gt;配置对性能的放大效应&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;代表性排名（req/sec，摘自作者的最终榜单）：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;排名&lt;/th&gt;
					&lt;th&gt;配置&lt;/th&gt;
					&lt;th&gt;req/sec&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;Spring Boot + &lt;strong&gt;jdbc（原生）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;7886&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;Go + &lt;strong&gt;pgx&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;7517&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;Go + pg + 连接池调优&lt;/td&gt;
					&lt;td&gt;7388&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;FastAPI + &lt;strong&gt;asyncpg + ujson + gunicorn 8w&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;4831&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;5&lt;/td&gt;
					&lt;td&gt;Fastify + pg + cluster 8w（关日志）&lt;/td&gt;
					&lt;td&gt;4622&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;8&lt;/td&gt;
					&lt;td&gt;Express + pg + cluster 8w&lt;/td&gt;
					&lt;td&gt;4145&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;10&lt;/td&gt;
					&lt;td&gt;Gin + database/sql + lib/pq&lt;/td&gt;
					&lt;td&gt;2966&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;12&lt;/td&gt;
					&lt;td&gt;Fastify + pg（单进程）&lt;/td&gt;
					&lt;td&gt;2184&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;20&lt;/td&gt;
					&lt;td&gt;Spring Boot + &lt;strong&gt;JPA（ORM）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;844&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;FastAPI 开箱并不快&lt;/strong&gt;——必须配上 &lt;code&gt;asyncpg&lt;/code&gt; 异步驱动才能发挥，光这一点就能拉开数倍差距。&lt;/li&gt;
&lt;li&gt;即使用了 asyncpg，&lt;strong&gt;还要换更快的 JSON 库（orjson/ujson）&lt;/strong&gt; 才能追上 Node.js。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原生 SQL 转 JSON 远快于 ORM&lt;/strong&gt;——最直观的证据：同样是 Spring Boot，用 jdbc 是 7886，换成 JPA 直接掉到 844，差了近 10 倍。框架的&amp;quot;慢&amp;quot;往往来自 ORM 层，而不是框架本身。&lt;/li&gt;
&lt;li&gt;编译型语言（Java/Go）在同等配置下确实比解释型快。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日志会拖性能&lt;/strong&gt;——Fastify 关掉日志后明显提速。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一句话总结：&lt;strong&gt;这篇告诉我们&amp;quot;配置 &amp;gt; 选型&amp;quot;——同一个框架，会不会调，性能能差一个数量级。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="二第二篇10-亿请求下的生存测试"&gt;二、第二篇：10 亿请求下的&amp;quot;生存测试&amp;quot;
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;来源：&lt;a class="link" href="https://www.51cto.com/article/816124.html" target="_blank" rel="noopener"
 &gt;五大主流 Web 框架真实性能对比：10 亿请求下谁能幸存？&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;这篇更&amp;quot;生产化&amp;quot;：谷歌云 4 核 16G、Docker 部署、PostgreSQL 连接池，用 wrk2 把流量从 100 RPS 一路爬到 10 万 RPS，同时观察吞吐、延迟、内存、CPU、错误率。&lt;/p&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;持续稳定 RPS&lt;/th&gt;
					&lt;th&gt;峰值内存&lt;/th&gt;
					&lt;th&gt;99% 延迟&lt;/th&gt;
					&lt;th&gt;CPU 峰值&lt;/th&gt;
					&lt;th&gt;错误率(10万RPS)&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Rust (Actix-Web)&lt;/td&gt;
					&lt;td&gt;110,000&lt;/td&gt;
					&lt;td&gt;250 MB&lt;/td&gt;
					&lt;td&gt;7 ms&lt;/td&gt;
					&lt;td&gt;75%&lt;/td&gt;
					&lt;td&gt;0.01%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Go (Gin)&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;105,000&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;190 MB&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;10 ms&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;68%&lt;/td&gt;
					&lt;td&gt;0.03%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Node.js (Fastify)&lt;/td&gt;
					&lt;td&gt;60,000&lt;/td&gt;
					&lt;td&gt;650 MB&lt;/td&gt;
					&lt;td&gt;35 ms&lt;/td&gt;
					&lt;td&gt;82%&lt;/td&gt;
					&lt;td&gt;0.5%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Java (Spring Boot)&lt;/td&gt;
					&lt;td&gt;40,000&lt;/td&gt;
					&lt;td&gt;1.4 GB&lt;/td&gt;
					&lt;td&gt;50 ms&lt;/td&gt;
					&lt;td&gt;88%&lt;/td&gt;
					&lt;td&gt;0.3%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Python (FastAPI)&lt;/td&gt;
					&lt;td&gt;8,000&lt;/td&gt;
					&lt;td&gt;1.2 GB&lt;/td&gt;
					&lt;td&gt;150 ms&lt;/td&gt;
					&lt;td&gt;100%&lt;/td&gt;
					&lt;td&gt;15%&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;作者的&amp;quot;幸存者&amp;quot;分级：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;绝对幸存者 —— Go (Gin)&lt;/strong&gt;：性能、开发效率、生态三者最平衡，像&amp;quot;AK47&amp;quot;，易上手、耐造。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;极限生存者 —— Rust (Actix)&lt;/strong&gt;：性能天花板，但学习曲线陡，需专业团队。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主流生存者 —— Fastify / Spring Boot&lt;/strong&gt;：覆盖大多数公司的常规战场。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;限定生存者 —— FastAPI&lt;/strong&gt;：仅在低并发&amp;quot;安全区&amp;quot;（&amp;lt; 1 万 RPS）表现良好，适合数据管道、AI 模型接口。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一句话总结：&lt;strong&gt;这篇把极限高并发的天花板拉了出来——系统级语言（Go/Rust）是降维打击，但前提是你真的有那么多流量。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="三两篇放在一起看"&gt;三、两篇放在一起看
&lt;/h2&gt;&lt;p&gt;两篇文章结论高度一致，但视角互补：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;性能天花板&lt;/strong&gt;：Go ≈ Java(原生) &amp;gt; Node &amp;gt; Python。压到极限时，编译型语言的优势会随并发上升而放大。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资源效率&lt;/strong&gt;：Go 最省（190MB），Java 最重（1.4GB + 启动 12 秒）。Python 在高并发下反而吃内存（1.2GB）且错误率飙升。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易用性 / 开发效率&lt;/strong&gt;：恰好与性能排序相反——FastAPI 开发最快、自动文档最香，但抗并发最弱。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关键陷阱：&lt;strong&gt;别把高并发结论直接套到小项目上。&lt;/strong&gt; 第二篇自己也写明，FastAPI 的&amp;quot;安全区&amp;quot;是 &amp;lt; 1 万 RPS——而一个小型信息管理系统，日常峰值大概率在几十到几百 RPS，离这个阈值有两个数量级。在这种流量下，框架本身的吞吐根本不是瓶颈，&lt;strong&gt;开发速度、可维护性、文档自动生成&lt;/strong&gt;才是。&lt;/p&gt;
&lt;h2 id="四针对小型信息管理系统的推荐"&gt;四、针对&amp;quot;小型信息管理系统&amp;quot;的推荐
&lt;/h2&gt;&lt;p&gt;信息管理系统的典型特征：以 CRUD 为主、中低并发、前后端分离、追求快速交付。这类项目的真正成本不在服务器，而在&lt;strong&gt;开发和对接的人力&lt;/strong&gt;。所以选型权重应该是：开发效率 &amp;gt; 文档/对接 &amp;gt; 部署运维 &amp;gt; 极限性能。&lt;/p&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;推荐&lt;/th&gt;
					&lt;th&gt;理由&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;想最快交付、要自动 API 文档给前端&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;FastAPI&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;类型提示 + 自动 OpenAPI 文档，信息管理系统的 CRUD 接口几乎&amp;quot;写模型即得文档&amp;quot;；&amp;lt;1万 RPS 安全区绰绰有余&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;团队是 JS/TS 背景，想前后端同语言&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Fastify&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;比 Express 快、schema 校验内置，前后端类型可复用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;追求单二进制部署、运维简单，或预期流量会涨&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Go (Gin)&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;编译成一个可执行文件扔服务器即可，无运行时依赖；两篇文章里都是&amp;quot;绝对幸存者&amp;quot;，未来不会遇到性能墙&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;已有 Java 栈 / 复杂事务和权限&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Spring Boot&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;生态最全，但启动慢、内存重，对小项目是&amp;quot;用航母运快递&amp;quot;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;我的最终选择是 &lt;strong&gt;FastAPI&lt;/strong&gt;。原因很实在：信息管理系统的价值在于&amp;quot;把数据管起来、把接口暴露清楚&amp;quot;，FastAPI 的 Pydantic 模型 + 自动文档把这两件事的成本压到了最低；性能上配 &lt;code&gt;asyncpg + orjson&lt;/code&gt;（第一篇验证可到 ~4800 req/s）对小型系统完全是冗余的富余。等哪天流量真涨上来，再按第二篇的指引用 Go 重写核心接口，成本也可控——技术选型从来不是非黑即白，而是匹配当下的战场。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;参考来源：&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Travis Luong — &lt;a class="link" href="https://www.travisluong.com/fastapi-vs-fastify-vs-spring-boot-vs-gin-benchmark/" target="_blank" rel="noopener"
 &gt;FastAPI vs Fastify vs Spring Boot vs Gin Benchmark&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;51CTO — &lt;a class="link" href="https://www.51cto.com/article/816124.html" target="_blank" rel="noopener"
 &gt;五大主流 Web 框架真实性能对比：10 亿请求下谁能幸存？&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>