diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFileLocator.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFileLocator.java index f21285a70..9db25194b 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFileLocator.java +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFileLocator.java @@ -24,6 +24,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import com.tencent.cloud.common.util.EnvironmentUtils; import com.tencent.cloud.plugin.tsf.tls.utils.SyncUtils; import com.tencent.cloud.polaris.config.config.ConfigFileGroup; import com.tencent.cloud.polaris.config.config.PolarisConfigProperties; @@ -222,7 +223,7 @@ public class PolarisConfigFileLocator implements PropertySourceLocator { tsfConfigGroups.add((StringUtils.isNotBlank(tsfId) ? tsfId + "." : "") + tsfGroupName + ".application_config_group"); tsfConfigGroups.add((StringUtils.isNotBlank(tsfId) ? tsfId + "." : "") + tsfNamespaceName + ".global_config_group"); - if (ClassUtils.isClassPresent("org.springframework.cloud.gateway.filter.GlobalFilter")) { + if (EnvironmentUtils.isGateway()) { tsfConfigGroups.add((StringUtils.isNotBlank(tsfId) ? tsfId + "." : "") + tsfGroupName + ".gateway_config_group"); } for (String tsfConfigGroup : tsfConfigGroups) { diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFilePuller.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFilePuller.java index eb6212f88..7c6f482a1 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFilePuller.java +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigFilePuller.java @@ -24,6 +24,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import com.tencent.cloud.common.util.EnvironmentUtils; import com.tencent.cloud.plugin.tsf.tls.utils.SyncUtils; import com.tencent.cloud.polaris.config.config.ConfigFileGroup; import com.tencent.cloud.polaris.config.configdata.PolarisConfigDataLoader; @@ -155,7 +156,7 @@ public final class PolarisConfigFilePuller { tsfConfigGroups.add((StringUtils.isNotBlank(tsfId) ? tsfId + "." : "") + tsfGroupName + ".application_config_group"); tsfConfigGroups.add((StringUtils.isNotBlank(tsfId) ? tsfId + "." : "") + tsfNamespaceName + ".global_config_group"); - if (ClassUtils.isClassPresent("org.springframework.cloud.gateway.filter.GlobalFilter")) { + if (EnvironmentUtils.isGateway()) { tsfConfigGroups.add((StringUtils.isNotBlank(tsfId) ? tsfId + "." : "") + tsfGroupName + ".gateway_config_group"); } for (String tsfConfigGroup : tsfConfigGroups) { diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/discovery/UnitPolarisDiscoveryClient.java b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/discovery/UnitPolarisDiscoveryClient.java index e6b5c8993..2dc19740e 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/discovery/UnitPolarisDiscoveryClient.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/discovery/UnitPolarisDiscoveryClient.java @@ -43,7 +43,7 @@ public class UnitPolarisDiscoveryClient extends PolarisDiscoveryClient { if (TencentUnitManager.isEnable()) { String[] parts = service.split("/"); if (LOGGER.isDebugEnabled()) { - LOGGER.debug("[getInstance] service:{}, unit context:{}", service, TencentUnitContext.getCompositeContextMap()); + LOGGER.debug("[getInstance] service:{}, unit context:{}", service, TencentUnitContext.getOriginCompositeContextMap()); } if (parts.length != 2) { diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitClientFinallyEnhancedPlugin.java b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitClientFinallyEnhancedPlugin.java index a51c4fffb..25cf4e90d 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitClientFinallyEnhancedPlugin.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitClientFinallyEnhancedPlugin.java @@ -21,11 +21,15 @@ import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; import com.tencent.tsf.unit.core.TencentUnitContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.core.Ordered; public class UnitClientFinallyEnhancedPlugin implements EnhancedPlugin { + private static final Logger LOG = LoggerFactory.getLogger(UnitClientFinallyEnhancedPlugin.class); + public UnitClientFinallyEnhancedPlugin() { } @@ -36,6 +40,9 @@ public class UnitClientFinallyEnhancedPlugin implements EnhancedPlugin { @Override public void run(EnhancedPluginContext context) throws Throwable { + if (LOG.isDebugEnabled()) { + LOG.debug("clean unit context, unit context:{}", TencentUnitContext.getOriginCompositeContextMap()); + } TencentUnitContext.removeAll(); } diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitFeignEnhancedPlugin.java b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitFeignEnhancedPlugin.java index 88cb660d7..6ce7c0159 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitFeignEnhancedPlugin.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitFeignEnhancedPlugin.java @@ -53,7 +53,7 @@ public class UnitFeignEnhancedPlugin implements EnhancedPlugin { return; } - TencentUnitContext.UnitCompositeContextMap unitCompositeContextMap = TencentUnitContext.getCompositeContextMap(); + TencentUnitContext.UnitCompositeContextMap unitCompositeContextMap = TencentUnitContext.getOriginCompositeContextMap(); if (!com.tencent.polaris.api.utils.CollectionUtils.isEmpty(unitCompositeContextMap.getSystemContext())) { buildMetadataHeader(request, unitCompositeContextMap.getSystemContext(), MetadataConstant.HeaderName.TSF_UNIT); } diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitRestTemplateEnhancedPlugin.java b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitRestTemplateEnhancedPlugin.java index 13d9414a9..79d2cd540 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitRestTemplateEnhancedPlugin.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitRestTemplateEnhancedPlugin.java @@ -49,7 +49,7 @@ public class UnitRestTemplateEnhancedPlugin implements EnhancedPlugin { return; } - TencentUnitContext.UnitCompositeContextMap unitCompositeContextMap = TencentUnitContext.getCompositeContextMap(); + TencentUnitContext.UnitCompositeContextMap unitCompositeContextMap = TencentUnitContext.getOriginCompositeContextMap(); if (!CollectionUtils.isEmpty(unitCompositeContextMap.getSystemContext())) { buildMetadataHeader(httpRequest, unitCompositeContextMap.getSystemContext(), MetadataConstant.HeaderName.TSF_UNIT); } diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitScgEnhancedPlugin.java b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitScgEnhancedPlugin.java index 57ec49433..3e46bcfa5 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitScgEnhancedPlugin.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitScgEnhancedPlugin.java @@ -53,7 +53,7 @@ public class UnitScgEnhancedPlugin implements EnhancedPlugin { // get request builder ServerHttpRequest.Builder builder = exchange.getRequest().mutate(); - TencentUnitContext.UnitCompositeContextMap unitCompositeContextMap = TencentUnitContext.getCompositeContextMap(); + TencentUnitContext.UnitCompositeContextMap unitCompositeContextMap = TencentUnitContext.getOriginCompositeContextMap(); if (!com.tencent.polaris.api.utils.CollectionUtils.isEmpty(unitCompositeContextMap.getSystemContext())) { buildMetadataHeader(builder, unitCompositeContextMap.getSystemContext(), MetadataConstant.HeaderName.TSF_UNIT); } diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitServletPreEnhancedPlugin.java b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitServletPreEnhancedPlugin.java index 00c523235..0e231eb78 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitServletPreEnhancedPlugin.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/plugin/UnitServletPreEnhancedPlugin.java @@ -54,6 +54,8 @@ public class UnitServletPreEnhancedPlugin implements EnhancedPlugin { return; } + TencentUnitContext.removeAll(); + String unitContextEncoded = httpServletRequest.getHeader(MetadataConstant.HeaderName.TSF_UNIT); if (StringUtils.isNotEmpty(unitContextEncoded)) { Map unitMap = JacksonUtils.deserialize2Map(URLDecoder.decode(unitContextEncoded, StandardCharsets.UTF_8)); @@ -73,20 +75,21 @@ public class UnitServletPreEnhancedPlugin implements EnhancedPlugin { Optional.ofNullable(unitMap.get(TencentUnitContext.CLOUD_SPACE_GRAY_UNIT_INFO)). ifPresent(value -> TencentUnitContext.putSystemTag(TencentUnitContext.CLOUD_SPACE_GRAY_UNIT_INFO, value)); } - if (logger.isDebugEnabled()) { - logger.debug("[getSerializeTagsFromRequestMeta] unit context:{}", - TencentUnitContext.getCompositeContextMap()); - } + } - for (String grayKey : TencentUnitManager.getGrayUnitHeaderKey()) { - String value = httpServletRequest.getHeader(grayKey); - // 非空 value 才设置,便于匹配灰度规则时能否直接跳过 - if (StringUtils.isNotEmpty(value)) { - TencentUnitContext.putGrayUserTag(UnitTagPosition.HEADER.name(), grayKey, value); - } + for (String grayKey : TencentUnitManager.getGrayUnitHeaderKey()) { + String value = httpServletRequest.getHeader(grayKey); + // 非空 value 才设置,便于匹配灰度规则时能否直接跳过 + if (StringUtils.isNotEmpty(value)) { + TencentUnitContext.putGrayUserTag(UnitTagPosition.HEADER.name(), grayKey, value); } } + if (logger.isDebugEnabled()) { + logger.debug("[getSerializeTagsFromRequestMeta] unit context:{}", + TencentUnitContext.getOriginCompositeContextMap()); + } + } @Override diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/utils/SpringCloudUnitUtils.java b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/utils/SpringCloudUnitUtils.java index b042f21de..8194578d2 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/utils/SpringCloudUnitUtils.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/cloud/plugin/unit/utils/SpringCloudUnitUtils.java @@ -56,7 +56,10 @@ public final class SpringCloudUnitUtils { } TencentUnitContext.putSystemTagsFromUser(); - + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("[preRequestRecordUnitContext] service name:{}, unit context:{}", + serviceName, TencentUnitContext.getOriginCompositeContextMap()); + } String system = TencentUnitContext.getSystemTag(TencentUnitContext.CLOUD_SPACE_TARGET_SYSTEM); // 无论 gdu 还是 sdu, 都需要 system 信息,如果没有 system(返回 false),则直接返回 if (!checkSystem(system, serviceName)) { @@ -95,7 +98,7 @@ public final class SpringCloudUnitUtils { TencentUnitContext.putSystemTag(TencentUnitContext.CLOUD_SPACE_GDU_FORWARD_ONLY, Boolean.FALSE.toString()); if (LOGGER.isDebugEnabled()) { LOGGER.debug("[preRequestRecordUnitContext] gduNsNotExist. only forward to sdu, system:{}, service name:{}, unit context:{}", - system, serviceName, TencentUnitContext.getCompositeContextMap()); + system, serviceName, TencentUnitContext.getOriginCompositeContextMap()); } } else { @@ -108,7 +111,7 @@ public final class SpringCloudUnitUtils { setUnitContext(gduUnitId, gduNs, serviceName); if (LOGGER.isDebugEnabled()) { LOGGER.debug("[preRequestRecordUnitContext] cid or business system is empty. only forward to gdu, service name:{}, unit context:{}", - serviceName, TencentUnitContext.getCompositeContextMap()); + serviceName, TencentUnitContext.getOriginCompositeContextMap()); } return; } @@ -125,7 +128,7 @@ public final class SpringCloudUnitUtils { setUnitContext(gduUnitId, gduNs, serviceName); if (LOGGER.isDebugEnabled()) { LOGGER.debug("[preRequestRecordUnitContext] gdu first and exist instance. forward to gdu, service name:{}, unit context:{}", - serviceName, TencentUnitContext.getCompositeContextMap()); + serviceName, TencentUnitContext.getOriginCompositeContextMap()); } } } @@ -153,7 +156,7 @@ public final class SpringCloudUnitUtils { } if (LOGGER.isDebugEnabled()) { LOGGER.debug("[preRequestRecordUnitContext] do calculate customer num. service name:{}, unit context:{}", - serviceName, TencentUnitContext.getCompositeContextMap()); + serviceName, TencentUnitContext.getOriginCompositeContextMap()); } } } @@ -186,7 +189,7 @@ public final class SpringCloudUnitUtils { setCrossGduContext(gduUnitId, serviceName); if (LOGGER.isDebugEnabled()) { LOGGER.debug("[preRequestRecordUnitContext] gdu in other cloud, gdu unit id:{}, service name:{}, unit context:{}", - gduUnitId, serviceName, TencentUnitContext.getCompositeContextMap()); + gduUnitId, serviceName, TencentUnitContext.getOriginCompositeContextMap()); } return true; } @@ -207,7 +210,7 @@ public final class SpringCloudUnitUtils { if (checkUnitIdAndSetContext(destUnitId, system, serviceName)) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("[preRequestRecordUnitContext] unit id exist:{}. service name:{}, unit context:{}", - destUnitId, serviceName, TencentUnitContext.getCompositeContextMap()); + destUnitId, serviceName, TencentUnitContext.getOriginCompositeContextMap()); } return true; } @@ -231,7 +234,7 @@ public final class SpringCloudUnitUtils { if (StringUtils.isEmpty(sourceGrayUnitInfo) && CollectionUtils.isEmpty(TencentUnitManager.getGrayUnitRoutes())) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("[preRequestRecordGrayUnitContext] empty header gray info and empty gray unit routes," - + "unitContextMap:{}", TencentUnitContext.getCompositeContextMap()); + + "unitContextMap:{}", TencentUnitContext.getOriginCompositeContextMap()); } return null; } @@ -242,7 +245,7 @@ public final class SpringCloudUnitUtils { TencentUnitContext.setGrayUnitContext(grayMatchRouteUnitList); if (LOGGER.isDebugEnabled()) { LOGGER.debug("[preRequestRecordGrayUnitContext] using header gray, unitContextMap:{}", - TencentUnitContext.getCompositeContextMap()); + TencentUnitContext.getOriginCompositeContextMap()); } return null; } @@ -251,7 +254,7 @@ public final class SpringCloudUnitUtils { if (TencentUnitContext.grayContextIsEmpty()) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("[preRequestRecordGrayUnitContext] empty gray header, unitContextMap:{}", - TencentUnitContext.getCompositeContextMap()); + TencentUnitContext.getOriginCompositeContextMap()); } return null; } @@ -296,24 +299,19 @@ public final class SpringCloudUnitUtils { } if (LOGGER.isDebugEnabled()) { LOGGER.debug("[preRequestRecordGrayUnitContext] grayMatchRoute:{}, unitContextMap:{}", - grayMatchRoute, TencentUnitContext.getCompositeContextMap()); + grayMatchRoute, TencentUnitContext.getOriginCompositeContextMap()); } return routingUnit; } /** - * 如果没有 gdu 对应 ns,返回 null;如果目标 ns 为当前 ns,返回 serviceName;其他 ns 则返回 nsId/serviceName. + * 如果没有 gdu 对应 ns,返回 null;SCT 统一返回 nsId/serviceName. */ public static String getGduServiceId(String serviceName, String gduNsId) { if (StringUtils.isEmpty(gduNsId)) { return null; } - if (TencentUnitManager.checkLocalNamespace(gduNsId)) { - return serviceName; - } - else { - return gduNsId + "/" + serviceName; - } + return gduNsId + "/" + serviceName; } public static String getGduUnitId() { @@ -345,7 +343,7 @@ public final class SpringCloudUnitUtils { if (LOGGER.isDebugEnabled()) { LOGGER.debug("[getProxyInfoFromUnitHeader] parse unit from header. path:{}, unit context:{}", - path, TencentUnitContext.getCompositeContextMap()); + path, TencentUnitContext.getOriginCompositeContextMap()); } } @@ -433,7 +431,7 @@ public final class SpringCloudUnitUtils { if (LOGGER.isDebugEnabled()) { LOGGER.debug("[getProxyInfoFromCid] parse unit from cid. path:{}, unit context:{}", - path, TencentUnitContext.getCompositeContextMap()); + path, TencentUnitContext.getOriginCompositeContextMap()); } } diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/tsf/unit/core/TencentUnitContext.java b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/tsf/unit/core/TencentUnitContext.java index 54ae9ccbc..54bb4270f 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/tsf/unit/core/TencentUnitContext.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/tsf/unit/core/TencentUnitContext.java @@ -19,8 +19,12 @@ import java.util.Map; import java.util.Set; import com.fasterxml.jackson.core.type.TypeReference; +import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.util.JacksonUtils; +import com.tencent.cloud.common.util.MetadataContextUtils; import com.tencent.polaris.api.utils.StringUtils; +import com.tencent.polaris.metadata.core.MetadataObjectValue; +import com.tencent.polaris.metadata.core.MetadataType; import com.tencent.tsf.unit.core.model.UnitRouteInfo.GrayMatchRouteUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -108,19 +112,116 @@ public final class TencentUnitContext { * GRAY_PREFIX. */ public static final String GRAY_PREFIX = "gray."; + /** + * USER_CONTEXTS_KEY. + */ + private static final String USER_CONTEXTS_KEY = "USER_CONTEXTS"; + /** + * SYSTEM_CONTEXTS_KEY. + */ + private static final String SYSTEM_CONTEXTS_KEY = "SYSTEM_CONTEXTS"; + /** + * ROUTE_CONTEXTS_KEY. + */ + private static final String ROUTE_CONTEXTS_KEY = "ROUTE_CONTEXTS"; + /** + * SOURCE_CONTEXTS_KEY. + */ + private static final String SOURCE_CONTEXTS_KEY = "SOURCE_CONTEXTS"; + /** + * GRAY_USER_CONTEXTS_KEY. + */ + private static final String GRAY_USER_CONTEXTS_KEY = "GRAY_USER_CONTEXTS"; + /** + * GRAY_SYSTEM_CONTEXTS_KEY. + */ + private static final String GRAY_SYSTEM_CONTEXTS_KEY = "GRAY_SYSTEM_CONTEXTS"; + private static final Logger LOGGER = LoggerFactory.getLogger(TencentUnitContext.class); - // 用户标签,客户可以直接设置的 - private final static ThreadLocal> USER_CONTEXTS = ThreadLocal.withInitial(HashMap::new); - // 系统标签,用于中间的计算,部分需要传递 - private final static ThreadLocal> SYSTEM_CONTEXTS = ThreadLocal.withInitial(HashMap::new); - // 路由标签, key 为 CloudSpaceRoute 前缀的,提供给 TsfConsulReactiveCommonDiscoveryClient 做服务发现使用,无需传递 - private final static ThreadLocal> ROUTE_CONTEXTS = ThreadLocal.withInitial(HashMap::new); - // 上游标签,不需要放到 header 传递 - private final static ThreadLocal> SOURCE_CONTEXTS = ThreadLocal.withInitial(HashMap::new); - // 用户灰度标签,用于匹配灰度规则,不需要放到 header 传递 - private final static ThreadLocal> GRAY_USER_CONTEXTS = ThreadLocal.withInitial(HashMap::new); - // 灰度内部标签,不需要放到 header 传递 - private final static ThreadLocal> GRAY_SYSTEM_CONTEXTS = ThreadLocal.withInitial(HashMap::new); + + private static Map getUserContext() { + MetadataObjectValue> metadataObjectValue = MetadataContextHolder.get(). + getMetadataContainer(MetadataType.APPLICATION, true). + getMetadataValue(USER_CONTEXTS_KEY); + if (MetadataContextUtils.existMetadataValue(metadataObjectValue)) { + return metadataObjectValue.getObjectValue().get(); + } + else { + Map map = new HashMap<>(); + MetadataContextUtils.putMetadataObjectValue(USER_CONTEXTS_KEY, map); + return map; + } + } + + private static Map getSystemContext() { + MetadataObjectValue> metadataObjectValue = MetadataContextHolder.get(). + getMetadataContainer(MetadataType.APPLICATION, true). + getMetadataValue(SYSTEM_CONTEXTS_KEY); + if (MetadataContextUtils.existMetadataValue(metadataObjectValue)) { + return metadataObjectValue.getObjectValue().get(); + } + else { + Map map = new HashMap<>(); + MetadataContextUtils.putMetadataObjectValue(SYSTEM_CONTEXTS_KEY, map); + return map; + } + } + + private static Map getRouteContext() { + MetadataObjectValue> metadataObjectValue = MetadataContextHolder.get(). + getMetadataContainer(MetadataType.APPLICATION, true). + getMetadataValue(ROUTE_CONTEXTS_KEY); + if (MetadataContextUtils.existMetadataValue(metadataObjectValue)) { + return metadataObjectValue.getObjectValue().get(); + } + else { + Map map = new HashMap<>(); + MetadataContextUtils.putMetadataObjectValue(ROUTE_CONTEXTS_KEY, map); + return map; + } + } + + private static Map getSourceContext() { + MetadataObjectValue> metadataObjectValue = MetadataContextHolder.get(). + getMetadataContainer(MetadataType.APPLICATION, true). + getMetadataValue(SOURCE_CONTEXTS_KEY); + if (MetadataContextUtils.existMetadataValue(metadataObjectValue)) { + return metadataObjectValue.getObjectValue().get(); + } + else { + Map map = new HashMap<>(); + MetadataContextUtils.putMetadataObjectValue(SOURCE_CONTEXTS_KEY, map); + return map; + } + } + + private static Map getGrayUserContext() { + MetadataObjectValue> metadataObjectValue = MetadataContextHolder.get(). + getMetadataContainer(MetadataType.APPLICATION, true). + getMetadataValue(GRAY_USER_CONTEXTS_KEY); + if (MetadataContextUtils.existMetadataValue(metadataObjectValue)) { + return metadataObjectValue.getObjectValue().get(); + } + else { + Map map = new HashMap<>(); + MetadataContextUtils.putMetadataObjectValue(GRAY_USER_CONTEXTS_KEY, map); + return map; + } + } + + private static Map getGraySystemContext() { + MetadataObjectValue> metadataObjectValue = MetadataContextHolder.get(). + getMetadataContainer(MetadataType.APPLICATION, true). + getMetadataValue(GRAY_SYSTEM_CONTEXTS_KEY); + if (MetadataContextUtils.existMetadataValue(metadataObjectValue)) { + return metadataObjectValue.getObjectValue().get(); + } + else { + Map map = new HashMap<>(); + MetadataContextUtils.putMetadataObjectValue(GRAY_SYSTEM_CONTEXTS_KEY, map); + return map; + } + } private TencentUnitContext() { } @@ -131,19 +232,19 @@ public final class TencentUnitContext { } public static void putUserTag(String key, String value) { - USER_CONTEXTS.get().put(key, value); + getUserContext().put(key, value); } public static void putSystemTag(String key, String value) { - SYSTEM_CONTEXTS.get().put(key, value); + getSystemContext().put(key, value); } public static void putRouteTag(String key, Object value) { - ROUTE_CONTEXTS.get().put(key, value); + getRouteContext().put(key, value); } public static void putSourceTag(String key, String value) { - SOURCE_CONTEXTS.get().put(SOURCE_PREFIX + key, value); + getSourceContext().put(SOURCE_PREFIX + key, value); } public static void putGrayUserTags(String position, Map labels) { @@ -154,20 +255,20 @@ public final class TencentUnitContext { // 需要携带 position,做灰度路由匹配用的 public static void putGrayUserTag(String position, String key, String value) { - GRAY_USER_CONTEXTS.get().put(getGrayPositionPrefix(position) + key, value); + getGrayUserContext().put(getGrayPositionPrefix(position) + key, value); } // 传递灰度单元信息用的 public static void putGraySystemTag(String key, String value) { - GRAY_SYSTEM_CONTEXTS.get().put(getGrayPrefix() + key, value); + getGraySystemContext().put(getGrayPrefix() + key, value); } public static String getGraySystemTag(String key) { - return GRAY_SYSTEM_CONTEXTS.get().get(getGrayPrefix() + key); + return getGraySystemContext().get(getGrayPrefix() + key); } public static boolean grayContextIsEmpty() { - return GRAY_USER_CONTEXTS.get().isEmpty(); + return getGrayUserContext().isEmpty(); } public static String getGrayPositionPrefix(String position) { @@ -180,15 +281,15 @@ public final class TencentUnitContext { public static void putSystemTagsFromUser() { for (String key : CLOUD_SPACE_SYSTEM_FROM_USER_KEYS) { - if (USER_CONTEXTS.get().containsKey(key)) { - SYSTEM_CONTEXTS.get().put(key, USER_CONTEXTS.get().get(key)); + if (getUserContext().containsKey(key)) { + getSystemContext().put(key, getUserContext().get(key)); } } } public static void putSystemTags(Map tags) { for (Map.Entry tag : tags.entrySet()) { - SYSTEM_CONTEXTS.get().put(tag.getKey(), tag.getValue()); + getSystemContext().put(tag.getKey(), tag.getValue()); } } @@ -204,69 +305,77 @@ public final class TencentUnitContext { } public static String getUserTag(String key) { - return USER_CONTEXTS.get().get(key); + return getUserContext().get(key); } public static String getSystemTag(String key) { - return SYSTEM_CONTEXTS.get().get(key); + return getSystemContext().get(key); } public static Object getObjectRouteTag(String key) { - return ROUTE_CONTEXTS.get().get(key); + return getRouteContext().get(key); } public static String getStringRouteTag(String key) { - return (String) ROUTE_CONTEXTS.get().get(key); + return (String) getRouteContext().get(key); } public static boolean containRouteTag(String key) { - return ROUTE_CONTEXTS.get().containsKey(key); + return getRouteContext().containsKey(key); } public static void removeAll() { - USER_CONTEXTS.get().clear(); - SYSTEM_CONTEXTS.get().clear(); - ROUTE_CONTEXTS.get().clear(); - SOURCE_CONTEXTS.get().clear(); - GRAY_USER_CONTEXTS.get().clear(); - GRAY_SYSTEM_CONTEXTS.get().clear(); + getUserContext().clear(); + getSystemContext().clear(); + getRouteContext().clear(); + getSourceContext().clear(); + getGrayUserContext().clear(); + getGraySystemContext().clear(); } public static void clearGrayUserContext() { - GRAY_USER_CONTEXTS.get().clear(); + getGrayUserContext().clear(); } /** * 清理客户直接设置或直接影响的 key. */ public static void clearUserTags() { - USER_CONTEXTS.get().remove(CLOUD_SPACE_TARGET_UNIT_ID); - USER_CONTEXTS.get().remove(CLOUD_SPACE_CUSTOMER_IDENTIFIER); - USER_CONTEXTS.get().remove(CLOUD_SPACE_TARGET_SYSTEM); + getUserContext().remove(CLOUD_SPACE_TARGET_UNIT_ID); + getUserContext().remove(CLOUD_SPACE_CUSTOMER_IDENTIFIER); + getUserContext().remove(CLOUD_SPACE_TARGET_SYSTEM); } public static void setUnitCompositeContextMap(UnitCompositeContextMap unitCompositeContextMap) { removeAll(); - USER_CONTEXTS.get().putAll(unitCompositeContextMap.getUserContext()); - SYSTEM_CONTEXTS.get().putAll(unitCompositeContextMap.getSystemContext()); - SOURCE_CONTEXTS.get().putAll(unitCompositeContextMap.getSourceContext()); - GRAY_USER_CONTEXTS.get().putAll(unitCompositeContextMap.getGrayUserContext()); - GRAY_SYSTEM_CONTEXTS.get().putAll(unitCompositeContextMap.getGraySystemContext()); + getUserContext().putAll(unitCompositeContextMap.getUserContext()); + getSystemContext().putAll(unitCompositeContextMap.getSystemContext()); + getSourceContext().putAll(unitCompositeContextMap.getSourceContext()); + getGrayUserContext().putAll(unitCompositeContextMap.getGrayUserContext()); + getGraySystemContext().putAll(unitCompositeContextMap.getGraySystemContext()); } public static UnitCompositeContextMap getCompositeContextMap() { - return new UnitCompositeContextMap(USER_CONTEXTS.get(), SYSTEM_CONTEXTS.get(), ROUTE_CONTEXTS.get(), - SOURCE_CONTEXTS.get(), GRAY_USER_CONTEXTS.get(), GRAY_SYSTEM_CONTEXTS.get()); + return new UnitCompositeContextMap(new HashMap<>(getUserContext()), new HashMap<>(getSystemContext()), new HashMap<>(getRouteContext()), + new HashMap<>(getSourceContext()), new HashMap<>(getGrayUserContext()), new HashMap<>(getGraySystemContext())); + } + + /** + * Internal Use. + */ + public static UnitCompositeContextMap getOriginCompositeContextMap() { + return new UnitCompositeContextMap(getUserContext(), getSystemContext(), getRouteContext(), + getSourceContext(), getGrayUserContext(), getGraySystemContext()); } public static String getSourceTag(String key) { - return SOURCE_CONTEXTS.get().get(SOURCE_PREFIX + key); + return getSourceContext().get(SOURCE_PREFIX + key); } public static String getGrayTag(String position, String key) { - return GRAY_USER_CONTEXTS.get().get(getGrayPositionPrefix(position) + key); + return getGrayUserContext().get(getGrayPositionPrefix(position) + key); } public static List parseGrayMatchRouteUnitList() { diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/tsf/unit/core/utils/TencentUnitUtils.java b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/tsf/unit/core/utils/TencentUnitUtils.java index 5f656bd75..8f8bb8e58 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/tsf/unit/core/utils/TencentUnitUtils.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-unit-plugin/src/main/java/com/tencent/tsf/unit/core/utils/TencentUnitUtils.java @@ -16,6 +16,9 @@ import java.util.List; import java.util.Map; import com.tencent.polaris.api.utils.StringUtils; +import com.tencent.polaris.metadata.core.TransitiveType; +import com.tencent.polaris.metadata.core.manager.CalleeMetadataContainerGroup; +import com.tencent.polaris.plugins.connector.common.constant.ConsulConstant; import com.tencent.tsf.unit.core.TencentUnitContext; import com.tencent.tsf.unit.core.TencentUnitContext.UnitCompositeContextMap; import com.tencent.tsf.unit.core.TencentUnitManager; @@ -247,9 +250,11 @@ public final class TencentUnitUtils { } /** - * tsf spring cloud 普通应用通过注解开启,网关默认都开启. + * tsf spring cloud 普通应用通过注解开启初始化,网关默认都初始化. */ public static void enable() { + CalleeMetadataContainerGroup.getStaticApplicationMetadataContainer(). + putMetadataStringValue(ConsulConstant.NAMESPACE_TYPE_KEY, ConsulConstant.NAMESPACE_TYPE_DEFAULT, TransitiveType.NONE); TencentUnitManager.setEnable(true); TsfUnitConsulManager.init(); }