Authored by qinchao

切换lb改为异步

... ... @@ -25,6 +25,9 @@ import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
... ... @@ -38,6 +41,10 @@ public class NginxSwitchCtrl {
private long sleepTime=10*1000L;
private volatile AtomicInteger valueCount=new AtomicInteger(1);
private Map<String,BaseResponse> switchLbResponseMap=new ConcurrentHashMap<>();
@Value("${system.envi}")
private String env;
... ... @@ -45,6 +52,19 @@ public class NginxSwitchCtrl {
HostInfoMapper hostInfoMapper;
/**
* 切换lb结果查询
*/
@RequestMapping(value = "getLbSwitchResult")
@ResponseBody
public BaseResponse getLbSwitchResult(String rtnID) {
Set<String> nowIDset=switchLbResponseMap.keySet();
List<String> ids=Lists.newArrayList(rtnID.split(","));
if(nowIDset.containsAll(ids)){
return new BaseResponse();
}
return new BaseResponse(201,"not finished");
}
/**
* 切换lb的权重
* cloudName 源lb
* target 目标nginx
... ... @@ -71,19 +91,54 @@ public class NginxSwitchCtrl {
}
Map<String,List<String>> innerListenerMap=getLbListerner(true);
Map<String,List<String>> outerListenerMap=getLbListerner(false);
String ts=String.valueOf(new Date().getTime());
String rtnID="";
for(LbModel lb:lbList){
if(rtnID.length()>0){
rtnID += ",";
}
rtnID += (ts+"-"+valueCount.getAndIncrement());
//beginSwitchLb(rtnID,targetMap,lb,innerListenerMap,outerListenerMap);
startRunAsySwitchLb(rtnID,targetMap,lb,innerListenerMap,outerListenerMap);
}
BaseResponse response= new BaseResponse();
response.setData(rtnID);
return response;
}
private BaseResponse beginSwitchLb(String rtnID,Map<String,Integer> targetMap,LbModel lb,Map<String,List<String>> innerListenerMap,Map<String,List<String>> outerListenerMap){
logger.info(" beginSwitchLb lb {} ,rtnID {}",lb,rtnID);
BaseResponse rtnBasResponse=null;
try{
if(lb.isClbFlag()){
switchClb(targetMap,lb);
rtnBasResponse= switchClb(targetMap,lb);
}else {
Map<String, List<String>> listenerMap = outerListenerMap;
if (lb.isInnerFlag()) {
listenerMap = innerListenerMap;
}
switchAlb(listenerMap,targetMap,lb);
rtnBasResponse= switchAlb(listenerMap,targetMap,lb);
}
}catch (Exception e){
logger.error("beginSwitchLb error {}",e);
}
return new BaseResponse();
if(rtnBasResponse==null){
rtnBasResponse = new BaseResponse(201,"switch lb error");
}
switchLbResponseMap.put(rtnID,rtnBasResponse);
return rtnBasResponse;
}
/**
* 发起异步调用
*/
private void startRunAsySwitchLb(String rtnID,Map<String,Integer> targetMap,LbModel lb,Map<String,List<String>> innerListenerMap,Map<String,List<String>> outerListenerMap){
CompletableFuture.runAsync(new Runnable() {
@Override
public void run() {
beginSwitchLb(rtnID,targetMap,lb,innerListenerMap,outerListenerMap);
}
});
}
/**
... ...