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();