摘要:本文将系统梳理 .NET Core API 优化的关键点,帮助你打造一个 高性能、可扩展、稳定可靠 的 API 服务。
在企业级开发中,API 的性能与稳定性直接影响用户体验和系统可扩展性。
很多开发者在上线后才发现:请求延迟高、CPU 占用高、数据库压力大……
本文将系统梳理 .NET Core API 优化的关键点,帮助你打造一个 高性能、可扩展、稳定可靠 的 API 服务。
✅ 使用异步编程ASP.NET Core 的请求管道是 异步模型,如果你写成同步方法,可能会阻塞线程,降低吞吐量。
// ❌ 不推荐public IActionResult GetData
{
var data = _service.GetData;
return Ok(data);
}
// ✅ 推荐
public async Task GetDataAsync
{
var data = await _service.GetDataAsync;
return Ok(data);
}✅ 启用响应压缩
开启 Gzip 或 Brotli 压缩,减少数据传输量。
builder.Services.AddResponseCompression(options =>{
options.EnableForHttps = true;
});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) });✅ 正确使用 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
.WaitAndRetryAsync(3, _ => TimeSpan.FromSeconds(2)));✅ 使用内存缓存 (MemoryCache)
适合单机部署的场景。
builder.Services.AddMemoryCache;✅ 使用分布式缓存 (Redis)适合多节点 API,确保缓存一致性。
✅ API 限流避免恶意请求或高并发冲垮系统。
可使用 AspNetCoreRateLimit中间件:
builder.Services.AddInMemoryRateLimiting;配置示例:
"IpRateLimiting": {"GeneralRules": [
{ "Endpoint": "*", "Period": "1s", "Limit": 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 或监控系统探活。✅ 使用 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 更高效。
·············· END ··············
来源:opendotnet