From 91ffd3fa552153a3b6af889ed2971e0bec67661e Mon Sep 17 00:00:00 2001 From: tanghc Date: Tue, 6 Aug 2019 11:53:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=A2=84=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E3=80=81=E7=81=B0=E5=BA=A6=E5=8F=91=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/DefaultEnvGrayManager.java | 17 ++++----- .../gatewaycommon/manager/EnvGrayManager.java | 2 - .../configuration/BaseZuulConfiguration.java | 10 +++++ .../zuul/filter/PreVersionDecisionFilter.java | 12 +++--- .../zuul/loadbalancer/BaseServerChooser.java | 19 +--------- .../zuul/loadbalancer/ServiceGrayConfig.java | 5 +++ .../EnvironmentServerChooser.java | 37 +------------------ .../sop/gateway/manager/DbEnvGrayManager.java | 2 +- 8 files changed, 34 insertions(+), 70 deletions(-) diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/DefaultEnvGrayManager.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/DefaultEnvGrayManager.java index 7e3a95a6..6aae3577 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/DefaultEnvGrayManager.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/DefaultEnvGrayManager.java @@ -4,9 +4,9 @@ import com.gitee.sop.gatewaycommon.zuul.loadbalancer.ServiceGrayConfig; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * @author tanghc @@ -18,17 +18,13 @@ public class DefaultEnvGrayManager implements EnvGrayManager { */ private Map serviceUserKeyMap = Maps.newConcurrentMap(); - private Map> serviceInstanceIdMap = Maps.newConcurrentMap(); - - @Override - public void addServiceInstance(String serviceId, String instanceId) { - List instanceIdList = serviceInstanceIdMap.computeIfAbsent(serviceId, key -> new ArrayList<>()); - instanceIdList.add(instanceId); - } - @Override public List listGrayInstanceId(String serviceId) { - return serviceInstanceIdMap.get(serviceId); + return serviceUserKeyMap + .values() + .stream() + .map(ServiceGrayConfig::getInstanceId) + .collect(Collectors.toList()); } @Override @@ -51,6 +47,7 @@ public class DefaultEnvGrayManager implements EnvGrayManager { public ServiceGrayConfig getServiceGrayConfig(String instanceId) { return serviceUserKeyMap.computeIfAbsent(instanceId, key -> { ServiceGrayConfig serviceGrayConfig = new ServiceGrayConfig(); + serviceGrayConfig.setInstanceId(instanceId); serviceGrayConfig.setUserKeys(Sets.newConcurrentHashSet()); serviceGrayConfig.setGrayNameVersion(Maps.newConcurrentMap()); return serviceGrayConfig; diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/EnvGrayManager.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/EnvGrayManager.java index 1b294b4c..d89fea0b 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/EnvGrayManager.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/EnvGrayManager.java @@ -10,8 +10,6 @@ import java.util.List; */ public interface EnvGrayManager extends BeanInitializer { - void addServiceInstance(String serviceId, String instanceId); - List listGrayInstanceId(String serviceId); boolean containsKey(String instanceId, Object userKey); diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/configuration/BaseZuulConfiguration.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/configuration/BaseZuulConfiguration.java index bd7b8a29..8f0287f6 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/configuration/BaseZuulConfiguration.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/configuration/BaseZuulConfiguration.java @@ -11,6 +11,7 @@ import com.gitee.sop.gatewaycommon.zuul.filter.PostResultFilter; import com.gitee.sop.gatewaycommon.zuul.filter.PreHttpServletRequestWrapperFilter; import com.gitee.sop.gatewaycommon.zuul.filter.PreLimitFilter; import com.gitee.sop.gatewaycommon.zuul.filter.PreValidateFilter; +import com.gitee.sop.gatewaycommon.zuul.filter.PreVersionDecisionFilter; import com.gitee.sop.gatewaycommon.zuul.filter.Servlet30WrapperFilterExt; import com.gitee.sop.gatewaycommon.zuul.route.SopRouteLocator; import com.gitee.sop.gatewaycommon.zuul.route.ZuulRouteRepository; @@ -111,6 +112,14 @@ public class BaseZuulConfiguration extends AbstractConfiguration { return new PreLimitFilter(); } + /** + * 决定版本号 + */ + @Bean + PreVersionDecisionFilter preVersionDecisionFilter() { + return new PreVersionDecisionFilter(); + } + /** * 错误处理扩展 */ @@ -127,6 +136,7 @@ public class BaseZuulConfiguration extends AbstractConfiguration { return new PostResultFilter(); } + /** * 统一错误处理 */ diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/filter/PreVersionDecisionFilter.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/filter/PreVersionDecisionFilter.java index 73023a5d..dfea50c4 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/filter/PreVersionDecisionFilter.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/filter/PreVersionDecisionFilter.java @@ -40,12 +40,14 @@ public class PreVersionDecisionFilter extends BaseZuulFilter { } String serviceId = targetRoute.getServiceRouteInfo().getServiceId(); List instanceIdList = envGrayManager.listGrayInstanceId(serviceId); - + String appKey = apiParam.fetchAppKey(); for (String instanceId : instanceIdList) { - String version = envGrayManager.getVersion(instanceId, nameVersion); - if (version != null) { - requestContext.addZuulRequestHeader(ParamNames.HEADER_VERSION_NAME, version); - break; + if (envGrayManager.containsKey(instanceId, appKey)) { + String version = envGrayManager.getVersion(instanceId, nameVersion); + if (version != null) { + requestContext.addZuulRequestHeader(ParamNames.HEADER_VERSION_NAME, version); + break; + } } } return null; diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/BaseServerChooser.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/BaseServerChooser.java index 95a9049b..2b3b5953 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/BaseServerChooser.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/BaseServerChooser.java @@ -19,22 +19,6 @@ import java.util.stream.Collectors; @Slf4j public abstract class BaseServerChooser extends ZoneAvoidanceRule { - /** - * 是否匹配对应的服务器,可在此判断是否是预发布,灰度环境 - * - * @param server 指定服务器 - * @return 返回true:是 - */ - protected abstract boolean match(Server server); - - /** - * 客户端能否够访问服务器 - * - * @param server 服务器实例 - * @param request request - * @return 返回true:能访问 - */ - protected abstract boolean canVisit(Server server, HttpServletRequest request); /** * 是否是预发布服务器 @@ -97,7 +81,8 @@ public abstract class BaseServerChooser extends ZoneAvoidanceRule { List grayServers = allServers.stream() .filter(this::isGrayServer) - .filter(server -> canVisitGray(server, request)) + // 这句暂时不需要,放到了PreVersionDecisionFilter中判断 + //.filter(server -> canVisitGray(server, request)) .collect(Collectors.toList()); if (!grayServers.isEmpty()) { return doChoose(grayServers, key); diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/ServiceGrayConfig.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/ServiceGrayConfig.java index 049f1f45..2e11b8e8 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/ServiceGrayConfig.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/ServiceGrayConfig.java @@ -10,6 +10,11 @@ import java.util.Set; */ @Data public class ServiceGrayConfig { + + private String serviceId; + + private String instanceId; + /** * 用户id */ diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/loadbalancer/EnvironmentServerChooser.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/loadbalancer/EnvironmentServerChooser.java index 6908bd78..b4ac5b44 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/loadbalancer/EnvironmentServerChooser.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/loadbalancer/EnvironmentServerChooser.java @@ -8,7 +8,6 @@ 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 org.apache.commons.lang3.StringUtils; import javax.servlet.http.HttpServletRequest; import java.util.Map; @@ -23,6 +22,7 @@ public class EnvironmentServerChooser extends BaseServerChooser { private static final String MEDATA_KEY_ENV = "env"; private static final String ENV_PRE_VALUE = "pre"; private static final String ENV_GRAY_VALUE = "gray"; + /** * 预发布机器域名 */ @@ -46,39 +46,6 @@ public class EnvironmentServerChooser extends BaseServerChooser { return metadata.get(MEDATA_KEY_ENV); } - @Override - protected boolean match(Server server) { - // eureka存储的metadata - Map metadata = ((DiscoveryEnabledServer) server).getInstanceInfo().getMetadata(); - String env = metadata.get(MEDATA_KEY_ENV); - return StringUtils.isNotBlank(env); - } - - /** - * 这里判断客户端能否访问,可以根据ip地址,域名,header内容来决定是否可以访问预发布环境 - * - * @param server 服务器实例 - * @param request request - * @return - */ - @Override - protected boolean canVisit(Server server, HttpServletRequest request) { - // eureka存储的metadata - Map metadata = ((DiscoveryEnabledServer) server).getInstanceInfo().getMetadata(); - String env = metadata.get(MEDATA_KEY_ENV); - boolean canVisit; - switch (env) { - case ENV_PRE_VALUE: - canVisit = canVisitPre(server, request); - break; - case ENV_GRAY_VALUE: - canVisit = canVisitGray(server, request); - break; - default: - canVisit = false; - } - return canVisit; - } /** * 通过判断hostname来确定是否是预发布请求,可修改此方法实现自己想要的 @@ -121,7 +88,7 @@ public class EnvironmentServerChooser extends BaseServerChooser { * * @param param 接口参数 * @param userKeyManager userKey管理 - * @param server 服务器实例 + * @param server 服务器实例 * @param request request * @return true:是 */ diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbEnvGrayManager.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbEnvGrayManager.java index ec1c6ab1..f5491605 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbEnvGrayManager.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbEnvGrayManager.java @@ -46,7 +46,6 @@ public class DbEnvGrayManager extends DefaultEnvGrayManager { List list = configGrayUserkeyMapper.list(query); for (ConfigGrayUserkey configGrayUserkey : list) { this.setServiceGrayConfig(configGrayUserkey); - this.addServiceInstance(configGrayUserkey.getServiceId(), configGrayUserkey.getInstanceId()); } } @@ -69,6 +68,7 @@ public class DbEnvGrayManager extends DefaultEnvGrayManager { List list = Stream.of(userKeys).collect(Collectors.toList()); ServiceGrayConfig serviceGrayConfig = getServiceGrayConfig(instanceId); + serviceGrayConfig.setServiceId(configGrayUserkey.getServiceId()); serviceGrayConfig.getUserKeys().addAll(list); Map grayNameVersion = serviceGrayConfig.getGrayNameVersion();