我的后端由多个微服务组成,这些微服务通过HTTPs相互通信。在每个服务中,都有一个简单的功能标志管理器,它从配置文件中读取并决定是否启用某个功能,类似于以下内容:
{
"feature1" : true,
"feature2" : false
}
该文件稍后由运行时读取,代码路径根据其值进行分叉:
if (IsFeatureEnabled("feature1")
{
DoThis();
}
if (IsFeatureEnabled("feature2")
{
DoThat();
}
如果特性在端点中公开,那么我想编写涵盖feature1
和feature2
的API测试。在不必在测试运行之间修改配置的情况下,最好的方法是什么?
我想到了一个想法,可以为我的功能标志引入一些动态性,即传递所需的标志值,这些值应该覆盖请求标头中的配置值:
x-feature-flags: feature1:true,feature2:false
其中指定要打开/关闭的功能。功能管理器仍将正常读取配置,但标头中指定的任何功能都将被覆盖。有效地使它们在每次HTTP调用时都是动态的。
我的方法带来了哪些负面影响?有其他更好的方法吗?因为这感觉有点黑。
干杯。
主要的缺点是,如果该行为达到生产,人们可以利用该行为来控制实时系统的内部。说这是一个销售网站,他们关闭了";信用卡验证";特征或其他什么。
为了避免这种情况,我将抽象掉标志管理器,以便在生产环境中读取一个文件,但在测试环境中读取另一个源,该源可以由测试运行程序控制。
这样,切换行为就不是程序本身的一部分,而是程序周围环境的一部分
如果不了解你的语言、框架等,很难举出例子。如果你在一个面向对象的环境中,你可以有一个FileFlagManager和一个TestHarnessFlagManager,它们共享一个接口。