如何根据 RestController 路径参数设置 FF4j RegionFlippingStrategy?
How to setup a FF4j RegionFlippingStrategy based on RestController path parameters?
我刚刚开始使用 FF4j 在 2 个不同的 API 实现之间切换,具体取决于用户所在的市场(市场 = brand/country 对)。这是代码片段:
@RestController
@RequestMapping("/{brand}/{country}")
public class HomeController {
private final ApiService apiService;
public HomeController(@Qualifier("new-api") ApiService apiService) {
this.apiService = apiService;
}
@GetMapping("/hey")
public String hey(@PathVariable("brand") String brand,
@PathVariable("country") String country) {
return apiService.whichApi();
}
}
interface ApiService {
@Flip(name = "legacy-api", alterBean = "legacy-api")
String whichApi();
}
@Component("new-api")
class NewApiApiService implements ApiService {
@Override
public String whichApi() {
return "NEW_API";
}
}
@Component("legacy-api")
class LegacyApiApiService implements ApiService {
@Override
public String whichApi() {
return "LEGACY_API";
}
}
我创建了一个 RegionFlippingStrategy
(as the doc says) 来定义 market
我想使用 legacy-api
,但我无法让它工作。
如何将我的新策略注册到 FF4j 中?
如何根据家庭控制器 brand/country
输入在 API 之间动态切换?
如何将我的新策略注册到 FF4j 中?
攻略代码提醒一下
public class MarketFlippingStrategy extends AbstractFlipStrategy {
private final Set<String> setOfGrantedMarket = new HashSet<String>();
@Override
public void init(String featureName, Map<String, String> initValue) {
super.init(featureName, initValue);
assertRequiredParameter("grantedMarket");
String[] arrayOfRegions = initValue.get("grantedMarket").split(",");
setOfGrantedRegions.addAll(Arrays.asList(arrayOfRegions));
}
@Override
public boolean evaluate(String fName, FeatureStore fStore, FlippingExecutionContext ctx) {
return setOfGrantedRegions.contains(ctx.getString("market", true));
}
}
FlipStrategy
应该在特征定义中注册 legacy-api
:
- 您可以使用 Web 控制台手动执行此操作(功能 > 编辑功能 > 选择字段策略并编辑 class 和参数 (param1=value1)。
- 您可以在文件中执行此操作并使用控制台导入 ff4j 现在支持
xml
、yaml
或 properties
。
使用以下定义,该功能将仅针对授权市场启用:
<?xml version="1.0" encoding="UTF-8" ?>
<features>
<feature uid="legacy-api" enable="true" >
<flipstrategy class="org.ff4j.sample.strategy.MarketFlippingStrategy" >
<param name="grantedMarket">country1-brand1,country1-brand2</param>
</flipstrategy>
</feature>
</features>
如何根据家庭控制器 brand/country 输入在 API 之间动态切换?
“技巧”是将 brand/country 作为单个变量 market
传递到 FlippingExecutionContext
和 this 中,这将帮助您理解,但这里是如何传递的有效。
@RestController
@RequestMapping("/{brand}/{country}")
public class HomeController {
private final ApiService apiService;
public HomeController(@Qualifier("new-api") ApiService apiService) {
this.apiService = apiService;
}
@GetMapping("/hey")
public String hey(@PathVariable("brand") String brand,
@PathVariable("country") String country) {
FlippingExecutionContext executionContext = new FlippingExecutionContext();
executionContext.putString("market", brand + "-" + country);
return apiService.whichApi(executionContext);
}
}
interface ApiService {
@Flip(name = "legacy-api",
alterBean = "legacy-api",
flippingStrategy = MarketFlippingStrategy.class,
contextLocation = ContextLocation.PARAMETER)
String whichApi(FlippingExecutionContext context);
}
@Component("new-api")
class NewApiApiService implements ApiService {
@Override
public String whichApi(FlippingExecutionContext context) {
return "NEW_API";
}
}
@Component("legacy-api")
class LegacyApiApiService implements ApiService {
@Override
public String whichApi(FlippingExecutionContext context) {
return "LEGACY_API";
}
}
我刚刚开始使用 FF4j 在 2 个不同的 API 实现之间切换,具体取决于用户所在的市场(市场 = brand/country 对)。这是代码片段:
@RestController
@RequestMapping("/{brand}/{country}")
public class HomeController {
private final ApiService apiService;
public HomeController(@Qualifier("new-api") ApiService apiService) {
this.apiService = apiService;
}
@GetMapping("/hey")
public String hey(@PathVariable("brand") String brand,
@PathVariable("country") String country) {
return apiService.whichApi();
}
}
interface ApiService {
@Flip(name = "legacy-api", alterBean = "legacy-api")
String whichApi();
}
@Component("new-api")
class NewApiApiService implements ApiService {
@Override
public String whichApi() {
return "NEW_API";
}
}
@Component("legacy-api")
class LegacyApiApiService implements ApiService {
@Override
public String whichApi() {
return "LEGACY_API";
}
}
我创建了一个 RegionFlippingStrategy
(as the doc says) 来定义 market
我想使用 legacy-api
,但我无法让它工作。
如何将我的新策略注册到 FF4j 中?
如何根据家庭控制器 brand/country
输入在 API 之间动态切换?
如何将我的新策略注册到 FF4j 中?
攻略代码提醒一下
public class MarketFlippingStrategy extends AbstractFlipStrategy {
private final Set<String> setOfGrantedMarket = new HashSet<String>();
@Override
public void init(String featureName, Map<String, String> initValue) {
super.init(featureName, initValue);
assertRequiredParameter("grantedMarket");
String[] arrayOfRegions = initValue.get("grantedMarket").split(",");
setOfGrantedRegions.addAll(Arrays.asList(arrayOfRegions));
}
@Override
public boolean evaluate(String fName, FeatureStore fStore, FlippingExecutionContext ctx) {
return setOfGrantedRegions.contains(ctx.getString("market", true));
}
}
FlipStrategy
应该在特征定义中注册 legacy-api
:
- 您可以使用 Web 控制台手动执行此操作(功能 > 编辑功能 > 选择字段策略并编辑 class 和参数 (param1=value1)。
- 您可以在文件中执行此操作并使用控制台导入 ff4j 现在支持
xml
、yaml
或properties
。
使用以下定义,该功能将仅针对授权市场启用:
<?xml version="1.0" encoding="UTF-8" ?>
<features>
<feature uid="legacy-api" enable="true" >
<flipstrategy class="org.ff4j.sample.strategy.MarketFlippingStrategy" >
<param name="grantedMarket">country1-brand1,country1-brand2</param>
</flipstrategy>
</feature>
</features>
如何根据家庭控制器 brand/country 输入在 API 之间动态切换?
“技巧”是将 brand/country 作为单个变量 market
传递到 FlippingExecutionContext
和 this 中,这将帮助您理解,但这里是如何传递的有效。
@RestController
@RequestMapping("/{brand}/{country}")
public class HomeController {
private final ApiService apiService;
public HomeController(@Qualifier("new-api") ApiService apiService) {
this.apiService = apiService;
}
@GetMapping("/hey")
public String hey(@PathVariable("brand") String brand,
@PathVariable("country") String country) {
FlippingExecutionContext executionContext = new FlippingExecutionContext();
executionContext.putString("market", brand + "-" + country);
return apiService.whichApi(executionContext);
}
}
interface ApiService {
@Flip(name = "legacy-api",
alterBean = "legacy-api",
flippingStrategy = MarketFlippingStrategy.class,
contextLocation = ContextLocation.PARAMETER)
String whichApi(FlippingExecutionContext context);
}
@Component("new-api")
class NewApiApiService implements ApiService {
@Override
public String whichApi(FlippingExecutionContext context) {
return "NEW_API";
}
}
@Component("legacy-api")
class LegacyApiApiService implements ApiService {
@Override
public String whichApi(FlippingExecutionContext context) {
return "LEGACY_API";
}
}