netcore AddResiliencePipeline 请求重试机制 代替 polly

using System;
using System.Net.Http;
using Microsoft.Extensions.DependencyInjection;
using Polly;
using Polly.Retry;
using System.Net.Http.Json;
using System.Threading.Tasks;
using System.Threading.RateLimiting;
using Microsoft.Extensions.Resilience;
using Microsoft.Extensions.Resilience.FaultInjection;
using Microsoft.Extensions.Resilience.Options;

var builder = WebApplication.CreateBuilder(args);

// 配置 Resilience Pipeline
builder.Services.AddResiliencePipeline("default", pipelineBuilder =>
{
    // 添加重试策略
    pipelineBuilder.AddRetry(new RetryStrategyOptions
    {
        // 设置应处理的异常类型:这里处理所有 Exception 类型
        ShouldHandle = new PredicateBuilder().Handle<Exception>(),

        // 延迟时间:第一次重试后等待 2 秒
        Delay = TimeSpan.FromSeconds(2),

        // 最大重试次数:最多重试 2 次(总共最多尝试请求 3 次)
        MaxRetryAttempts = 2,

        // 退避策略类型:使用指数退避(每次重试等待时间呈指数增长)
        BackoffType = DelayBackoffType.Exponential,

        // 使用抖动(Jitter):避免所有客户端同时重试从而导致雪崩
        UseJitter = true
    });
});

// 配置 HttpClient 并关联 Resilience Pipeline
builder.Services.AddHttpClient("MyHttpClient", client =>
{
    client.BaseAddress = new Uri("https://api.example.com/");
})
// 将 Resilience Pipeline 应用于 HttpClient
.AddResilienceHandler("default");

var app = builder.Build();

app.MapGet("/call-api", async (IHttpClientFactory httpClientFactory) =>
{
    var client = httpClientFactory.CreateClient("MyHttpClient");

    try
    {
        var response = await client.GetAsync("/data");
        response.EnsureSuccessStatusCode();

        var content = await response.Content.ReadAsStringAsync();
        return Results.Ok(content);
    }
    catch (Exception ex)
    {
        return Results.Problem($"请求失败:{ex.Message}");
    }
});

app.Run();

作者:spike

分类: Net

创作时间:2025-04-18

更新时间:2025-04-21

联系方式放在中括号之中例如[[email protected]],回复评论在开头加上标号例如:#1