配置中心 App Configuration (二):Feature Flag 功能开关特性

94d513530675a43057dcda8376f9f054.png


写在前面

Web服务开发过程中我们经常有这样的需求:

  • 某些功能我必须我修改了配置才启用,比如新用户注册送券等;

  • 某个功能需到特定的时间才启用,过后就失效,比如春节活动等;

  • 某些功能,我想先对10%的用户开放,验证没问题后再逐步全量开放等;

这就是功能开关。

日常开发中功能开关我们一般是写到配置文件里的,根据不同的配置,做不同的逻辑;但,其实.net core是对功能开关有官方支持的,但因为跟Azure集成比较好所以文档不在.net core的文档里面,而是在Azure的文档这边:

https://docs.microsoft.com/en-us/azure/azure-app-configuration/

Asp.net Core中集成

Asp.net Core的功能开关(Feature Flag)是直接仅根据配置文件方式使用,和集成Azure配置中心使用的;我们来看看区别;

本地配置文件方式

1、先安装包

install-package Microsoft.FeatureManagement.AspNetCore

2、注入服务(net6)

builder.Services.AddFeatureManagement();

3、配置文件写几个配置

appsettings.json

"FeatureManagement": { //简单功能开关"Beta": true,"v1": true,"v2": true,}

以上配置对应以下的枚举:

public enum MyFeatureFlags{Beta,V1,V2,PercentageFlag,TimeWindowFlag,CustomFeatureFlag}

其实不用枚举,直接用字符串也是可以的;

4、使用功能开关

1、创建一个FeatureFlagController;

注入服务:

private readonly IFeatureManager _featureManager;public FeatureFlagController(IFeatureManager featureManager)
{_featureManager = featureManager;
}

简单功能开关:

/// <summary>
/// 当启用beta版本的时候接口有效
/// </summary>
/// <returns></returns>
[FeatureGate(MyFeatureFlags.Beta)]
[HttpGet]
public async Task<IActionResult> Beta()
{var beta = await _featureManager.IsEnabledAsync(nameof(MyFeatureFlags.Beta));if (beta){//beta版本特有逻辑}return Success("Beta", beta); //这里Success是封装的,大家可以改成返回Ok()
}/// <summary>
/// 当启用v1版本的时候接口有效
/// </summary>
/// <returns></returns>
[FeatureGate(MyFeatureFlags.V1)]
[HttpGet]
public async Task<IActionResult> V1()
{return Success("V1");
}/// <summary>
/// 当启用v2版本的时候接口有效
/// </summary>
/// <returns></returns>
[FeatureGate(MyFeatureFlags.V2)]
[HttpGet]
public async Task<IActionResult> V2()
{return Success("V2");
}

由于我们上面的配置都是开启的:

...
//简单功能开关
"Beta": true,
"v1": true,
"v2": true,

可以看到:

c95cd7eb11eb81c354fa9594cd632d1b.png
image-20220804104253051

接口都可以访问,我们把v1改成false试试:

f2560d077337208c87cb231679268d6c.png
image-20220804104401620

马上404了,这里清晰的看到,功能开关在多版本Api上线下某个版本时候确实方便;

基于过滤器的功能开关:

基于过滤器的功能开关是有一定逻辑的功能开关;

a、百分率功能开关
/// <summary>
/// 启用百分率的功能开关
/// </summary>
/// <returns></returns>
[FeatureGate(MyFeatureFlags.PercentageFlag)]
[HttpGet]
public async Task<IActionResult> PercentageFlag()
{return Success("PercentageFlag");
}
builder.Services.AddFeatureManagement().AddFeatureFilter<PercentageFilter>();

添加配置:

FeatureManagement节点下:

//百分率功能开关
"PercentageFlag": {"EnabledFor": [{"Name": "Percentage","Parameters": {"Value": 30}}]
},

这里的配置参数值代表30%的概率启用次功能,我们试试:

578e62500574e6d07ed99536b4b1c4ed.png
image-20220804105858780

分别是不启用,和启用状态;

b、时间窗口功能开关
/// <summary>
/// 启用时间窗口的功能开关
/// </summary>
/// <returns></returns>
[FeatureGate(MyFeatureFlags.TimeWindowFlag)]
[HttpGet]
public async Task<IActionResult> TimeWindowFlag()
{return Success("TimeWindowFlag");
}
builder.Services.AddFeatureManagement().AddFeatureFilter<TimeWindowFilter>();

添加配置:

//时间窗口功能开关
"TimeWindowFlag": {"EnabledFor": [{"Name": "TimeWindow","Parameters": {"Start": "2022/08/03 08:00:00 +00:00", //这里是UTC时间"End": "2022/08/03 09:00:00 +00:00"}}]
},

这个开关在2022年8月3日 下午16时(北京时间)和17时这个世界窗口内才启用;对应的:

Start:就是生效时刻;

End:失效时刻;

c、自定义功能开关

ok,以上都是系统内置的功能开关,我们来根据自己需求创建一个自定义的;

需求:某个功能只有在客户端是手机或者平板的情况下启用,pc端不启用;

创建一个自定义功能开关过滤器类CustomFeatureFilter

[FilterAlias("CustomFeature")]
public class CustomFeatureFilter : IFeatureFilter
{private readonly IHttpContextAccessor _httpContextAccessor;public CustomFeatureFilter(IHttpContextAccessor httpContextAccessor){_httpContextAccessor = httpContextAccessor;}public Task<bool> EvaluateAsync(FeatureFilterEvaluationContext context){//这里参数模拟平台,实际业务会有实际业务的逻辑var platform = _httpContextAccessor.HttpContext.Request.Query["platform"].ToString();var allowPlatform = context.Parameters.Get<CustomFeatureFilterSettings>();return Task.FromResult(allowPlatform.AllowedPlatforms.Any(c => c == platform));}
}public class CustomFeatureFilterSettings
{public string[] AllowedPlatforms { get; set; }
}
/// <summary>
/// 自定义功能开关
/// </summary>
/// <returns></returns>
[FeatureGate(MyFeatureFlags.CustomFeatureFlag)]
[HttpGet]
public async Task<IActionResult> CustomFeatureFlag(string platform)
{return Success("CustomFeatureFlag");
}
builder.Services.AddFeatureManagement().AddFeatureFilter<CustomFeatureFilter>();

添加配置:

//自定义功能开关
"CustomFeatureFlag": {"EnabledFor": [{"Name": "CustomFeature","Parameters": {"AllowedPlatforms": [ //这里配置运行启用功能的平台"phone","pad"//"pc"]}}]
}

我们来测测:

d08601fd1319df08e46d7f024b8935e7.png
image-20220804111012239

可以看到仅在设置运行的平台下启用,验证ok;

集成Azure配置中心App Configuration方式

1、添加配置:

"ConnectionStrings": {"AppConfig": "<your app connection string>"},

具体可参考我之前的文章:《微软Azure配置中心 App Configuration (一):轻松集成到Asp.Net Core》

2、启用Azure功能开关:

var connectionString = builder.Configuration.GetConnectionString("AppConfig");builder.Host.ConfigureAppConfiguration((hostingContext, config) =>
{//配置不同功能config.AddAzureAppConfiguration(options =>{启用功能开关特性options.Connect(connectionString)//启用功能开关特性.UseFeatureFlags(options =>{options.CacheExpirationInterval = TimeSpan.FromSeconds(30); //配置FeatureFlag缓存本地时间(默认就是30)});});
});

UseFeatureFlags启用后,本地配置文件的方式失效;

builder.Services.AddAzureAppConfiguration(); //注入服务

3、在Azure 配置中心后台配置好功能开关(代替本地配置文件)

基本功能开关配置

创建配置:

4b707dce557130ffa58431a41fbe1188.png
image-20220804115402160

填写配置信息:

7db79b7961af2fe1421d8ca9ed84b79a.png
image-20220804122451808

OK,以上是基本的配置,配置好后可以直接在列表页面勾选启用配置与否:

4e6c45bdde1591d4f36f102d431b6ab7.png
image-20220804123400869

基于过滤器的开关配置

百分率功能开关

0e8f7cfd3aa435ed7301ab1ebfd2b256.png
image-20220804123721457

时间窗口功能开关

66bea77aa4cde4c3e2937f261b7a800f.png
image-20220804123801220

这里的Start date,和Expiry date,就对应前面配置文件的Start,End;

自定义功能开关

74fd1916694f69c685b0bd9ecb43d01f.png
image-20220804123835703

这里的过滤器的**Name:**CustomFeature ,要跟代码标签 [FilterAlias("CustomFeature")]一致;

AllowedPlatforms:也要跟代码里面的配置一致,["phone","pad"]这个是数组的写法;

总结

1、启用集成到Azure的UseFeatureFlags后,本地配置文件的方式失效;

2、Azure这套功能开关还是有可选之处的,我尤其喜欢其接口标签[FeatureGate];

另外定义了的标准配置项,与Azure配置中心无缝集成,香。

源码

https://github.com/gebiWangshushu/Hei.Azure.Test

[参考]

https://docs.microsoft.com/en-us/azure/azure-app-configuration/overview

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

联想(Lenovo)小新310经典版进bios方法

1&#xff0c;找到novo按钮。 2&#xff0c;在关机的状态下桶一下小孔&#xff0c;不用任何操作&#xff0c;电脑进入bios选择界面。转载于:https://www.cnblogs.com/senior-engineer/p/6761457.html

C#中的匿名类型

这节来讲一下C#中的匿名类型。匿名类在C#中&#xff0c;我们可以不去显示的声明一个类&#xff0c;而是通过匿名类去临时声明一个类结构去帮助我们去完成一些功能。声明一个匿名类&#xff0c;我们可以像下面这样做&#xff1a;var Anonymousnew {name"charles",year…

MySQL之MHA高可用集群

目录 一、MHA概述 1.1.MHA 是什么 1.2.MHA 的组成 1.3.MHA 的特点 二、MHA搭建准备 2.1.实验思路 三、MHA搭建 3.1配置主从复制 3.2.安装 MHA 软件 3.3.故障模拟 3.4.故障修复 四、总结 一、MHA概述 1.1.MHA 是什么 1.MHA&#xff08;MasterHigh Availability&…

配置中心 App Configuration (一):轻松集成到Asp.Net Core

写在前面在日常开发中&#xff0c;我这边比较熟悉的配置中心有&#xff0c;携程Apollo&#xff0c;阿里Nacos(配置中心&#xff0c;服务治理一体)之前文章&#xff1a;Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触总体来说&#xff0c;Apollo和Nacos社区都比较活跃&#…

详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] good

目录 前言现象源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口的具体应用常用HandlerMethodArgumentResolver介绍常用HandlerMethodReturnValueHandler介绍本文开头现象…

对不起,我不是一个自律的人

大家好&#xff0c;我是 &#x1f41f;&#x1f4a8;。前天&#xff0c;星球 的一位大学生朋友问了我几个问题&#xff1a;你大学时如何安排每日的时间&#xff1f;为什么能学那么多技术&#xff1f;你会学习到很晚吗&#xff1f;你是如何保持自律的&#xff1f;我觉得这几个问…

保证接口数据安全的10种方案

前言 大家好&#xff0c;我是程序汪&#xff0c;互联网项目需要特别注意数据安全&#xff0c;如果你简历上是互联网类型项目&#xff0c;安全方面肯定要能说出个一二三&#xff0c;下面分享下这方面的干货&#xff0c;大家可以记住几条&#xff0c;面试时好说道说道 我们日常…

Html5本地存储LocalStorage

HTML5 提供了两种在客户端存储数据的新方法&#xff1a; localStorage - 没有时间限制的数据存储sessionStorage - 针对一个 session 的数据存储在浏览器中打开审查元素&#xff08;如谷歌F12&#xff09;&#xff0c;在Resources下面可以查看里面的数据。 localStorage提供了几…

java第一季2.2

2019独角兽企业重金招聘Python工程师标准>>> 标识符&#xff1a; 是给变量类方法命名的符号、标识符开头可以_、字母、$命名&#xff0c;不可以用数字命名。关键字不可命名&#xff0c;大小写区分。不可以用非法字符 变量&#xff1a;变量类型。变量名。变量值。如&…

读《华为数字化转型之道》

数字化转型应该很多人都听过&#xff0c;但如果你做过 ToB 软件&#xff0c;听得更多的是信息化&#xff0c;那信息化和数字化是什么关系呢&#xff1f;下面用一个小例子来说说我的理解。记得刚上初中的时候&#xff0c;平时测验、考试的试卷&#xff0c;都是人工在板上进行刻写…

Thrift基本原理及使用

参考文章RPC 基本原理与 Apach Thrift 初体验 RPC基本原理 RPC(Remote Procedure Call)&#xff0c;远程过程调用&#xff0c;大部分的RPC框架都遵循如下三个开发步骤&#xff1a; 1. 定义一个接口说明文件&#xff1a;描述了对象(结构体)、对象成员、接口方法等一系列信息&am…

01-H5语义化标签

转载于:https://www.cnblogs.com/Zeki/p/5901399.html

配置中心 App Configuration (三):配置的动态更新

Get Azure key-value pairs from App configuration | Serverless360写在前面我在前文&#xff1a;《微软Azure配置中心 App Configuration (一)&#xff1a;轻松集成到Asp.Net Core》已经介绍了Asp.net Core怎么轻易的接入azure 配置中心App Configuration(下称azure 配置中心…

万字总结 JS 数据结构与常用的算法

前言 首先&#xff0c;为什么我会学习数据结构与算法呢&#xff0c;其实主要是有两方面 第一&#xff0c;是我在今年的flag里明确说到我会学这个东西第二&#xff0c;学了这些&#xff0c;对自己以后在工作或者面试也会带来许多好处然后&#xff0c;本文是最近学习的一个总结文…

精通Java设计模式从初见到相爱之工厂+策略模式(3)

为什么80%的码农都做不了架构师&#xff1f;>>> 1、公司项目需求。 用户签到活动&#xff0c;会员签到怎么处理&#xff0c;超级会员怎么处理&#xff0c;普通用户签到怎么处理&#xff0c;针对不同的档次&#xff0c;有不同的方案&#xff0c;所以在项目中用到了策…

jquery weui 中alert弹出框在ios中跳动问题

问题描述&#xff1a; jquery-weui中的弹出框在ios上会有一个右下角向中间滑动的效果&#xff0c;在Android上没有这个效果。 解决方法&#xff1a; 修该jquery-weui.js中的openModal方法如下图: 转载于:https://www.cnblogs.com/xianZJ/p/6773097.html

WPF效果第一百九十五篇之又玩ListBox

ListBox一直是我的最爱;今天再次基于他玩耍一下不一样的效果;闲话不多扯直接看效果:1、这次直接用的ItemContainerStyle:2、通过HitTest实现点选边框&#xff1a;Point point e.GetPosition(LightDarkListBox); VisualTreeHelper.HitTest(LightDarkListBox, new HitTestFilter…

Web3,互联网新造神“机器”?

本文来自微信公众号&#xff1a;每经头条 &#xff08;ID&#xff1a;nbdtoutiao&#xff09;&#xff0c;作者&#xff1a;李蕾&#xff0c;编辑&#xff1a;肖芮冬&#xff0c;头图来自&#xff1a;视觉中国 “与目前的互联网相比&#xff0c;Web3基于区块链等底层技术&#…

普通中年人的真实出路

阅读本文大概需要6分钟。互联网人甚至中国整体的用工市场的确有中年淘汰的问题&#xff0c;我们可以当它不存在&#xff0c;甚至当有人给出解法的时候&#xff0c;我们也可以认为他们在传播焦虑&#xff0c;但事实就是事实&#xff0c;它的存在不随个人意愿而转移。最近抖音上有…

项目管理常见的问题

综合管理 缺乏企业级的项目管理平台;项目目标不清楚;项目经理不了解项目管理流程和工具;项目模板不统一;计划意识薄弱&#xff0c;缺乏规范的分解。难以过程监控&#xff0c;实时地了解项目进度,靠手工统计和汇报项目进度&#xff0c;难以真实反映进度。项目控制不力&#xff0…