开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 28 天,点击查看活动详情
什么是功能标志
在他的文章中,Martin fowler 将特征标志定义为:
一种强大的技术,允许团队在不更改代码的情况下修改系统行为。
就如此容易!因此,假设您希望在开发过程中不断将功能集成到您的应用程序中,但又不想立即将它们打开供您的用户使用,或者您可能希望向您的用户群发布不同的软件功能变体,以便了解哪一个更好用。这是功能标志派上用场的地方。它基本上涉及在您的代码中实现开关,这些开关几乎包装了一个功能,并且仅在打开此开关或切换时执行。这意味着最新版本的代码始终可以发布到生产环境中,然后再激活。这为开发团队提供了一些好处,包括:-
- 最小化风险:功能标志的主要好处是它减轻了发布部署环境更改所带来的风险。无论是新功能发布还是小重构,总是存在发布新回归的固有风险。为了缓解这种情况,可以将对应用程序的更改置于功能切换之后,以便在紧急情况下打开或关闭它们。
- 经过良好测试和验证的功能:开发人员基本上可以逐步将新功能部署到生产环境中,从而让团队有足够的时间来执行 QA 并验证其行为是否符合预期。
配置功能标志
Unleash是使用最广泛的开源功能管理解决方案之一。好消息是,它集成在 gitlab 中用于配置功能标志,你在安装 Gitlab 时就有了这个。通过在 GitLab 中启用或禁用标志,您的应用程序可以确定要启用或禁用哪些功能。要在 Gitlab 中创建功能标志:
- 导航到部署。
- 然后单击功能标志。
- 单击New Feature Flag按钮并提供如下所示的详细信息。
例如,在上面,我创建了一个功能标志,该标志仅在暂存和生产环境中有效。您还可以做一些很酷的事情,包括设置哪些用户应该能够访问该功能和百分比推出等。在这里阅读更多
确保在 gitlab 中配置了部署环境。
实现功能标志
为了完成这项工作,我们需要将这些配置的功能标志集成到应用程序代码中。基本上在执行功能之前检查功能标志的活动性。首先,我们需要在pom.xml文件中添加以下依赖
<dependency>
<groupId>io.getunleash</groupId>
<artifactId>unleash-client-java</artifactId>
<version>6.1.0</version>
</dependency>
接下来,创建一个UnleashConfig
像下面这样的bean
...
@Bean
public Unleash unleash () {
UnleashConfig unleashConfig = UnleashConfig.builder()
.appName(APP_DEPLOYMENT_ENVIRONMENT)
.instanceId(INSTANCE_ID)
.unleashAPI(GITLAB_UNLEASH_URL)
.build();
return new DefaultUnleash(unleashConfig);
}
...
APP_DEPLOYMENT_ENVIRONMENT
:应用程序将在其中运行的环境。请注意,这也应该是在功能标志上配置的环境范围之一。该值可以从spring-active-profile 等 自动填充production
,或者您可以将其设为各种环境中的环境变量staging
。qa
INSTANCE_ID
: gitlab unleash 实例id。GITLAB_UNLEASH_URL
:API URL 如下图所示。
这些可以从 gitlab Deployment > Feature Flags > Configure中检索
现在,您需要在下面的代码中应用它
@Autowired
private Unleash unleash
...
if(unleash.isEnabled("new-feature-a")) {
log.info("Executing new-feature-a");
} else {
log.info("Still running old feature");
}
...
例如,设置APP_DEPLOYMENT_ENVIRONMENT
为生产查看日志
现在,如果要在除生产和登台( 比如qa) 以外的任何环境中运行,该功能将不会被执行。同样的道理,如果我们要在 Gitlab 上的配置 FF 中排除生产环境,那么该功能将不会在生产环境中执行。