什么是功能切换
想象您正在为Java应用程序构建一项新功能。在将其推出给所有人之前,您想与一小群用户一起测试该功能。您可以通过创建两个版本的应用程序来做到这一点,一个版本启用了新功能,另一个具有新功能禁用。但这需要您将应用程序的两个不同版本部署到生产中,这可能很耗时且困难。
相反,您可以使用功能切换。功能切换是一个变量,您可以在运行时启用或禁用应用程序中的功能。这意味着您可以将应用程序的单个版本部署到生产中,然后使用功能切换来控制是否启用了不同用户的新功能。
丹尼和约翰尼问题
想象一下情况 Danny 是 Big-B 的唯一女儿,丹尼的父亲
太保护她了。他从不允许丹尼参加聚会或任何郊游。他在医院工作,当时是医生,这是不确定他什么时候去医院回来的。丹尼(Danny)有一个男朋友约翰尼(Johny),他太多了,他从来没有时间与丹尼(Danny)放松。因此,他们一起发现了一个解决方案。他们贿赂了 ramu kaka ,在医院前经营茶摊,他们将告知Wheather Big-B医院或留给Hoe,因此Johny和Danny都可以一起聚会。 /p>
让我们了解时间顺序
- papa_home是 johny 和 danny 是依赖的功能
- Johny 将为Party
称呼 Danny- Danny 将继续寻找 ramu kaka 的信息。
- 他们将决定是否基于 ramu kaka的信息参加聚会。
解决方案
对于解决方案,我们有几个库,我选择了 ff4j (Java的功能标志)。以下是带有解释的代码段。
1.前往Spring Intializer并创建一个入门弹簧靴项目。
我不给您使用哪个版本的sh*t,但是如果您使用的是Spring Boot 3.X,则必须使用Java 17或更高版本。 gradle还是小男人?我不在乎。我和gradle一起去了。
2.将以下行注入您对Gradle的依赖性。
implementation 'org.ff4j:ff4j-core:2.0.0'
.
如果您使用的是Maven,请转到Maven Central Repository并找到自己的依赖性,
3.创建一个Java配置,例如FF4JCONFIG或您想要的任何f*ck。
在哪里创建?这块sh*t不适合您。
4.添加以下行。
@Configuration //This piece of shit will tell spring boot that this is a configuration class
public class FF4jConfig {
//Feature Name Definition
public static final String PAPA_FEATURE = "PAPA_FEATURE";
/*
* FF4J Configuration
* Create one bean of type FF4J. Why? Because concept of overriding is dying
* Create of instance of FF4j. Obviously to use it further
* Register your Feature
* Enable or disable according to you
* You are done, Thank me later (Code Below ⬇️)_
*/
@Bean
public FF4j ff4j(){
FF4j ff4j = new FF4j();
Feature papaFeature = new Feature(PAPA_FEATURE);
papaFeature.disable(); //Default we will disable this feature later we will be enable
ff4j.createFeature(papaFeature);
return ff4j;
}
}
5.为拉木·卡卡(Ramu Kaka)和约翰尼(Johny)定义您的API终点。
@GetMapping(path = "/should-we-party")
public String shouldWeParty(){
if(ff4j.check(FF4jConfig.PAPA_FEATURE))
return "Yeah Johny Lets Go for party";
else
return "Sorry Johny, Papa is at Home";
}
/*
* End-point will change the status of the feature
* In our case it will notify johny about status of papa
*/
@PostMapping(path = "/papa-at-hospital/{isAtHospital}")
public String papaAtHospital(@PathVariable boolean isAtHospital){
if(isAtHospital){
ff4j.enable(FF4jConfig.PAPA_FEATURE);
return ("Message deliverd to danny: PAPA IS AT HOSPITAL, GO PARTY");
}
else {
ff4j.disable(FF4jConfig.PAPA_FEATURE);
return ("Message deliverd to danny: PAPA LEFT HOSPITAL, COME BACK");
}
}
不要忘记在使用
之前自动自动化FF4J进行实例化
@Autowired
FF4j ff4j;
结果
以下是 johny 问 danny out的终点。
以下是 ramu kaka 问 danny out的终点。
一次 ramu kaka 通知 danny big-b 正在医院, johny 将得到以下回应打电话 Danny 。
得到了这一回应后,约翰和丹尼参加了聚会。故事的其余部分从浏览器历史上清除
的完整代码