Document

.NET Core API 性能优化实战:从 100 QPS 到 10,000 QPS

在企业级开发中,API 的性能与稳定性 直接影响用户体验和系统可扩展性。
很多开发者在上线后才发现:请求延迟高、CPU 占用高、数据库压力大……

本文将系统梳理 .NET Core API 优化的关键点,帮助你打造一个 高性能、可扩展、稳定可靠 的 API 服务。


1. 接口性能优化

✅ 使用异步编程

ASP.NET Core 的请求管道是 异步模型,如果你写成同步方法,可能会阻塞线程,降低吞吐量。

// ❌ 不推荐
public IActionResult GetData()
{
    var data = _service.GetData();
    return Ok(data);
}

// ✅ 推荐
public async Task<IActionResult> GetDataAsync()
{
    var data = await _service.GetDataAsync();
    return Ok(data);
}

✅ 启用响应压缩

开启 Gzip 或 Brotli 压缩,减少数据传输量。

builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
});

2. 数据库访问优化

✅ 使用连接池

EF Core 默认支持数据库连接池,但要注意释放 DbContext,避免连接泄漏。

using var db = new MyDbContext();
var data = await db.Users.ToListAsync();

✅ 减少 N+1 查询

EF Core 的 Include 可以减少额外的 SQL 调用。

// ❌ 容易产生多次查询
var orders = db.Orders.ToList();
foreach (var o in orders)
{
    var customer = db.Customers.Find(o.CustomerId);
}

// ✅ 推荐
var orders = db.Orders.Include(o => o.Customer).ToList();

✅ 使用缓存

高频查询数据可以存入 Redis,避免每次都查数据库。

await _cache.SetStringAsync("user:1", JsonSerializer.Serialize(user),
    new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5) });

3. 网络调用优化

✅ 正确使用 HttpClient

  • • 避免每次 new HttpClient()
  • • 推荐使用 IHttpClientFactory 管理生命周期。
builder.Services.AddHttpClient("MyApiClient", client =>
{
    client.BaseAddress = new Uri("https://api.example.com");
});

✅ 添加超时 & 重试策略

结合 Polly 增加容错能力。

builder.Services.AddHttpClient("MyApiClient")
    .AddPolicyHandler(Policy
        .Handle<HttpRequestException>()
        .WaitAndRetryAsync(3, _ => TimeSpan.FromSeconds(2)));

4. 缓存与限流

✅ 使用内存缓存 (MemoryCache)

适合单机部署的场景。

builder.Services.AddMemoryCache();

✅ 使用分布式缓存 (Redis)

适合多节点 API,确保缓存一致性。

✅ API 限流

避免恶意请求或高并发冲垮系统。

可使用 AspNetCoreRateLimit 中间件:

builder.Services.AddInMemoryRateLimiting();

配置示例:

"IpRateLimiting": {
  "GeneralRules": [
    { "Endpoint": "*", "Period": "1s", "Limit": 5 }
  ]
}

5. 日志与监控

✅ 统一日志

使用 Serilog 或 NLog,支持写入文件、ElasticSearch、Seq 等。

builder.Host.UseSerilog((ctx, lc) => lc
    .WriteTo.Console()
    .WriteTo.File("logs/log.txt"));

✅ 健康检查

利用 ASP.NET Core 内置的 HealthChecks

builder.Services.AddHealthChecks()
    .AddSqlServer("connection_string")
    .AddRedis("localhost:6379");

暴露 /health 接口,供 Kubernetes 或监控系统探活。


6. 部署与运维优化

✅ 使用 Docker 镜像瘦身

基于 Alpine 镜像构建,减少体积,提升启动速度。

FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS base

✅ 开启 Kestrel 性能调优

builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.MaxConcurrentConnections = 1000;
    options.Limits.MaxRequestBodySize = 10 * 1024;
});

✅ 启用 HTTP/2 或 gRPC

对于服务间调用,gRPC 比 REST 更高效。

 

 
posted @ 2025-09-09 17:24  从未被超越  阅读(6)  评论(0)    收藏  举报