教程:在 Spring Boot 应用中使用功能标志
Spring Boot Core 功能管理库支持在 Spring Boot 应用程序中实施功能标志。 使用这些库能够以声明方式将功能标志添加到代码。
功能管理库还会在幕后管理功能标志生命周期。 例如,这些库可刷新和缓存标志状态,或者保证标志状态在请求调用期间保持不变。 此外,Spring Boot 库还提供集成,包括 MVC 控制器操作、路由和中间件。
将功能标志添加到 Spring Boot 应用快速入门介绍了在 Spring Boot 应用程序中添加功能标志的多种方法。 本教程将更详细地介绍这些方法。
在本教程中,您将学习如何执行以下操作:
- 在应用程序的关键组件中添加功能标志,以控制功能可用性。
- 使用应用程序配置来管理功能标志时,与应用程序配置相集成。
设置功能管理
Spring Boot 功能管理器 FeatureManager
从框架的本机配置系统获取功能标志。 因此,可以使用 Spring Boot 支持的任何配置源(包括本地 bootstrap.yml 文件或环境变量)来定义应用程序的功能标志。 FeatureManager
依赖于依赖项注入。 可以使用标准约定来注册功能管理服务。
private FeatureManager featureManager;
public HelloController(FeatureManager featureManager) {
this.featureManager = featureManager;
}
我们建议将功能标志保留在应用程序的外部,并单独对其进行管理。 这样便可以随时修改标志状态,并使这些更改在应用程序中立即生效。 应用程序配置提供一个中心位置用于通过专用门户 UI 来组织和控制所有功能标志。 应用程序配置还直接通过其 Spring Boot 客户端库将标志传送到应用程序。
将 Spring Boot 应用程序连接到应用程序配置的最简单方法是使用配置提供程序:
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-feature-management-web</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-dependencies</artifactId>
<version>5.8.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
功能标志声明
每个功能标志有两个组成部分:一个名称,以及用于评估功能状态是否为“打开”(即,其值为 True)的一个或多个筛选器的列表。 筛选器定义有关何时应启用某个功能的用例。
如果某个功能标志包含多个筛选器,则会按顺序遍历筛选器列表,直到其中一个筛选器确定应启用该功能。 此时,该功能标志为“打开”,并会跳过所有剩余的筛选器结果。 如果没有任何筛选器指示应启用该功能,则表示该功能标志为“关闭”。
功能管理器支持将 application.yml 用作功能标志的配置源。 以下示例演示如何在 YAML 文件中设置功能标志:
feature-management:
feature-a: true
feature-b: false
feature-c:
enabled-for:
-
name: PercentageFilter
parameters:
Value: 50
按照约定,此 YML 文档的 feature-management
节用于功能标志设置。 以上示例演示了三个功能标志,其筛选器已在 EnabledFor
属性中定义:
feature-a
状态为“打开”。feature-b
状态为“关闭”。feature-c
指定包含parameters
属性的名为PercentageFilter
的筛选器。PercentageFilter
是可配置的筛选器。 在此示例中,PercentageFilter
指定打开feature-c
标志的概率为 50%。
功能标志检查
功能管理的基本模式是首先检查功能标志是否设置为“打开”。 如果是,则功能管理器将运行该功能包含的操作。 例如:
private FeatureManager featureManager;
...
if (featureManager.isEnabledAsync("feature-a").block()) {
// Run the following code
}
依赖项注入
在 Spring Boot 中,可以通过依赖项注入访问功能管理器 FeatureManager
。
@Controller
@ConfigurationProperties("controller")
public class HomeController {
private FeatureManager featureManager;
public HomeController(FeatureManager featureManager) {
this.featureManager = featureManager;
}
}
控制器操作
在 MVC 控制器中,使用 @FeatureGate
属性控制是否启用特定的操作。 以下 Index
操作要求 feature-a
状态为“打开”才能运行该操作:
@GetMapping("/")
@FeatureGate(feature = "feature-a")
public String index(Model model) {
...
}
当由于控制功能标志状态为“关闭”而阻止了 MVC 控制器或操作时,将调用已注册的 DisabledFeaturesHandler
接口。 默认的 DisabledFeaturesHandler
接口向客户端返回 404 状态代码,但不返回响应正文。
MVC 筛选器
可以设置 MVC 筛选器,以根据功能标志的状态激活这些筛选器。 以下代码添加名为 FeatureFlagFilter
的 MVC 筛选器。 仅当已启用 feature-a
时,才会在 MVC 管道内部触发此筛选器。
@Component
public class FeatureFlagFilter implements Filter {
@Autowired
private FeatureManager featureManager;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if(!featureManager.isEnabled("feature-a")) {
chain.doFilter(request, response);
return;
}
...
chain.doFilter(request, response);
}
}
路由
可以使用功能标志来重定向路由。 以下代码从启用的 feature-a
重定向用户:
@GetMapping("/redirect")
@FeatureGate(feature = "feature-a", fallback = "/getOldFeature")
public String getNewFeature() {
// Some New Code
}
@GetMapping("/getOldFeature")
public String getOldFeature() {
// Some New Code
}
后续步骤
本教程已介绍如何使用 spring-cloud-azure-feature-management-web
库在 Spring Boot 应用程序中实施功能标志。 如需了解更多问题,请参阅参考文档,其中涵盖有关 Spring Cloud Azure 应用程序配置库如何工作的所有详细信息。有关 Spring Boot 和应用程序配置中的功能管理支持的更多信息,请参阅以下资源: