什么是"功能切换"和"功能分支"以及它们之间的区别是什么?
优缺点都有什么?为什么一个比另一个好?
我在Google上发现了一些关于此问题的文章,我倾向于参加"功能切换"阵营,但我不相信"功能切换"在所有情况下都是更好的选择.
version-control continuous-integration feature-branch featuretoggle
我们的客户可以选择何时升级.因此,我的团队必须维护和支持我们软件产品的几十个版本.您可以想象,由于热修复和服务包必须在所有这些风格中传播,因此导致大量分支和合并.我对这种情况不满意.显而易见的解决方案就是不要维护我们产品的这么多不同版本,但这个显而易见的解决方案对我来说是不可用的.所以,我正在探索创造性的选择,以降低团队的维护工作.我正在考虑使用功能切换和IoC的混合来实现我们软件产品的n个版本.我的想法是,我可以为我的产品使用单一代码库,并通过配置管理来管理行为和功能.这将代替必须跨多个分支传播代码.这是一种合理的方法,还是我只是将一个问题换成另一个问题?
我已经阅读了很多关于功能切换但没有使用它们的实际经验.人们推荐哪些工具和技术来有效管理功能切换?
我想最简单的方法是将web.config文件中的切换作为true/false值存储为appSettings,但这听起来不是特别好的方法.
理想情况下,我希望任何管理功能的方法切换为:
我偶然发现了功能标记的概念,以及一个名为Togglz的流行的开源Java库,它引用了Martin Fowler博客文章:
基本思想是拥有一个配置文件,为您拥有的各种功能定义一系列切换.然后,正在运行的应用程序使用这些切换来决定是否显示新功能.
但对我来说,这听起来像授权:用户是否有权查看此内容?
例如,用户是否应该能够看到FizzBuzz菜单?
在Togglz中,我可能会像这样执行此检查:
if(MyFeatures.ShowFizzBuzz.isActive()) {
// Show the FizzBuzz menu.
}
Run Code Online (Sandbox Code Playgroud)
比方说,Apache Shiro,我可以做同样的事情:
ShowFizzBuzzPermission showFizzBuzz = new ShowFizzBuzzPermission();
if(currentUser.isPermitted(showFizzBuzz) {
// Show the FizzBuzz menu.
}
Run Code Online (Sandbox Code Playgroud)
再次,功能标记只是感觉像为基于角色或允许检查其完全相同的问题.
我确定我错了,但我不知道怎么回事.所以我问:功能标记与授权和角色/权限检查有何不同,具体用例是什么类型的例子?换句话说:我何时应该使用授权/角色/权限检查,何时应该使用功能标志?
我想使用功能切换范例.具体来说,我希望我的Spring上下文包含基于切换的不同bean定义.
我遇到过这个:http://robertmaldon.blogspot.com/2007/04/conditional-defining-spring-beans.html,看起来不错,但可能有点太麻烦了
最近我读了很多文章,讨论使用"功能切换"或"看门人"的想法,以便在开发完成之前保留用户隐藏的功能.Facebook和Flickr都谈到他们如何使用它来测试一些用户的新功能,然后再将其释放到每个人身上.
一些谷歌搜索没有发现任何现有的PHP包/工具可以添加到Web应用程序来处理这类事情.如果我们不需要的话,似乎可以直接推出我们自己但没有理由重新发明那个轮子.有没有现成的PHP工具呢?
用品
澄清:我想看看它是否存在的部分是管理面板,它控制哪些用户可以看到新功能.在Flickr的例子中,他们可以根据主机打开它.在Facebook示例中,他们添加了一些功能,例如将功能限制为5%的用户,仅限TechCrunch用户或仅限东海岸用户.
当你有200个开启的功能,10个尚未完成的功能以及3个你正在为某些用户演示的功能时,管理面板似乎至关重要.
php continuous-integration continuous-deployment featuretoggle
在考虑在应用程序中使用功能切换时,这个问题最让我困惑。大多数功能需要对数据库进行一些更改。那么如何实现功能标志以便能够在打开/关闭功能切换的同时顺利恢复数据库更改?特别是当使用某些数据库迁移工具时,例如 flyway 或 liquibase。
让我们举一些例子。例如,我有一个带有 Id、Name 列的简单表格播放列表。我想在应用程序中添加向播放列表添加描述的功能。需要更改数据库表。已添加新列。列值不是强制性的。简单到此为止。一段时间后,功能将从生产中关闭。解决方案很简单但很麻烦 - 我们可以将列保留在 db 中并且不再在代码中使用它。迁移工具以增量方式工作,因此当我关闭功能切换(或者我错了?)时,我看不到任何返回到先前数据库状态的选项。更难的例子是当字段需要是强制性的。然后我不能把那个字段留在数据库中。它将向后不兼容。那么呢?如何处理这种情况?我认为这是很常见的情况。
此外,即使 db 稍有变化,我对该类的应用程序模型也会发生变化。(假设使用了一些 ORM)。这不像用策略模式替换实现那么容易。除非您为 ORM 模型使用提供了大量抽象。所以添加这样一个功能标志似乎很复杂。任何人都可以帮助我理解它是如何使用功能工具的吗?或者也许有人有完整的例子要展示?首选Java
我一直在使用503 服务不可用或停机进行维护。
然而,一些 http 客户端库(即 axios)将 503 视为可重试错误。
如果由于高负载而产生响应,则重试是有意义的,但 503 也适合功能切换情况。
对人们使用的其他代码有什么建议吗?
如何切换java注释功能?
简单的功能切换: - if(启用切换)执行x
Spring允许使用"profiles"来切换bean.
我使用这些并且它们很好,但我想在字段或类上切换注释..我该怎么做?
用例,我有一个有jpa注释的类.我希望能够在某些环境中通过配置标记某些字段是@transient.
我有一个Spring Boot应用程序,包含很多@ Component,@ Controller,@ RestartController注释组件.有大约20种不同的功能我想分开切换.重要的是,可以在不重建项目的情况下切换功能(重启就可以了).我认为Spring配置会很好.
我可以像这样对配置(yml)进行成像:
myApplication:
features:
feature1: true
feature2: false
featureX: ...
Run Code Online (Sandbox Code Playgroud)
主要问题是我不想在所有地方使用if-blocks.我宁愿完全禁用组件.例如,甚至应该加载@RestController,它不应该注册它的pathes.我正在寻找这样的东西:
@Component
@EnabledIf("myApplication.features.feature1") // <- something like this
public class Feature1{
// ...
}
Run Code Online (Sandbox Code Playgroud)
有这样的功能吗?有没有一种简单的方法可以自己实现它?或者是否有另一种功能切换的最佳实践?
顺便说一句:Spring Boot版本:1.3.4
featuretoggle ×10
java ×5
spring ×3
.net ×1
annotations ×1
api-design ×1
flyway ×1
http ×1
jpa ×1
liquibase ×1
php ×1
response ×1
rest ×1
security ×1
spring-boot ×1
togglz ×1