鍵.png)
使用NestJS和Prisma構(gòu)建REST API:身份驗證
優(yōu)化 ASP.NET Core Web API 性能
開發(fā)人員嗨,構(gòu)建高性能的 ASP.NET Core Web API 非常重要。它可以幫助用戶享受更快的交互并降低服務(wù)器成本。本文將指導(dǎo)你了解 ASP.NET Core Web API 的一些實用性能優(yōu)化技巧。
重要性:
異步代碼允許您的應(yīng)用程序同時處理更多請求。因為它在等待任務(wù)完成的同時釋放了資源。
如何使用:
用于 I/O 操作,如數(shù)據(jù)庫調(diào)用、文件讀取和網(wǎng)絡(luò)請求。ASP.NET Core 適用于異步代碼。這是提高性能的好方法。asyncawait
public async Task<IActionResult> GetData()
{
var data = await _dataService.GetDataAsync();
return Ok(data);
}
重要性:
緩存可以通過存儲響應(yīng)來節(jié)省時間。當類似的請求再次出現(xiàn)時,服務(wù)器可以返回緩存的響應(yīng),而無需再次處理它。
如何使用:
使用 attribute 來緩存響應(yīng)。您可以指定數(shù)據(jù)應(yīng)緩存多長時間。對于靜態(tài)數(shù)據(jù),緩存可以顯著降低服務(wù)器負載。[ResponseCache]
[HttpGet]
[ResponseCache(Duration = 60)]
public IActionResult GetStaticData()
{
return Ok("This is cached data.");
}
重要性:
緩慢的數(shù)據(jù)庫查詢會損害 API 性能。API 等待數(shù)據(jù)的時間越長,響應(yīng)速度就越慢。
如何優(yōu)化:
public async Task<IActionResult> GetPagedData(int page = 1, int pageSize = 10)
{
var data = await _context.Data
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToListAsync();
return Ok(data);
}
重要性:
依賴注入 (DI) 改進了代碼組織和測試。但是,管理不善的 DI 可能會導(dǎo)致性能問題。
使用方法:
正確設(shè)置服務(wù)生命周期:
// Singleton service for static data
services.AddSingleton<IStaticDataService, StaticDataService>();
// Scoped service for per-request data
services.AddScoped<IRequestService, RequestService>();
// Transient service for lightweight operations
services.AddTransient<IUtilityService, UtilityService>();
重要性:
每個 middleware 都會為每個請求增加處理時間。太多的中間件會降低 API 的速度。
如何使用:
只添加必要的中間件。避免添加不需要的中間件。
var app = builder.Build();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
重要性:
壓縮會減小響應(yīng)大小。較小的響應(yīng)傳輸和加載速度更快。
使用方法:
在 中啟用響應(yīng)壓縮。使用 Gzip 或 Brotli 壓縮以獲得常見的性能提升。Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
});
}
重要性:
ASP.NET Core 使用 JSON 來格式化響應(yīng)。優(yōu)化序列化可縮短處理時間。
如何使用:
使用代替 .它速度更快,并針對 .NET Core 進行了優(yōu)化。此外,如果不需要,請禁用區(qū)分大小寫和默認 null 值等功能。System.Text.JsonNewtonsoft.Json
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null;
options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
});
}
重要性:
如果您提供靜態(tài)文件(如圖像和腳本),CDN 可以提供幫助。CDN 將文件存儲在世界各地的許多地方。用戶可以從附近的位置加載文件,從而加快加載速度。
如何使用:
在 CDN 上托管靜態(tài)文件或為您的服務(wù)器啟用 CDN。在 API 或前端代碼中使用指向這些文件的鏈接。
重要性:
引發(fā)異常可能代價高昂。它需要額外的資源來捕獲、記錄和處理它們。
使用方法:
避免為常規(guī)控制流拋出異常。請改用驗證檢查。
// Instead of throwing an exception, return a 404 if not found
var data = await _dataService.GetDataByIdAsync(id);
if (data == null)
{
return NotFound();
}
return Ok(data);
重要性:
監(jiān)控可讓您跟蹤一段時間內(nèi)的性能。您可以找到瓶頸和需要改進的領(lǐng)域。
如何使用:
使用 Application Insights、Prometheus 或 Grafana 等工具。跟蹤請求持續(xù)時間、錯誤率和內(nèi)存使用情況等指標。
// Sample Application Insights setup
services.AddApplicationInsightsTelemetry(Configuration["APPINSIGHTS_CONNECTIONSTRING"]);
重要性:
通過網(wǎng)絡(luò)發(fā)送大型對象會減慢響應(yīng)時間。數(shù)據(jù)傳輸對象 (DTO) 是數(shù)據(jù)模型的簡化版本,僅包含必要的字段。
如何使用:
為每個請求/響應(yīng)創(chuàng)建 DTO 并僅映射所需的屬性。
public class UserDto
{
public int Id { get; set; }
public string Name { get; set; }
}
var userDto = new UserDto { Id = user.Id, Name = user.Name };
return Ok(userDto);
重要性:
數(shù)據(jù)庫連接的打開和關(guān)閉速度可能很慢。連接池重用現(xiàn)有連接,從而提高速度。
如何使用:
默認情況下,大多數(shù) ASP.NET Core 數(shù)據(jù)庫庫都支持池化。對于 SQL 數(shù)據(jù)庫,默認情況下,在 Entity Framework Core 中啟用連接池。只需確保配置正確即可。
重要性:
內(nèi)存緩存速度很快,但 Redis 可以在多個服務(wù)器上提供分布式緩存。
如何使用:
在 ASP.NET Core 中將 Redis 設(shè)置為分布式緩存。將其配置為緩存經(jīng)常訪問的數(shù)據(jù),如用戶會話。
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost:6379";
});
重要性:
LINQ 查詢使代碼可讀,但對于復(fù)雜操作可能會變慢。避免在性能敏感的代碼中使用它。
如何使用:
如果性能至關(guān)重要,請用優(yōu)化的替代方案替換復(fù)雜的 LINQ 查詢。有時,直接 SQL 查詢更快。
// Inefficient LINQ query
var data = _context.Data.Where(x => x.IsActive).ToList();
// More efficient alternative
var data = _context.Data.FromSqlRaw("SELECT * FROM Data WHERE IsActive = 1").ToList();
提高 ASP.NET Core Web API 的性能需要時間和測試。這些提示可以通過減少服務(wù)器負載和響應(yīng)時間來發(fā)揮作用。首先應(yīng)用一些符合您的 API 需求的提示,然后監(jiān)控影響。逐漸地,您將看到速度和用戶滿意度的改進。
本文章轉(zhuǎn)載微信公眾號@架構(gòu)師老盧