在 .NET 8 Web API 中实现弹性

在现代 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 能够抵御瞬时故障,从而提高其可靠性和用户体验。

相关推荐
陈逸子风6 天前
从0到1搭建权限管理系统系列四 .net8 中Autofac的使用(附源码)
vue3·webapi·权限·流程·表单
陈逸子风12 天前
从0到1搭建权限管理系统系列三 .net8 JWT创建Token并使用
vue3·webapi·权限·流程
陈逸子风17 天前
.net core8 使用JWT鉴权(附当前源码)
vue3·webapi·权限·流程
gc_229919 天前
测试ASP.NET Core的WebApi项目调用WebService
webapi·vs2022·webservice
陈逸子风23 天前
.net core8 使用Swagger(附当前源码)
vue3·webapi·权限·流程
ggtc1 个月前
大请求、请求超时问题
.net·sse·webapi·分块传输·范围请求
万雅虎1 个月前
使用Kiota工具生成WebApi的代理类,以及接口调用的简单体验
webapi·aspnetcore·kiota
yc_12242 个月前
配置更加美观的 Swagger UI
swagger·webapi·useknife4ui
ggtc2 个月前
首次在WebAPI中写单元测试
单元测试·webapi·xunit
4.0啊2 个月前
使用Django Rest Framework构建API
python·django·drf·webapi