小窍门
Azure 平台的云原生 .NET 应用电子书封面缩略图。
在第 1 章中,我们断定云原生主要是关于速度和敏捷性的。 用户期望快速响应能力、创新功能和零停机时间。
Feature flags
是一种新式部署技术,可帮助提高云原生应用程序的敏捷性。 它们使你能够将新功能部署到生产环境中,但会限制其可用性。 通过切换,你可以为特定用户激活新功能,而无需重启应用或部署新代码。 它们将新功能的发布与其代码部署分开。
功能标志基于条件逻辑构建,用于控制运行时用户的功能可见性。 在现代云原生系统中,通常提前将新功能部署到生产环境中,但以有限的受众对其进行测试。 随着置信度的增加,该功能可以逐步向更广泛的受众推出。
功能标志的其他用例包括:
- 将高级功能限制为愿意支付更高订阅费用的特定客户组。
- 通过快速停用问题功能来稳定系统,避免回滚或即时修补程序的风险。
- 在高峰使用期间禁用资源消耗量较高的可选功能。
- 向一小撮用户执行
experimental feature releases
来验证可行性和普及程度。
功能标志还可促进trunk-based
开发。 它是源代码管理分支模型,开发人员可在其中协作处理单个分支中的功能。 该方法可最大程度地减少合并大量长时间运行的功能分支的风险和复杂性。 在激活之前,功能不可用。
实现功能标志
功能标志的核心是对简单 decision object
的引用。 它返回on
或off
的布尔状态。 该标志通常包装封装功能的代码块。 标志的状态确定该代码块是否为给定用户执行。 图 10-11 显示了实现。
if (featureFlag) {
// Run this code block if the featureFlag value is true
} else {
// Run this code block if the featureFlag value is false
}
图 10-11 - 简单功能标志实现。
请注意此方法如何将决策逻辑与功能代码分开。
在第1章中,我们讨论了Twelve-Factor App
。 指导建议将配置设置保存在应用程序可执行代码之外。 如果需要,可以从外部源读取设置。 功能标志配置值也应独立于其代码库。 通过在单独的存储库中外部化标志配置,可以更改标志状态,而无需修改和重新部署应用程序。
Azure 应用配置 为功能标志提供集中式存储库。 借助它,你可定义不同种类的功能标志,并快速、自信地操作其状态。 将应用配置客户端库添加到应用程序以启用功能标志功能。 支持各种编程语言框架。
可以在 ASP.NET Core 服务中轻松实现功能标志。 通过安装 .NET 功能管理库和应用配置提供程序,你可以以声明方式向代码添加功能标志。 它们启用 FeatureGate
属性,以便无需在代码库中手动编写 if 语句。
在 Startup 类中配置后,可以在控制器、操作或中间件级别添加特性标志功能。 图 10-12 呈现了控制器和动作实现。
[FeatureGate(MyFeatureFlags.FeatureA)]
public class ProductController : Controller
{
...
}
[FeatureGate(MyFeatureFlags.FeatureA)]
public IActionResult UpdateProductStatus()
{
return ObjectResult(ProductDto);
}
图 10-12 - 控制器和操作中的特性标志实现。
如果禁用功能标志,用户将收到 404(未找到)状态代码,且没有响应正文。
还可以将功能标志直接注入 C# 类。 图 10-13 显示了功能标志注入:
public class ProductController : Controller
{
private readonly IFeatureManager _featureManager;
public ProductController(IFeatureManager featureManager)
{
_featureManager = featureManager;
}
}
图 10-13 - 功能标志注入到类中。
功能管理库在后台管理功能标志生命周期。 例如,为了最大程度地减少对配置存储区的大量调用,库缓存标志状态为指定持续时间。 他们可以在请求调用期间保证标志状态的不可变性。 它们还提供Point-in-time snapshot
。 可以重新构造任何键值的历史,并在前七天内的任何时刻提供其过去值。