Mud.HttpUtils.Resilience
2.0.0-rc2
dotnet add package Mud.HttpUtils.Resilience --version 2.0.0-rc2
NuGet\Install-Package Mud.HttpUtils.Resilience -Version 2.0.0-rc2
<PackageReference Include="Mud.HttpUtils.Resilience" Version="2.0.0-rc2" />
<PackageVersion Include="Mud.HttpUtils.Resilience" Version="2.0.0-rc2" />
<PackageReference Include="Mud.HttpUtils.Resilience" />
paket add Mud.HttpUtils.Resilience --version 2.0.0-rc2
#r "nuget: Mud.HttpUtils.Resilience, 2.0.0-rc2"
#:package Mud.HttpUtils.Resilience@2.0.0-rc2
#addin nuget:?package=Mud.HttpUtils.Resilience&version=2.0.0-rc2&prerelease
#tool nuget:?package=Mud.HttpUtils.Resilience&version=2.0.0-rc2&prerelease
Mud.HttpUtils.Resilience
概述
Mud.HttpUtils.Resilience 是 Mud.HttpUtils 的弹性策略层,基于 Polly 提供重试、超时、熔断策略,通过装饰器模式增强 IEnhancedHttpClient。
目标框架
netstandard2.0net6.0net8.0net10.0
包含内容
核心类
| 类 | 说明 |
|---|---|
ResilientHttpClient |
IEnhancedHttpClient 的弹性装饰器,组合重试/超时/熔断策略 |
PollyResiliencePolicyProvider |
基于 Polly 的策略提供器,根据 ResilienceOptions 创建策略 |
HttpRequestMessageCloner |
HTTP 请求消息克隆工具,确保重试安全 |
ResilienceOptions |
弹性策略配置选项 |
IResiliencePolicyProvider |
弹性策略提供器接口,支持自定义策略实现 |
策略组合顺序
组合策略执行顺序:重试(外层) → 熔断 → 超时(内层)
- 每次请求先经过超时策略限制
- 超时的请求会被熔断器统计
- 重试策略在所有内层策略之外
请求克隆与大小限制
HttpRequestMessageCloner 用于在重试时克隆请求消息(因为 HttpRequestMessage 不可重用)。新增内容大小限制功能:
// 默认最大克隆大小为 10MB
public const long DefaultMaxContentSize = 10 * 1024 * 1024;
// 克隆时检查大小
var cloned = await HttpRequestMessageCloner.CloneAsync(request, maxContentSize: 10 * 1024 * 1024);
当请求体大小超过
MaxCloneContentSize时,ResilientHttpClient会自动跳过重试策略,避免克隆大请求体的性能开销。适用于大文件上传等场景。
重试回调机制
RetryOptions 提供 OnRetry 属性,支持在每次重试前执行自定义逻辑:
services.AddMudHttpUtils("myApi", "https://api.example.com", options =>
{
options.Retry.MaxRetryAttempts = 3;
options.Retry.OnRetry = async (exception, retryCount, delay) =>
{
Console.WriteLine($"第 {retryCount} 次重试,延迟 {delay.TotalMilliseconds}ms,异常: {exception?.Message}");
};
});
OnRetry签名为Func<Exception?, int, TimeSpan, Task>,参数分别为:触发的异常(可能为 null)、重试次数(从 1 开始)、下次重试前的延迟时间。可用于日志记录、指标收集、动态调整重试策略等。
配置选项
ResilienceOptions
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
Retry |
RetryOptions |
— | 重试策略配置 |
Timeout |
TimeoutOptions |
— | 超时策略配置 |
CircuitBreaker |
CircuitBreakerOptions |
— | 熔断策略配置 |
MaxCloneContentSize |
long |
10485760 (10MB) |
请求克隆的最大内容大小(字节),-1 表示不限制 |
RetryOptions
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
Enabled |
bool |
true |
是否启用重试策略 |
MaxRetryAttempts |
int |
3 |
最大重试次数 |
DelayMilliseconds |
int |
1000 |
基础延迟时间(毫秒) |
UseExponentialBackoff |
bool |
true |
是否使用指数退避 |
RetryStatusCodes |
int[] |
[408, 429, 500, 502, 503, 504] |
触发重试的 HTTP 状态码 |
OnRetry |
Func<Exception?, int, TimeSpan, Task>? |
null |
重试回调函数 |
TimeoutOptions
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
Enabled |
bool |
true |
是否启用超时策略 |
TimeoutSeconds |
int |
30 |
超时时间(秒) |
CircuitBreakerOptions
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
Enabled |
bool |
false |
是否启用熔断策略 |
FailureThreshold |
int |
5 |
触发熔断的阈值(含义取决于 SamplingDurationSeconds) |
BreakDurationSeconds |
int |
30 |
熔断持续时间(秒) |
SamplingDurationSeconds |
int |
0 |
采样窗口时间(秒),大于 0 时启用高级熔断策略 |
MinimumThroughput |
int |
10 |
采样窗口内最小请求数(仅高级熔断策略生效) |
熔断模式说明:
- 当
SamplingDurationSeconds = 0(默认)时,使用简单熔断策略,FailureThreshold表示连续失败次数- 当
SamplingDurationSeconds > 0时,使用高级熔断策略,FailureThreshold表示采样窗口内的失败率百分比(1-100)
安装
<PackageReference Include="Mud.HttpUtils.Resilience" Version="x.x.x" />
使用方式
代码配置
services.AddMudHttpResilienceDecorator(options =>
{
// 重试策略
options.Retry.Enabled = true;
options.Retry.MaxRetryAttempts = 3;
options.Retry.DelayMilliseconds = 1000;
options.Retry.UseExponentialBackoff = true;
options.Retry.RetryStatusCodes = [408, 429, 500, 502, 503, 504];
options.Retry.OnRetry = async (ex, retryCount, delay) =>
{
logger.LogWarning("HTTP 请求重试 {RetryCount},延迟 {Delay}ms", retryCount, delay.TotalMilliseconds);
};
// 超时策略
options.Timeout.Enabled = true;
options.Timeout.TimeoutSeconds = 30;
// 熔断策略
options.CircuitBreaker.Enabled = true;
options.CircuitBreaker.FailureThreshold = 5;
options.CircuitBreaker.BreakDurationSeconds = 30;
// 请求克隆大小限制
options.MaxCloneContentSize = 10 * 1024 * 1024; // 10MB
});
配置文件绑定
services.AddMudHttpResilienceDecorator(configuration, "MudHttpResilience");
对应 appsettings.json:
{
"MudHttpResilience": {
"MaxCloneContentSize": 10485760,
"Retry": {
"Enabled": true,
"MaxRetryAttempts": 3,
"DelayMilliseconds": 1000,
"UseExponentialBackoff": true,
"RetryStatusCodes": [408, 429, 500, 502, 503, 504]
},
"Timeout": {
"Enabled": true,
"TimeoutSeconds": 30
},
"CircuitBreaker": {
"Enabled": true,
"FailureThreshold": 5,
"BreakDurationSeconds": 30
}
}
}
高级熔断策略(基于采样窗口的失败率模式):
{
"CircuitBreaker": {
"Enabled": true,
"FailureThreshold": 50,
"BreakDurationSeconds": 30,
"SamplingDurationSeconds": 60,
"MinimumThroughput": 10
}
}
高级模式下
FailureThreshold = 50表示采样窗口内失败率达 50% 时触发熔断,至少需要MinimumThroughput次请求。
一站式注册
services.AddMudHttpUtils("myApi", "https://api.example.com", options =>
{
options.Retry.MaxRetryAttempts = 3;
options.Timeout.TimeoutSeconds = 30;
options.MaxCloneContentSize = 5 * 1024 * 1024; // 5MB
});
大文件上传场景
对于大文件上传等场景,建议禁用重试或增大克隆限制:
// 方式一:增大克隆限制
options.MaxCloneContentSize = 100 * 1024 * 1024; // 100MB
// 方式二:禁用重试
options.Retry.Enabled = false;
// 方式三:不限制(不推荐)
options.MaxCloneContentSize = -1;
当请求体大小超过
MaxCloneContentSize时,ResilientHttpClient会记录警告日志并跳过重试,直接发送请求。
DI 服务注册方法
| 方法 | 说明 |
|---|---|
AddMudHttpResilience(configureOptions) |
仅注册策略服务(不装饰客户端) |
AddMudHttpResilience(configuration, sectionPath) |
从配置绑定策略 |
AddMudHttpResilienceDecorator(configureOptions) |
注册装饰器,为 IEnhancedHttpClient 添加弹性策略 |
AddMudHttpResilienceDecorator(configuration, sectionPath) |
从配置绑定的装饰器注册 |
AddMudHttpUtils(clientName, configureHttpClient, configureResilienceOptions) |
一站式注册 Client + Resilience |
AddMudHttpUtils(clientName, configureHttpClient, enableResilience) |
一站式注册,可选是否启用弹性策略 |
AddMudHttpUtils(clientName, baseAddress, configureResilienceOptions) |
带基础地址的一站式注册 |
AddMudHttpUtils(clientName, baseAddress, enableResilience) |
带基础地址的一站式注册,可选是否启用弹性策略 |
AddMudHttpUtils(clientName, configuration, configureHttpClient, sectionPath) |
从配置绑定弹性策略的一站式注册 |
AddMudHttpUtils(clientName, configureEncryption, configureHttpClient, configureResilienceOptions) |
带 AES 加密的一站式注册 |
注意:
AddMudHttpResilienceDecorator必须在AddMudHttpClient之后调用。
依赖项
| 包 | 说明 |
|---|---|
Mud.HttpUtils.Abstractions |
接口定义 |
Mud.HttpUtils.Client |
客户端实现(装饰器目标) |
Polly |
弹性策略库 |
Microsoft.Extensions.Logging.Abstractions |
日志抽象 |
Microsoft.Extensions.Options |
选项模式 |
设计原则
- 装饰器模式:
ResilientHttpClient装饰IEnhancedHttpClient,不修改原始实现 - 策略组合:通过 Polly PolicyWrap 组合多种策略,执行顺序可控
- 安全重试:通过
HttpRequestMessageCloner克隆请求消息,确保重试安全 - 性能保护:通过
MaxCloneContentSize限制克隆大小,避免大请求体的克隆开销 - 可观测性:通过
OnRetry支持自定义重试回调,便于日志记录和指标收集 - 配置灵活:支持代码配置和配置文件绑定
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Microsoft.Extensions.Configuration.Abstractions (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.2)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.3)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 8.0.0)
- Mud.HttpUtils.Abstractions (>= 2.0.0-rc2)
- Mud.HttpUtils.Client (>= 2.0.0-rc2)
- Polly (>= 8.6.6)
- System.Threading.Tasks.Extensions (>= 4.6.3)
-
net10.0
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.7)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.7)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.7)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.7)
- Mud.HttpUtils.Abstractions (>= 2.0.0-rc2)
- Mud.HttpUtils.Client (>= 2.0.0-rc2)
- Polly (>= 8.6.6)
-
net6.0
- Microsoft.Extensions.Configuration.Abstractions (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.2)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.3)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 8.0.0)
- Mud.HttpUtils.Abstractions (>= 2.0.0-rc2)
- Mud.HttpUtils.Client (>= 2.0.0-rc2)
- Polly (>= 8.6.6)
-
net8.0
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.7)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.7)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.7)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.7)
- Mud.HttpUtils.Abstractions (>= 2.0.0-rc2)
- Mud.HttpUtils.Client (>= 2.0.0-rc2)
- Polly (>= 8.6.6)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Mud.HttpUtils.Resilience:
| Package | Downloads |
|---|---|
|
Mud.HttpUtils
Mud HttpUtils 元包,自动引用 Abstractions、Attributes、Client 和 Resilience 子模块。 |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.0.0-rc2 | 125 | 5/13/2026 |
| 2.0.0-rc1 | 483 | 5/9/2026 |
| 2.0.0-preview6 | 125 | 5/6/2026 |
| 2.0.0-preview5 | 108 | 5/3/2026 |
| 2.0.0-preview4 | 142 | 4/30/2026 |
| 2.0.0-preview3 | 398 | 4/29/2026 |
| 2.0.0-preview2 | 116 | 4/28/2026 |
| 2.0.0-preview1 | 86 | 4/27/2026 |