MoneyTree.Resilience 1.1.1
MoneyTree.Resilience 弹性策略
概述
MoneyTree.Resilience 是 Microsoft.Extensions.Http.Resilience(.NET 10 满血版) 的轻量封装,提供流畅配置 API + 内置基础设施健康检查。
快速落地项目推荐使用
MoneyTree.ServiceDefaults——它整合了弹性策略 + 遥测 + 服务发现 + 健康检查端点,参考 MoneyTree.ServiceDefaults 文档。
| 属性 | 说明 |
|---|---|
| NuGet 包 | MoneyTree.Resilience |
| 依赖 | Microsoft.Extensions.Http.Resilience、MoneyTree.Core |
| 版本 | 1.1.0 |
v1.1.0 重要变更
| 移除 | 说明 |
|---|---|
ResiliencePipelineFactory |
使用 AddStandardResilienceHandler() 替代 |
ResilienceMiddleware / UseMoneyTreeResilience() |
无外部调用者 |
自定义 AddResilienceHandler |
使用 MS 原生 API |
ServiceDefaultsExtensions |
已迁移至独立项目 MoneyTree.ServiceDefaults |
向后兼容:AddMoneyTreeResilience(r => r.WithRetry(...)) API 不变。
项目文件结构
MoneyTree.Resilience/
├── MoneyTree.Resilience.csproj
├── Extensions/
│ ├── ResilienceBuilder.cs # 流畅配置构造器(薄封装 HttpStandardResilienceOptions)
│ └── ResilienceExtensions.cs # DI 注册入口
└── HealthChecks/
├── HealthCheckDelegates.cs # 四个具名委托类型定义
├── DatabaseHealthCheck.cs # 数据库健康检查
├── RedisHealthCheck.cs # Redis 健康检查
├── MessageQueueHealthCheck.cs # 消息队列健康检查
└── ConfigurationCenterHealthCheck.cs # 配置中心健康检查
快速开始
基础配置
using MoneyTree.Resilience.Extensions;
var builder = WebApplication.CreateBuilder(args);
// 使用默认配置(重试 3 次 + 超时 30s)
builder.Services.AddMoneyTreeResilience();
// 或自定义配置
builder.Services.AddMoneyTreeResilience(r =>
{
r.WithRetry(count: 3, baseDelaySeconds: 1)
.WithTimeout(seconds: 30)
.WithCircuitBreaker(
failureRatio: 0.5,
samplingDurationSeconds: 30,
breakDurationSeconds: 60);
});
HttpClient 弹性策略
使用 .NET 10 原生的 AddStandardResilienceHandler:
// 最简单方式:一行搞定重试 + 熔断 + 超时 + 舱壁
builder.Services.AddHttpClient("PaymentService", client =>
{
client.BaseAddress = new Uri("https://payment.example.com");
})
.AddStandardResilienceHandler();
// 自定义管道名称
builder.Services.AddHttpClient("InventoryService", client =>
{
client.BaseAddress = new Uri("https://inventory.example.com");
})
.AddResilienceHandler("inventory-pipeline", (pipeline, ctx) =>
{
// 读取 MoneyTree 注册的全局选项
var options = ctx.ServiceProvider
.GetRequiredService<IOptions<HttpStandardResilienceOptions>>()
.Value;
pipeline.AddRetry(new HttpRetryStrategyOptions
{
MaxRetryAttempts = options.Retry.MaxRetryAttempts,
BackoffType = DelayBackoffType.Exponential,
Delay = options.Retry.Delay
});
pipeline.AddTimeout(options.AttemptTimeout.Timeout);
});
v1.1.0 迁移说明:旧版自定义
.AddResilienceHandler("name")已移除,请直接使用微软原生的AddStandardResilienceHandler()或AddResilienceHandler("name", configure)。
健康检查
内置健康检查项
| 检查项 | 说明 | 激活委托类型 |
|---|---|---|
DatabaseHealthCheck |
检查数据库连接状态 | DatabaseHealthCheckDelegate |
RedisHealthCheck |
检查 Redis 连接状态 | RedisHealthCheckDelegate |
MessageQueueHealthCheck |
检查消息队列连接状态 | MessageQueueHealthCheckDelegate |
ConfigurationCenterHealthCheck |
检查配置中心连接状态 | ConfigurationCenterHealthCheckDelegate |
渐进式激活
四个健康检查默认返回 Healthy("未配置"),不影响 /health 端点状态。
通过 DI 注入对应的具名委托即可激活实际检测逻辑,各检查独立激活、互不干扰:
// 激活数据库健康检查
builder.Services.AddSingleton<DatabaseHealthCheckDelegate>(sp =>
{
var db = sp.GetRequiredService<AppDbContext>();
return async ct => await db.Database.CanConnectAsync(ct);
});
// 激活 Redis 健康检查
builder.Services.AddSingleton<RedisHealthCheckDelegate>(sp =>
{
var multiplexer = sp.GetRequiredService<IConnectionMultiplexer>();
return async ct => (await multiplexer.GetDatabase().PingAsync(ct)) != default;
});
// 激活消息队列健康检查
builder.Services.AddSingleton<MessageQueueHealthCheckDelegate>(sp =>
{
var connection = sp.GetRequiredService<IConnection>();
return async ct => connection.IsOpen;
});
// 激活配置中心健康检查
builder.Services.AddSingleton<ConfigurationCenterHealthCheckDelegate>(sp =>
{
var factory = sp.GetRequiredService<IHttpClientFactory>();
return async ct =>
{
var client = factory.CreateClient("HealthCheck");
var response = await client.GetAsync("/health", ct);
return response.IsSuccessStatusCode;
};
});
健康检查端点
app.MapHealthChecks("/health", new HealthCheckOptions
{
ResponseWriter = async (context, report) =>
{
context.Response.ContentType = "application/json";
var result = new
{
status = report.Status.ToString(),
checks = report.Entries.Select(e => new
{
name = e.Key,
status = e.Value.Status.ToString(),
description = e.Value.Description
}),
totalDuration = report.TotalDuration.TotalMilliseconds
};
await context.Response.WriteAsJsonAsync(result);
}
});
完整微服务配置示例
推荐使用
MoneyTree.ServiceDefaults作为一站式入口,见下方示例。 手动组合方式适用于需要精细控制每个模块的场景。
using MoneyTree.Resilience.Extensions;
var builder = WebApplication.CreateBuilder(args);
// 弹性策略 + 基础设施健康检查
builder.Services.AddMoneyTreeResilience(r =>
{
r.WithRetry(3, 1)
.WithTimeout(30)
.WithCircuitBreaker();
});
var app = builder.Build();
app.Run();
Showing the top 20 packages that depend on MoneyTree.Resilience.
| Packages | Downloads |
|---|---|
|
MoneyTree.ServiceDefaults
MoneyTree Framework 服务默认配置。快速落地项目的默认入口,集成弹性策略 + 健康检查 + 可选遥测/服务发现。
|
1 |
.NET 10.0
- MoneyTree.Core (>= 1.0.4)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Diagnostics.HealthChecks (>= 10.0.10)
- Microsoft.Extensions.Http.Resilience (>= 10.8.0)
- Microsoft.Extensions.Options (>= 10.0.10)