安徽省,广州网站优化哪里有,wordpress 门户网站,男的女的做那个的视频网站写在前面Web服务开发过程中我们经常有这样的需求#xff1a;某些功能我必须我修改了配置才启用#xff0c;比如新用户注册送券等#xff1b;某个功能需到特定的时间才启用#xff0c;过后就失效#xff0c;比如春节活动等#xff1b;某些功能#xff0c;我想先对10%的用… 写在前面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.AspNetCore2、注入服务net6builder.Services.AddFeatureManagement();3、配置文件写几个配置appsettings.jsonFeatureManagement: { //简单功能开关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 TaskIActionResult 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 TaskIActionResult V1()
{return Success(V1);
}/// summary
/// 当启用v2版本的时候接口有效
/// /summary
/// returns/returns
[FeatureGate(MyFeatureFlags.V2)]
[HttpGet]
public async TaskIActionResult V2()
{return Success(V2);
}由于我们上面的配置都是开启的...
//简单功能开关
Beta: true,
v1: true,
v2: true,可以看到image-20220804104253051接口都可以访问我们把v1改成false试试image-20220804104401620马上404了这里清晰的看到功能开关在多版本Api上线下某个版本时候确实方便基于过滤器的功能开关基于过滤器的功能开关是有一定逻辑的功能开关a、百分率功能开关/// summary
/// 启用百分率的功能开关
/// /summary
/// returns/returns
[FeatureGate(MyFeatureFlags.PercentageFlag)]
[HttpGet]
public async TaskIActionResult PercentageFlag()
{return Success(PercentageFlag);
}builder.Services.AddFeatureManagement().AddFeatureFilterPercentageFilter();添加配置FeatureManagement节点下//百分率功能开关
PercentageFlag: {EnabledFor: [{Name: Percentage,Parameters: {Value: 30}}]
},这里的配置参数值代表30%的概率启用次功能我们试试image-20220804105858780分别是不启用和启用状态b、时间窗口功能开关/// summary
/// 启用时间窗口的功能开关
/// /summary
/// returns/returns
[FeatureGate(MyFeatureFlags.TimeWindowFlag)]
[HttpGet]
public async TaskIActionResult TimeWindowFlag()
{return Success(TimeWindowFlag);
}builder.Services.AddFeatureManagement().AddFeatureFilterTimeWindowFilter();添加配置//时间窗口功能开关
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 Taskbool EvaluateAsync(FeatureFilterEvaluationContext context){//这里参数模拟平台实际业务会有实际业务的逻辑var platform _httpContextAccessor.HttpContext.Request.Query[platform].ToString();var allowPlatform context.Parameters.GetCustomFeatureFilterSettings();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 TaskIActionResult CustomFeatureFlag(string platform)
{return Success(CustomFeatureFlag);
}builder.Services.AddFeatureManagement().AddFeatureFilterCustomFeatureFilter();添加配置//自定义功能开关
CustomFeatureFlag: {EnabledFor: [{Name: CustomFeature,Parameters: {AllowedPlatforms: [ //这里配置运行启用功能的平台phone,pad//pc]}}]
}我们来测测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 配置中心后台配置好功能开关(代替本地配置文件)基本功能开关配置创建配置image-20220804115402160填写配置信息image-20220804122451808OK以上是基本的配置配置好后可以直接在列表页面勾选启用配置与否image-20220804123400869基于过滤器的开关配置百分率功能开关image-20220804123721457时间窗口功能开关image-20220804123801220这里的Start date,和Expiry date就对应前面配置文件的Start,End;自定义功能开关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