Java 中的特性切换模式:无缝管理生产中的特性
也称为
- 特性标志
- 特性切换
特性切换设计模式的意图
在软件应用程序中动态启用或禁用特性,无需部署新代码。
特性切换模式的详细解释以及现实世界中的例子
现实世界中的例子
特性切换模式的一个现实世界例子是 Netflix 推出新的用户界面特性。当 Netflix 决定引入一个新特性,例如重新设计的首页布局或新的推荐算法时,他们使用特性切换来控制发布。最初,新特性对大多数用户来说是关闭的,只允许一小部分用户(例如,测试版用户)体验并提供关于该特性的反馈。根据反馈和性能指标,Netflix 可以快速为更广泛的受众启用该特性,或者如果检测到问题,则将其关闭,所有这些都无需重新部署应用程序。这种方法允许 Netflix 不断创新和改进其平台,同时最大限度地降低风险并确保稳定的用户体验。
通俗地说
Java 中的特性切换设计模式允许开发人员逐步引入新特性,而不是一次性部署所有特性,从而促进更好的动态特性管理。
维基百科说
软件开发中的特性切换为在源代码中维护多个特性分支提供了一种替代方案。代码中的一个条件在运行时启用或禁用特性。在敏捷环境中,该切换用于生产环境,以便按需为部分或全部用户启用特性。
Java 中特性切换模式的编程示例
这个 Java 代码示例演示了如何在开发人员启用特性并且用户是应用程序的 Premium 会员时显示特性。这种方法对于管理订阅锁定的特性很有用。
特性切换模式能够无缝地激活或停用整个代码执行。这允许根据用户信息或配置属性动态管理特性。
关键组件
PropertiesFeatureToggleVersion
:此类使用属性来控制特性切换。属性决定是否启用个性化的欢迎消息增强版本。TieredFeatureToggleVersion
:此类使用用户信息来控制特性切换。个性化欢迎消息的特性取决于用户所属的用户组。User
:此类表示应用程序的用户。UserGroup
:此类表示用户所属的组。
public static void main(String[] args) {
// Demonstrates the PropertiesFeatureToggleVersion running with properties
// that set the feature toggle to enabled.
final var properties = new Properties();
properties.put("enhancedWelcome", true);
var service = new PropertiesFeatureToggleVersion(properties);
final var welcomeMessage = service.getWelcomeMessage(new User("Jamie No Code"));
LOGGER.info(welcomeMessage);
// Demonstrates the PropertiesFeatureToggleVersion running with properties
// that set the feature toggle to disabled. Note the difference in the printed welcome message
// where the username is not included.
final var turnedOff = new Properties();
turnedOff.put("enhancedWelcome", false);
var turnedOffService = new PropertiesFeatureToggleVersion(turnedOff);
final var welcomeMessageturnedOff =
turnedOffService.getWelcomeMessage(new User("Jamie No Code"));
LOGGER.info(welcomeMessageturnedOff);
// Demonstrates the TieredFeatureToggleVersion setup with
// two users: one on the free tier and the other on the paid tier. When the
// Service#getWelcomeMessage(User) method is called with the paid user, the welcome
// message includes their username. In contrast, calling the same service with the free tier user results
// in a more generic welcome message without the username.
var service2 = new TieredFeatureToggleVersion();
final var paidUser = new User("Jamie Coder");
final var freeUser = new User("Alan Defect");
UserGroup.addUserToPaidGroup(paidUser);
UserGroup.addUserToFreeGroup(freeUser);
final var welcomeMessagePaidUser = service2.getWelcomeMessage(paidUser);
final var welcomeMessageFreeUser = service2.getWelcomeMessage(freeUser);
LOGGER.info(welcomeMessageFreeUser);
LOGGER.info(welcomeMessagePaidUser);
}
运行示例会产生以下输出。
07:31:50.802 [main] INFO com.iluwatar.featuretoggle.App -- Welcome Jamie No Code. You're using the enhanced welcome message.
07:31:50.804 [main] INFO com.iluwatar.featuretoggle.App -- Welcome to the application.
07:31:50.804 [main] INFO com.iluwatar.featuretoggle.App -- I suppose you can use this software.
07:31:50.804 [main] INFO com.iluwatar.featuretoggle.App -- You're amazing Jamie Coder. Thanks for paying for this awesome software.
何时在 Java 中使用特性切换模式
在以下情况下使用 Java 中的特性切换模式
- 对不同的用户和组进行动态特性管理。
- 逐步推出新特性。
- 在开发和生产环境之间切换。
- 快速禁用有问题的特性。
- 外部管理特性部署。
- 能够维护特性的多个版本发布。
- '隐藏'部署,为指定的测试在代码中发布特性,但不会公开发布。
Java 中特性切换模式的现实世界应用
- 许多 Web 开发平台利用特性切换设计模式,逐步向用户推出新特性,确保稳定性和有效的动态特性管理。
- 企业应用程序使用特性切换在运行时启用或禁用特性,以满足不同的市场需求。
特性切换模式的优缺点
优点
- 促进 A/B 测试和金丝雀发布。
- 允许更快的回滚和最小风险部署。
- 能够有条件地执行特性,无需重新部署应用程序。
权衡
- 代码复杂性增加。
- 测试多个状态更难,更耗时。
- 如果切换在代码中保留的时间过长,可能会造成技术债务。
- 切换配置错误可能导致意外行为的风险。