Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.18.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 筛选器,以根据功能标志的状态激活这些筛选器。 以下代码添加名为 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 和应用程序配置中功能管理支持的详细信息,请参阅以下资源: