当前位置: 首页 > news >正文

OpenFeature 标准在 ABP vNext 的落地

🚀 OpenFeature 标准在 ABP vNext 的落地


📚 目录

  • 🚀 OpenFeature 标准在 ABP vNext 的落地
    • 0. 摘要(TL;DR)✨
      • 🗺️ 架构总览
    • 1. 为什么选 OpenFeature 🔧
    • 2. 工程脚手架与依赖 📦
    • 3. ABP 集成设计(DI & 请求级 Transaction Context)🏗️
      • 3.1 Program.cs(最小可运行骨架)
      • 3.2 请求中间件(设置并清理上下文)
      • 🔄 请求生命周期
    • 4. flagd 配置与级联覆盖/灰度 🧩
      • 🎯 目标规则判定
    • 5. 本地运行与热更新 🧰
      • 5.1 Docker 一行命令
      • 5.2 Docker Compose(推荐,便于版本化)
    • 6. 业务门面(强类型评估 API)🧩
    • 7. 高可用:Polly v8 + 分布式缓存 + 默认值 + ABP 兜底 🛡️
      • 7.1 缓存项用类类型(便于序列化/观测/多租户键)
      • 7.2 装饰器:为业务门面叠加韧性与缓存
      • 🧭 韧性管线图
    • 8. Provider 事件与可观测性(Hook/Tracking/OTel)📈
      • 8.1 Provider 事件(就绪/错误/配置变化)
      • 8.2 Hook 与 Tracking(前置条件⚠️)
    • 9. 测试与复现(Testcontainers 起 flagd)🧪
      • 🧭 CI 流程
    • 10. 安全与合规 🔒
    • 11. 部署与运维 ☁️
    • 12. 常见坑位清单 ⚠️


0. 摘要(TL;DR)✨

在 ABP vNext(.NET 8)中接入 OpenFeature .NET SDK,用统一的评估 API 读取特性开关;后端通过 Provider 对接 flagd / LaunchDarkly / Flipt 等系统,实现可插拔、零侵入
本方案覆盖:多租户上下文tenantId/userId/plan/region/targetingKey)、热更新/灰度Polly v8 韧性(超时/重试/断路/回退)+ 分布式缓存事件与可观测性(Hook/Tracking/OTel),并提供可复现的最小代码与 flags.json/Docker 配置。🧪

🗺️ 架构总览

ABP vNext 应用
flag def/targeting
可替换
可替换
Controller / AppService
IFeatureService 门面
SafeFeatureService (Polly+Cache)
OpenFeature Client
Provider 可插拔
flagd
LaunchDarkly
Flipt

1. 为什么选 OpenFeature 🔧

  • 统一 API,后端可插拔:业务只依赖 OpenFeature;更换平台仅替换 Provider。

  • 分工明确

    • 运行时评估/实验/跨生态 → OpenFeature(业务读开关)。
    • 治理/权限/后台配置 → ABP Feature(IFeatureChecker[RequiresFeature])。
  • 生态:开源 flagd(轻量、JsonLogic 规则、确定性分桶)、LaunchDarkly(成熟 SaaS)、Flipt(开源自托管)。🎯


2. 工程脚手架与依赖 📦

目标:.NET 8 + ABP vNext(ASP.NET Core)

dotnet add package OpenFeature
dotnet add package OpenFeature.DependencyInjection    # 实验性
dotnet add package OpenFeature.Hosting                # 实验性
dotnet add package OpenFeature.Contrib.Providers.Flagd
dotnet add package Polly                              # v8
dotnet add package Scrutor                            # 用于 services.Decorate 装饰器

🔔 提示:OpenFeature.DependencyInjection / OpenFeature.Hosting实验性集成,升级需关注变更说明。


3. ABP 集成设计(DI & 请求级 Transaction Context)🏗️

3.1 Program.cs(最小可运行骨架)

using OpenFeature;
using OpenFeature.DependencyInjection.Providers.Flagd;
using Volo.Abp;
using Volo.Abp.Modularity;var builder = WebApplication.CreateBuilder(args);// 1) OpenFeature + flagd Provider(托管生命周期)
builder.Services.AddOpenFeature(cfg =>
{cfg.AddHostedFeatureLifecycle() // 实验性:由宿主管理 Provider 的初始化/关闭.AddFlagdProvider(o =>{// 可用配置或环境变量 FLAGD_HOST/FLAGD_PORTo.Host = builder.Configuration["Flagd:Host"] ?? "localhost";o.Port = int.Parse(builder.Configuration["Flagd:Port"] ?? "8013");});
});// 2) Transaction Context 传播器(基于 AsyncLocal)
Api.Instance.SetTransactionContextPropagator(new AsyncLocalTransactionContextPropagator());// 3) 请求中间件:构造/设置/清理 EvaluationContext
builder.Services.AddTransient<OpenFeatureContextMiddleware>();// 4) 业务门面与装饰器(Scoped,避免把 Scoped 依赖注入到单例)
builder.Services.AddScoped<IFeatureService, FeatureService>();
builder.Services.Decorate<IFeatureService, SafeFeatureService>(); // 叠加韧性与缓存var app = builder.Build();
app.UseMiddleware<OpenFeatureContextMiddleware>(); // 放在认证之后更佳
app.MapGet("/", () => "ok");
app.Run();

3.2 请求中间件(设置并清理上下文)

using Volo.Abp.MultiTenancy;
using Volo.Abp.Users;public class OpenFeatureContextMiddleware : IMiddleware
{private readonly ICurrentTenant _tenant;private readonly ICurrentUser _user;private readonly ILogger<OpenFeatureContextMiddleware> _logger;public OpenFeatureContextMiddleware(ICurrentTenant tenant, ICurrentUser user, ILogger<OpenFeatureContextMiddleware> logger){_tenant = tenant;_user = user;_logger = logger;}public async Task InvokeAsync(HttpContext ctx, RequestDelegate next){var tenantId = _tenant.Id?.ToString() ?? "host";var userId   = _user.Id?.ToString() ?? "anonymous";var region   = ctx.Request.Headers["X-Region"].FirstOrDefault() ?? "ap-sg";var plan     = ctx.Request.Headers["X-Plan"].FirstOrDefault() ?? await ResolveTenantPlanAsync(_tenant);// targetingKey:稳定分桶键(建议:tenantId:userId)var evalCtx = EvaluationContext.Builder().Set("tenantId", tenantId).Set("userId",   userId)
http://www.dtcms.com/a/394381.html

相关文章:

  • Agentic AI 多智能体协作:开发实战、框架选型与踩坑指南
  • [优选算法专题三二分查找——NO.17二分查找]
  • 一文学会c++哈希
  • 【06】EPGF 架构搭建教程之 本地环境管理工具的本地化
  • 【开发实践】DNS 报文分析与 CDN 架构可视化方案
  • Ubuntu 系统下 Nginx + PHP 环境搭建教程
  • AI 如何改变日常生活
  • 字典树 Trie 介绍、实现、封装与模拟 C++STL 设计
  • 第一性原理(First Principles Thinking)
  • 1.UE-准备环境(一)-账号注册和打开虚幻引擎源码页面
  • javascript `AbortController`
  • 时间复杂度与空间复杂度
  • rocketmq队列和消费者关系
  • RAG评估指南:从核心指标到开源框架,打造高效检索生成系统
  • xtuoj 0x05-A 前缀和
  • 防误删 (实时) 文件备份系统 (btrfs 快照 + rsync)
  • 【FreeRTOS】第七课(1):任务间通信(使用队列)
  • OD C卷 - 二叉树计算
  • DiffDock 环境安装和使用教程
  • NVIC中的不可屏蔽中断NMI(Non-Maskable Interrupt)是什么?
  • TypeORM 浅析
  • 2.4 死锁 (答案见原书 P165)
  • 算法与数据结构:常见笔试题总结
  • trae使用playwright MCP方法流程
  • anaconda安装tensorflow遇到的一个错误
  • 不同浏览器对 http.server 提供MP4 文件支持差异分析
  • Python 实战:内网渗透中的信息收集自动化脚本(10)
  • leetcode 206 反转链表
  • AI智能的网站SEO优化服务商
  • 生产者客户端