在现代 Web 开发中,构建弹性 API 对于确保可靠性和性能至关重要。本文将指导您使用 Microsoft.Extensions.Http.Resilience 库在 .NET 8 Web API 中实现弹性。我们将介绍如何设置重试策略和超时,以使您的 API 更能抵御瞬时故障。
步骤 1.创建一个新的 .NET 8 Web API 项目
首先,如果您没有现有项目,请使用 .NET CLI 创建一个或使用默认的 Web API 模板。
步骤 2.添加所需的 NuGet 包
接下来,通过 NuGet 安装Microsoft.Extensions.Http.Resilience库:
dotnet add package Microsoft.Extensions.Http.Resilience --version 8.0.0
步骤 3.在 Program.cs 中配置 Resilience
修改 Program.cs 文件以使用 Microsoft.Extensions.Http.Resilience 提供的弹性策略设置 HttpClient。在这里,我们将定义重试策略和超时。
// 添加Resilience Pipeline
builder.Services.AddResiliencePipeline("default", x =>
{
// 添加重试策略
x.AddRetry(new Polly.Retry.RetryStrategyOptions
{
// 设置重试条件,处理所有异常
ShouldHandle = new PredicateBuilder().Handle<Exception>(),
// 设置重试的延迟时间为2秒
Delay = TimeSpan.FromSeconds(2),
// 最大重试次数为2次
MaxRetryAttempts = 2,
// 使用指数退避策略
BackoffType = DelayBackoffType.Exponential,
// 启用抖动,增加随机性以减少碰撞
UseJitter = true
})
// 添加超时策略,超时时间为30秒
.AddTimeout(TimeSpan.FromSeconds(30));
});
步骤 4.在服务中使用弹性 HttpClient
接下来,我们将在您的服务中注入并使用已配置的 HttpClient。此示例展示了如何使用弹性 HttpClient 从外部 API 获取数据。
public class WeatherService
{
// HttpClient实例,用于发送HTTP请求
private readonly HttpClient _httpClient;
// 弹性管道提供程序
private readonly ResiliencePipelineProvider<string> _resiliencePipelineProvider;
// 构造函数,注入HttpClient和ResiliencePipelineProvider实例
public WeatherService(HttpClient httpClient,
ResiliencePipelineProvider<string> resiliencePipelineProvider)
{
_httpClient = httpClient;
_resiliencePipelineProvider = resiliencePipelineProvider;
}
// 异步方法,获取天气信息
public async Task<string> GetWeatherAsync()
{
// 获取默认的弹性管道
var pipeline = _resiliencePipelineProvider.GetPipeline("default");
// 使用弹性管道执行HTTP GET请求
var response = await pipeline
.ExecuteAsync(async ct => await _httpClient.GetAsync($"https://localhost:7187/weatherforecast", ct));
// 返回响应内容的字符串表示
return await response.Content.ReadAsStringAsync();
}
}
步骤 5. 在 Program.cs 中添加端点
app.MapGet("/weatherService/weather", async (WeatherService weatherService) =>
{
// 调用WeatherService的GetWeatherAsync方法,获取天气信息
var result = await weatherService.GetWeatherAsync();
// 返回结果
return result;
})
// 设置该端点的名称为 "GetWeather"
.WithName("GetWeather")
// 使该端点在OpenAPI文档中可见
.WithOpenApi();
步骤 6. 运行应用程序
最后,运行您的应用程序并导航到端点以查看弹性 HttpClient 的实际运行。
结论
通过执行这些步骤,您已使用 Microsoft.Extensions.Http.Resilience 库将弹性集成到 .NET 8 Web API 项目中。重试策略、断路器设置和超时将有助于确保您的 API 能够抵御瞬时故障,从而提高其可靠性和用户体验。