1. 程式人生 > 實用技巧 >關於灰度釋出的一些描述

關於灰度釋出的一些描述

灰度釋出是利用伺服器配置檔案的值,在zuul路由時,在choose中利用登陸使用者資訊進行一些判斷,從而影響路由對服務選擇的邏輯。

1.配置檔案配置:

其中grayVersion的值對應的就是所謂的灰度版本

2.使用者資訊的配置

可配置在使用者表登陸資訊中

3.判斷邏輯

@Slf4j
public class GrayMetadataRule extends ZoneAvoidanceRule {
public static final String META_DATA_GRAY_VERSION= "grayVersion";

private static final Logger logger = LogManager.getLogger(GrayMetadataRule.class);
private ILoadBalancer iLoadBalancer;

@Override
public void setLoadBalancer(ILoadBalancer iLoadBalancer) {
this.iLoadBalancer = iLoadBalancer;
}

@Override
public ILoadBalancer getLoadBalancer() {
return this.iLoadBalancer;
}

/**
* 1、灰度使用者-》 優先選擇灰度版本
* 2、非灰度使用者-》優先選擇正常服務
* @param key
* @return
*/
@Override
public Server choose(Object key) {
     //獲取所有伺服器物件集合
List<Server> serverList = this.getPredicate().getEligibleServers(this.getLoadBalancer().getAllServers(), key);
List<Server> toLBGraySevers = serverList;
try {
if (EmptyUtils.isEmpty(serverList)) {
return null;
}
toLBGraySevers = new ArrayList<>();
List<Server> toLBNormalSevers = new ArrayList<>();
List<Server> otherLBSevers = new ArrayList<>();
String userGrayVersion = "";
String HttpHeadGrayVersion = "";
String gvRuleStr = "";
if (HystrixRequestContext.isCurrentThreadInitialized()) {
//HttpHeader 中的grayVersion 不為空, 優先使用 HttpHeader 中的 grayVersion
HttpHeadGrayVersion = HystrixContext.getGrayVersionInstance().get();
if(EmptyUtils.isNotEmpty(HttpHeadGrayVersion)){
userGrayVersion = HttpHeadGrayVersion;
gvRuleStr = "選取 HttpHeader grayVersion ";
} else {
UserLoginDTO userLoginDTO = HystrixContext.getUserLoginDTOInstance().get();
if (EmptyUtils.isNotEmpty(userLoginDTO)) {
userGrayVersion = userLoginDTO.getGrayVersion();
gvRuleStr = "選取使用者 grayVersion ";
}
}
} else{
gvRuleStr = "無HystrixRequestContext, 預設 grayVersion ";
}
logger.info(gvRuleStr + " : " + userGrayVersion);
String lbRuleStr = "灰度匹配";
logger.info("待LB服務數量:" + serverList.size());
for (Server server : serverList) {
DiscoveryEnabledServer discoveryEnabledServer = (DiscoveryEnabledServer) server;
         //獲取伺服器例項,以獲取其中啟動配置引數
InstanceInfo instanceInfo = discoveryEnabledServer.getInstanceInfo();
Map<String, String> metadata = instanceInfo.getMetadata();
         //獲取配置灰度值
String metaGrayVersion = metadata.get(META_DATA_GRAY_VERSION);
// 服務grayVersion為空,為普通服務
if (EmptyUtils.isEmpty(metaGrayVersion)) {
toLBNormalSevers.add(server);
// 服務grayVersion與使用者一致,為toLB灰度服務
} else if (metaGrayVersion.equals(userGrayVersion)){
toLBGraySevers.add(server);
// 其他未匹配服務
} else {
otherLBSevers.add(server);
}
logger.info("待LB服務:" + server + " grayVersion: " + metaGrayVersion);
}

// 無匹配的灰度服務,選取普通服務
if (EmptyUtils.isEmpty(toLBGraySevers)) {
lbRuleStr = "無匹配的灰度服務,選取普通服務";
toLBGraySevers.addAll(toLBNormalSevers);
}
// 無匹配的灰度服務,無普通服務, 選取其他grayVersion的灰度服務
if (EmptyUtils.isEmpty(toLBGraySevers)) {
lbRuleStr = "無匹配的灰度服務,無普通服務, 選取其他grayVersion的灰度服務";
toLBGraySevers.addAll(otherLBSevers);
}
logger.info("初選LB服務規則: "+ lbRuleStr + " : " + toLBGraySevers);
} catch (Exception e) {
logger.error("gray LB fail:", e.getMessage(), e);
}
return originChoose(toLBGraySevers, key);
}

private Server originChoose(List<Server> noMetaServerList, Object key) {
     //路由規則後最終選取路由服務
Optional<Server> server = getPredicate().chooseRoundRobinAfterFiltering(noMetaServerList, key);
logger.info("終選LB服務:" + server);
if (server.isPresent()) {
return server.get();
} else {
return null;
}
}


}