MoneyTree.Resilience 1.1.1

MoneyTree.Resilience 弹性策略

概述

MoneyTree.ResilienceMicrosoft.Extensions.Http.Resilience(.NET 10 满血版) 的轻量封装,提供流畅配置 API + 内置基础设施健康检查。

快速落地项目推荐使用 MoneyTree.ServiceDefaults——它整合了弹性策略 + 遥测 + 服务发现 + 健康检查端点,参考 MoneyTree.ServiceDefaults 文档

属性 说明
NuGet 包 MoneyTree.Resilience
依赖 Microsoft.Extensions.Http.ResilienceMoneyTree.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

Version Downloads Last updated
1.1.1 1 7/21/2026
1.0.3 1 7/12/2026