不修改一行代码,为你的 .NET Core API 削减 200ms 延迟:基础设施、头部与缓存优化实战

作者:微信公众号:【架构师老卢】
8-26 19:14
10

不修改一行代码,仅通过优化基础设施、头部和缓存,即可为你的 .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 以下。

🧩 工作原理:

  • 在边缘缓存匿名的 GET 请求
  • 使用如下的缓存控制头部:
    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 可以启用:

  • 头部压缩(Header compression)
  • 多路复用(Multiplexing)
  • 更快的 TLS 握手(Faster TLS handshakes)

💡 如果你在使用 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 + 连接开销。

修复方法:

  • 使用 Keep-Alive 连接
  • 启用会话恢复(Session Resumption)
  • 如果使用 Cloudflare 或 AWS,请开启 TLS 1.3 和 0-RTT

当你每秒处理数千个请求时,这些微优化会累积起来产生显著效果。

🧰 6. 使用服务器端 HTTP 缓存头部 为每一个静态或很少变化的响应添加这些头部:

Cache-Control: public, max-age=300
ETag: "abc123"

✅ 启用浏览器缓存 ✅ 启用 CDN 重新验证(revalidation) ✅ 减少往返次数(round trips)

📈 我取得的成果 之前:

  • P99 响应时间:480ms
  • 全球平均延迟:350ms

经过这些基础设施调整后:

  • P99:260ms

  • 全球平均:150ms

  • 无需代码变更。

  • 无需新库。

  • 仅仅是智能配置。

🧠 为什么这很重要 有时候,加速你的应用程序的最佳方法…… 根本不在代码之中。

而是在于:

  • 你如何提供(serve)代码
  • 你在哪里缓存它
  • 你如何交付(deliver)它

🛠 TL;DR 清单 ✅ 启用响应压缩 ✅ 使用 CDN 缓存 GET 端点 ✅ 升级到 HTTP/2 或 HTTP/3 ✅ 添加缓存头部 (ETag, Cache-Control) ✅ 优化 TLS/连接复用 ✅ 在 API、代理和 CDN 层进行缓存

📌 最后的思考 你的后端可能已经很快了。 但如果没有进行基础设施调优,用户可能永远感受不到。

所以,在重写你的服务之前,请这样做: 无需更改代码即可削减延迟。这很有效。

相关留言评论
昵称:
邮箱:
阅读排行