@Data
public static class NewSwitch{
//是否开启灰度,true是,false否
Boolean enable;
//灰度基数,-1的时候默认为全部开启灰度
Long divisor;
//灰度比例 参数对divisor取余小于等于mod命中灰度
Long mod;
//白名单,优先判断白名单
List<String> whiteList;
}
@Component
@RefreshScope
@Data
@ConfigurationProperties("switch-config")
public class SwitchConfig {
private NewSwitch orderSwitch;
//适用于根据指定id或标识灰度,白名单可以是用户id,手机号啥的
public boolean isNewSwitch(NewSwitch newSwitch, Long mod, String white) {
if(newSwitch==null){
return false;
}
if(!Boolean.TRUE.equals(newSwitch.enable)){
return false;
}
if(newSwitch.divisor==-1){
return true;
}
if(!StringUtils.isEmpty(white)){
if(newSwitch.whiteList.contains(white)){
return true;
}
}
if(newSwitch.divisor==0){
return false;
}
if(mod==null){
mod=getRandomNumber(newSwitch.divisor.intValue());
}
Long res=mod%newSwitch.divisor;
if(res<newSwitch.mod){
return true;
}
return false;
}
//适用于随机灰度 按配置的比例灰度
public boolean isNewSwitch(NewSwitch newSwitch) {
return isNewSwitch(newSwitch,null,null);
}
//适用于根据指定id或标识灰度
public boolean isNewSwitch(NewSwitch newSwitch,Long mod) {
return isNewSwitch(newSwitch,mod,null);
}
//有需要可以再加个白名单灰度
@Data
public static class NewSwitch{
//是否开启灰度,true是,false否
Boolean enable;
//灰度基数,-1的时候默认为全部开启灰度
Long divisor;
//灰度比例 参数对divisor取余小于等于mod命中灰度
Long mod;
//白名单,优先判断白名单
List<String> whiteList;
}
}
灰度使用
public class OrderTest {
@Autowired
private SwitchConfig switchConfig;
public void switchTest {
if(switchConfig.isNewSwitch(switchConfig.getOrderToHtapSwitch())){
//todo new
}else{
//todo old
}
}