如何使用功能切换?

Blog
Author:
Dori ExtermanDori Exterman
Published On:
8月 10, 2021
Estimated reading time:
1 minute

经常会出现这样一种情况:程序的功能需要在特定的环境中才能正常运行。因此,测试程序现有功能、或检验新功能的互操作性时,操作会比较麻烦。在不论哪种情况,使用 CI/CD 回滚到之前的版本都有风险。

一种风险较小、侵入性较低的办法是使用功能切换。正确使用功能切换可以隐藏程序的功能。虽然功能切换还算不上是生产解决方案,但它可以使用一种部署方式进行嵌套和启用这些功能。

其他解决方案可能适用于较复杂的场景,但功能切换广泛用于测试和实施新软件功能的场景。继续阅读,了解更多关于什么是功能切换以及何时应该(或不应该)使用这些切换的信息。

什么是功能切换?

what-are-feature-flags_Incredib

简单来说,功能切换根据程序的逻辑检查外部配置值,打开或关闭相关功能。这种配置可用于以下情况:

  • 部署在同一资源上的配置文件。
  • 部署期间设置的环境变量。
  • 云中的配置文件。

这个功能与众不同的一点是,需要测试的逻辑已经部署到服务器上。功能切换的功能可以保证新更改可以完全部署,同时不影响现有程序功能。然而,额外的逻辑确实也带来了一些切换负债。

但与使用功能切换的好处比起来,这些切换负债还在接受范围之内。以这种方式使用功能切换,通常不会增加太多额外的工作。毕竟功能的新逻辑已经完成并部署。在所有测试和验证完成后,另一个版本可能会用实际执行的版本替换功能切换逻辑。

但是如果不加以控制,功能切换可能让管道部署等方面更加复杂,这种情况下,可以使用第三方解决方案迭代实现功能。如果无法进行功能切换,管理上将是一场噩梦。

功能切换如何运转?

功能切换,等同于在新逻辑中添加条件语句。根据外部配置值,检查是否符合相应的条件。添加这个条件语句之后,团队可以在代码库中的一个版本上继续编码,同时保持对启用新功能的细粒度控制。

这些切换也称为功能切换,可以有效打开或关闭功能。无论使用什么术语,重要的是要注意区别这种切换与用户在程序设置中可修改的切换类型。这些是在生产程序周期中进行的配置或选项。

什么时候使用?

显然,功能切换的最初理由是帮助打开和关闭软件的各个功能,避免在每次发布新功能时重新部署。我想到的一个例子是,QA 如何使用功能切换来保证试验项目在预生产中处于活动状态,并选择在部署后启用。

通过创建可感知环境的条件逻辑,CI/CD 进程中的 DevOps 技术可以确保在部署到开发或 QA 环境时启用功能,这将保证始终测试新代码。

当相同的代码部署到生产环境中时,情况正好相反,该功能可能会利用不同的条件来调节启用生产的时间。这样做可以减少源代码维护,清理分支技术残留,并减少对多个环境的部署。

部署代码所花费的时间越少,稳定性越高。部署本身就有一定的风险,即便CI/CD 进程的自动化程度已经很高,也有可能导致不好的用户体验。部署越少,意味着出错的机会越少。

部署的另一个方面是使用新功能来全面满足用户需求。与其一次性推出所有新功能,更为有效的做法是采用迭代方式进行更改。慢慢地实现部分功能,再发布到客户端。这种分步的方式通常有助于减少负面体验,并引导客户使用更新的功能。

当解决方案更大或者是整体式时,很小的功能更新也可能需要大量的工作。因此,启用新功能时,将整个程序进行打包和部署更为方便。功能切换的原理与使用微服务之类的方法来分隔程序相似,避免了整体式的程序开发。因此,使用功能切换可以减少部署周期,并保证按时发布功能。

什么时候应该使用功能切换?

一般不建议在权限或安全逻辑中使用功能切换,另外,功能切换也不适合控制数据的加密、解密或存储。与安全性相关的功能影响较大,不能掉以轻心。在各种环境下,总有一些意料之外的风险。

对于设备或其他脱机系统,使用功能切换回滚到本地配置时,需要多加注意。如果移动程序的自身功能是通过网络检索配置文件来启用,那么它需要一个初始配置帮助脱机运行。这可能规避了部分值的需求,因此不适合采用功能切换。

成本是一个因素,而且因为不是一两美元的问题。如前所述,要进行功能切换,切换负债是需要考虑的因素。由于功能切换需要一些相应的记录,方便管理。因此如何切换负债没有及时清理或干扰到其他代码,事情可能会变得相当混乱。另一种降低成本的方法是程序预热。检查几个功能切换可能不会产生太大的影响,但程序中如有多个实例的许多功能需要切换,程序的性能也将会降低。

功能切换的实际操作

我们看一个简单的 C# 代码片段来讨论功能切换的基础:

if (featureFlag) {

// Run this code block if the featureFlag value is true

} else {

// Run this code block if the featureFlag value is false

}

我们可以看到,上面的代码中,if 中“bit”类 featureFlag变量的计算结果为 true,则执行该代码段。在这种情况中,功能切换的逻辑在新代码之外。

许多语言都提供了库来辅助功能切换。微软提供了一个使用 .Net 核心程序功能切换库的详细教程。这些库简化为最简单的形式,不再需要多个“if”语句。结合 Azure App Configuration 等工具使用,可以更轻松地管理你的功能。

总结

总结一下,我大致介绍了什么是功能切换,以及如何将其应用于软件开发中。你可以在 A/B 测试使用,免费内容或单独付费,或者帮助解决麻烦的代码库问题。虽然功能切换并不适用于每种场景,但是知道如何使用功能切换很重要,这样团队就可以有所选择。一般来说,你可以从简单的方法进行程序的功能切换。当然,了解一些功能切换的辅助工具或产品也大有裨益。

Whitepaper Download