支持预发布、灰度发布

This commit is contained in:
tanghc
2019-08-06 10:28:48 +08:00
parent 8718284dc3
commit 5d23eeb1d1
18 changed files with 216 additions and 107 deletions

View File

@@ -25,6 +25,9 @@ public class ConfigGrayUserkey {
/** 数据库字段id */
private Long id;
/** serviceId, 数据库字段service_id */
private String serviceId;
/** instanceId, 数据库字段instance_id */
private String instanceId;

View File

@@ -1,15 +1,13 @@
package com.gitee.sop.gateway.loadbalancer;
import com.gitee.sop.gateway.manager.DbUserKeyManager;
import com.gitee.sop.gateway.manager.DbEnvGrayManager;
import com.gitee.sop.gatewaycommon.bean.SpringContext;
import com.gitee.sop.gatewaycommon.param.ApiParam;
import com.gitee.sop.gatewaycommon.param.Param;
import com.gitee.sop.gatewaycommon.param.ParamNames;
import com.gitee.sop.gatewaycommon.zuul.ZuulContext;
import com.gitee.sop.gatewaycommon.zuul.loadbalancer.BaseServerChooser;
import com.netflix.loadbalancer.Server;
import com.netflix.niws.loadbalancer.DiscoveryEnabledServer;
import com.netflix.zuul.context.RequestContext;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
@@ -30,6 +28,24 @@ public class EnvironmentServerChooser extends BaseServerChooser {
*/
private static final String PRE_DOMAIN = "localhost";
@Override
protected boolean isPreServer(Server server) {
String env = getEnvValue(server);
return ENV_PRE_VALUE.equals(env);
}
@Override
protected boolean isGrayServer(Server server) {
String env = getEnvValue(server);
return ENV_GRAY_VALUE.equals(env);
}
private String getEnvValue(Server server) {
// eureka存储的metadata
Map<String, String> metadata = ((DiscoveryEnabledServer) server).getInstanceInfo().getMetadata();
return metadata.get(MEDATA_KEY_ENV);
}
@Override
protected boolean match(Server server) {
// eureka存储的metadata
@@ -70,6 +86,7 @@ public class EnvironmentServerChooser extends BaseServerChooser {
* @param request request
* @return 返回true可以进入到预发环境
*/
@Override
protected boolean canVisitPre(Server server, HttpServletRequest request) {
String serverName = request.getServerName();
return PRE_DOMAIN.equals(serverName);
@@ -83,19 +100,19 @@ public class EnvironmentServerChooser extends BaseServerChooser {
*/
protected boolean canVisitGray(Server server, HttpServletRequest request) {
ApiParam apiParam = ZuulContext.getApiParam();
DbUserKeyManager userKeyManager = SpringContext.getBean(DbUserKeyManager.class);
DbEnvGrayManager userKeyManager = SpringContext.getBean(DbEnvGrayManager.class);
boolean canVisit = false;
if (this.isGrayUser(apiParam, userKeyManager, server, request)) {
/*if (this.isGrayUser(apiParam, userKeyManager, server, request)) {
// 指定灰度版本号
String instanceId = server.getMetaInfo().getInstanceId();
String newVersion = userKeyManager.getVersion(instanceId, apiParam.fetchNameVersion());
if (newVersion != null) {
// 在header中设置新的版本号然后微服务端先获取这个新版本号
RequestContext.getCurrentContext().addZuulRequestHeader(ParamNames.GRAY_HEADER_VERSION_NAME, newVersion);
RequestContext.getCurrentContext().addZuulRequestHeader(ParamNames.HEADER_VERSION_NAME, newVersion);
canVisit = true;
}
}
return canVisit;
}*/
return this.isGrayUser(apiParam, userKeyManager, server, request);
}
@@ -108,7 +125,7 @@ public class EnvironmentServerChooser extends BaseServerChooser {
* @param request request
* @return true
*/
protected boolean isGrayUser(Param param, DbUserKeyManager userKeyManager, Server server, HttpServletRequest request) {
protected boolean isGrayUser(Param param, DbEnvGrayManager userKeyManager, Server server, HttpServletRequest request) {
String instanceId = server.getMetaInfo().getInstanceId();
// 这里的灰度用户为appKey包含此appKey则为灰度用户允许访问
String appKey = param.fetchAppKey();

View File

@@ -6,7 +6,7 @@ import com.gitee.sop.gateway.entity.ConfigGrayUserkey;
import com.gitee.sop.gateway.mapper.ConfigGrayUserkeyMapper;
import com.gitee.sop.gatewaycommon.bean.ChannelMsg;
import com.gitee.sop.gatewaycommon.bean.UserKeyDefinition;
import com.gitee.sop.gatewaycommon.manager.DefaultUserKeyManager;
import com.gitee.sop.gatewaycommon.manager.DefaultEnvGrayManager;
import com.gitee.sop.gatewaycommon.manager.ZookeeperContext;
import com.gitee.sop.gatewaycommon.zuul.loadbalancer.ServiceGrayConfig;
import lombok.extern.slf4j.Slf4j;
@@ -29,7 +29,7 @@ import java.util.stream.Stream;
*/
@Slf4j
@Service
public class DbUserKeyManager extends DefaultUserKeyManager {
public class DbEnvGrayManager extends DefaultEnvGrayManager {
private static final int STATUS_ENABLE = 1;
@@ -46,6 +46,7 @@ public class DbUserKeyManager extends DefaultUserKeyManager {
List<ConfigGrayUserkey> list = configGrayUserkeyMapper.list(query);
for (ConfigGrayUserkey configGrayUserkey : list) {
this.setServiceGrayConfig(configGrayUserkey);
this.addServiceInstance(configGrayUserkey.getServiceId(), configGrayUserkey.getInstanceId());
}
}

View File

@@ -14,6 +14,6 @@ public class ManagerInitializer {
apiConfig.setRouteConfigManager(new DbRouteConfigManager());
apiConfig.setLimitConfigManager(new DbLimitConfigManager());
apiConfig.setIpBlacklistManager(new DbIPBlacklistManager());
apiConfig.setUserKeyManager(new DbUserKeyManager());
apiConfig.setUserKeyManager(new DbEnvGrayManager());
}
}