MoneyTree.CanaryRelease 1.0.0
MoneyTree.CanaryRelease 灰度发布
📋 概述
MoneyTree.CanaryRelease 提供渐进式灰度发布能力,支持多种流量分流策略(权重、用户哈希、租户、Header),以及热更新规则和指标对比功能,帮助团队实现安全、可控的版本发布。
| 属性 | 说明 |
|---|---|
| NuGet 包 | MoneyTree.CanaryRelease |
| 外部依赖 | MoneyTree.Core、MoneyTree.Configuration、MoneyTree.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.
.NET 10.0
- MoneyTree.Core (>= 1.0.0)
- Microsoft.AspNetCore.Http.Abstractions (>= 2.3.10)
- Microsoft.Extensions.Configuration (>= 10.0.8)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.8)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.8)
- Microsoft.Extensions.Options (>= 10.0.8)
| Version | Downloads | Last updated |
|---|---|---|
| 1.0.0 | 1 | 7/12/2026 |