MoneyTree.CanaryRelease 1.0.0

MoneyTree.CanaryRelease 灰度发布

📋 概述

MoneyTree.CanaryRelease 提供渐进式灰度发布能力,支持多种流量分流策略(权重、用户哈希、租户、Header),以及热更新规则和指标对比功能,帮助团队实现安全、可控的版本发布。

属性 说明
NuGet 包 MoneyTree.CanaryRelease
外部依赖 MoneyTree.CoreMoneyTree.ConfigurationMoneyTree.Telemetry
定位 渐进式流量切换与灰度管理

🏗️ 项目文件结构

MoneyTree.CanaryRelease/
├── MoneyTree.CanaryRelease.csproj
├── GlobalUsings.cs
├── Abstractions/
│   ├── ITrafficSplitter.cs          # 流量分割器接口
│   └── ICanaryRuleStore.cs          # 灰度规则存储接口
├── Core/
│   ├── CanaryOptions.cs             # 灰度配置选项
│   ├── CanaryRule.cs                # 灰度规则模型
│   ├── CanaryContext.cs             # 灰度上下文
│   └── CanaryState.cs               # 灰度状态枚举
├── Strategies/
│   ├── WeightedTrafficSplitter.cs   # 权重分流策略
│   ├── UserHashTrafficSplitter.cs   # 用户哈希分流策略
│   ├── TenantTrafficSplitter.cs     # 租户分流策略
│   └── HeaderTrafficSplitter.cs     # Header 分流策略
├── Store/
│   ├── ConfigurationCenterRuleStore.cs  # 配置中心存储
│   └── InMemoryRuleStore.cs         # 内存存储
├── Middleware/
│   └── CanaryMiddleware.cs          # 灰度中间件
└── Extensions/
    ├── CanaryBuilder.cs             # 流畅配置构造器
    └── CanaryExtensions.cs          # DI 注册扩展

🚀 快速开始

基础配置(内存规则存储)

// Program.cs
using MoneyTree.CanaryRelease.Extensions;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddMoneyTreeCanaryRelease(c =>
{
    c.UseWeighted()
     .UseInMemoryStore();
});

var app = builder.Build();
app.UseMoneyTreeCanaryRelease();
app.Run();

使用配置中心存储(支持热更新)

builder.Services.AddMoneyTreeCanaryRelease(c =>
{
    c.UseUserHash()
     .UseConfigurationCenterStore("canary/rules");
});

🎯 分流策略

策略 说明 适用场景
权重分流 按百分比随机分流 通用灰度放量
用户哈希 同用户始终路由到同版本 需要用户体验一致性
租户分流 指定租户进入灰度 SaaS 多租户灰度
Header 分流 X-Canary: v2 标记进入灰度 内部测试、预发布验证

📋 配置灰度规则

在配置中心中按以下 JSON 格式配置灰度规则:

[
  {
    "name": "payment-v2-canary",
    "targetVersion": "2.0",
    "state": "Canarying",
    "trafficPercent": 20,
    "splitterType": "Weighted",
    "conditions": [
      { "type": "Header", "key": "X-Canary", "value": "true" },
      { "type": "Tenant", "key": "", "value": "tenant-001" }
    ]
  }
]

规则字段说明

字段 类型 说明
name string 规则名称
targetVersion string 灰度目标版本号
state CanaryState 灰度状态(Canarying/FullRollout/RolledBack)
trafficPercent int 灰度流量百分比(0-100)
splitterType SplitterType 分流策略类型
conditions array 附加条件列表

📈 灰度放量流程

标准放量流程:5% → 20% → 50% → 100%,每个阶段观测一段时间,无异常则扩大放量比例。

// 在管理后台或脚本中操作规则存储
var store = app.Services.GetRequiredService<ICanaryRuleStore>();

// 1. 创建规则,初始 5% 流量
await store.SaveRuleAsync(new CanaryRule
{
    Name = "order-v2",
    TargetVersion = "v2.0",
    State = CanaryState.Canarying,
    TrafficPercent = 5,
    SplitterType = SplitterType.Weighted
});

// 2. 扩大至 20%
var rule = await store.GetRuleAsync("order-v2");
rule!.TrafficPercent = 20;
await store.SaveRuleAsync(rule);

// 3. 全量发布
rule.State = CanaryState.FullRollout;
rule.FullRolloutAt = DateTime.UtcNow;
await store.SaveRuleAsync(rule);

// 4. 异常时回滚
rule.State = CanaryState.RolledBack;
await store.SaveRuleAsync(rule);

🔄 灰度状态说明

状态 说明
Canarying 灰度进行中,指定比例的流量路由到新版本
FullRollout 全量发布,所有流量切换到新版本
RolledBack 回滚到旧版本
Paused 暂停灰度,所有流量保持不变

📊 指标对比

结合 MoneyTree.Telemetry 模块,可在灰度期间实时对比新旧版本的错误率、响应延迟等关键指标,辅助放量决策。

No packages depend on MoneyTree.CanaryRelease.

Version Downloads Last updated
1.0.0 1 7/12/2026