如何在SpringBoot应用中实现Feature Flags

279 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 28 天,点击查看活动详情

什么是功能标志

在他的文章中,Martin fowler 将特征标志定义为:

一种强大的技术,允许团队在不更改代码的情况下修改系统行为。

就如此容易!因此,假设您希望在开发过程中不断将功能集成到您的应用程序中,但又不想立即将它们打开供您的用户使用,或者您可能希望向您的用户群发布不同的软件功能变体,以便了解哪一个更好用。这是功能标志派上用场的地方。它基本上涉及在您的代码中实现开关,这些开关几乎包装了一个功能,并且仅在打开此开关或切换时执行。这意味着最新版本的代码始终可以发布到生产环境中,然后再激活。这为开发团队提供了一些好处,包括:-

  • 最小化风险:功能标志的主要好处是它减轻了发布部署环境更改所带来的风险。无论是新功能发布还是小重构,总是存在发布新回归的固有风险。为了缓解这种情况,可以将对应用程序的更改置于功能切换之后,以便在紧急情况下打开关闭它们。
  • 经过良好测试和验证的功能:开发人员基本上可以逐步将新功能部署到生产环境中,从而让团队有足够的时间来执行 QA 并验证其行为是否符合预期。

配置功能标志

Unleash是使用最广泛的开源功能管理解决方案之一。好消息是,它集成在 gitlab 中用于配置功能标志,你在安装 Gitlab 时就有了这个。通过在 GitLab 中启用或禁用标志,您的应用程序可以确定要启用或禁用哪些功能。要在 Gitlab 中创建功能标志:

  • 导航到部署。
  • 然后单击功能标志。
  • 单击New Feature Flag按钮并提供如下所示的详细信息。

image.png

例如,在上面,我创建了一个功能标志,该标志仅在暂存生产环境中有效。您还可以做一些很酷的事情,包括设置哪些用户应该能够访问该功能和百分比推出等。在这里阅读更多

确保在 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,或者您可以将其设为各种环境中的环境变量stagingqa
  • INSTANCE_ID: gitlab unleash 实例id。
  • GITLAB_UNLEASH_URL:API URL 如下图所示。

这些可以从 gitlab Deployment > Feature Flags > Configure中检索

image.png

现在,您需要在下面的代码中应用它

@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生产查看日志

image.png

现在,如果要在除生产登台( 比如qa) 以外的任何环境中运行,该功能将不会被执行。同样的道理,如果我们要在 Gitlab 上的配置 FF 中排除生产环境,那么该功能将不会在生产环境中执行。

image.png