不修改一行代码,仅通过优化基础设施、头部和缓存,即可为你的 .NET Core API 削减 200ms 的延迟。
🧠 真正的性能瓶颈并不在我的代码中 和大多数开发者一样,当我的 .NET Core API 开始感觉迟缓时,我首先想到了我的 IDE。
我分析了控制器(Controller)。 我检查了 Entity Framework 查询。 我重构了一些路由(Route)。
但在所有这些之后……响应时间几乎没有变化。
于是我改变了策略。
我没有重写代码,而是转向了基础设施。结果如何?平均响应速度提升了 200ms —— 而且没有动任何一个控制器。
以下是具体方案。
🚀 1. 启用响应压缩(默认是关闭的!) 大多数客户端不需要原始的 JSON。它们需要的是压缩后的响应。
仅添加 gzip 或 brotli 压缩就为大型 JSON 负载削减了约 80ms。
✅ 操作方法:
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
options.Providers.Add<BrotliCompressionProvider>();
options.Providers.Add<GzipCompressionProvider>();
});
}
🧠 提示: 对于现代浏览器,优先使用 Brotli —— 它比 gzip 更高效。
🌐 2. 添加 CDN 层(即使对 API 也有效) “CDN 只适用于静态资源。” 不对。它们对于 API 缓存也同样出色。
我使用 Cloudflare,为公共的 GET 端点添加了边缘缓存。
结果:全球用户的延迟从 300ms+ 下降到了 100ms 以下。
🧩 工作原理:
Cache-Control: public, max-age=60
🎯 结合查询字符串规范化(query-string normalization)使用,以避免缓存碎片。
⚡ 3. 开启 HTTP/2 或 HTTP/3 .NET Core 应用程序开箱即用地支持 HTTP/2 —— 但你的基础设施可能默认使用 HTTP/1.1。
切换到 HTTP/2 或 HTTP/3 可以启用:
💡 如果你在使用 Kestrel,只需确保在 launchSettings.json
或你的反向代理(如 Nginx 或 IIS)中启用了它。
"applicationUrl": "https://localhost:5001;http://localhost:5000"
✅ 同时,在负载均衡器层面配置 ALPN 支持。
🗃 4. 在每一层进行智能缓存 即使对于 API,缓存也是一个“作弊码”。
🔹 使用 IMemoryCache
进行内存缓存
🔹 使用 Redis 进行分布式缓存
🔹 使用 Nginx 或 Varnish 进行反向代理缓存
🔹 CDN 缓存(如上所述)
黄金法则:只有在绝对必要时才从数据库获取数据。
🔐 5. 优化 TLS 和 TCP 开销 是否曾想过为什么你的第一个请求需要 200ms,而下一个只需要 40ms?
这很可能是 TLS + 连接开销。
修复方法:
当你每秒处理数千个请求时,这些微优化会累积起来产生显著效果。
🧰 6. 使用服务器端 HTTP 缓存头部 为每一个静态或很少变化的响应添加这些头部:
Cache-Control: public, max-age=300
ETag: "abc123"
✅ 启用浏览器缓存 ✅ 启用 CDN 重新验证(revalidation) ✅ 减少往返次数(round trips)
📈 我取得的成果 之前:
经过这些基础设施调整后:
P99:260ms
全球平均:150ms
无需代码变更。
无需新库。
仅仅是智能配置。
🧠 为什么这很重要 有时候,加速你的应用程序的最佳方法…… 根本不在代码之中。
而是在于:
🛠 TL;DR 清单 ✅ 启用响应压缩 ✅ 使用 CDN 缓存 GET 端点 ✅ 升级到 HTTP/2 或 HTTP/3 ✅ 添加缓存头部 (ETag, Cache-Control) ✅ 优化 TLS/连接复用 ✅ 在 API、代理和 CDN 层进行缓存
📌 最后的思考 你的后端可能已经很快了。 但如果没有进行基础设施调优,用户可能永远感受不到。
所以,在重写你的服务之前,请这样做: 无需更改代码即可削减延迟。这很有效。