From 6d595e4375f92495c4f162fa2df1750f5acd7f07 Mon Sep 17 00:00:00 2001 From: misselvexu Date: Wed, 13 Jul 2022 12:23:35 +0800 Subject: [PATCH] Optimize disposable metadata transfer logic . --- .../DecodeTransferMetadataReactiveFilter.java | 1 - .../EncodeTransferMedataFeignInterceptor.java | 1 - .../EncodeTransferMetadataZuulFilter.java | 1 - .../common/constant/MetadataConstant.java | 12 +++++-- .../common/metadata/MetadataContext.java | 1 + .../metadata/StaticMetadataManager.java | 31 ++++++++++++++++++- .../common/spi/InstanceMetadataProvider.java | 7 +++++ 7 files changed, 48 insertions(+), 6 deletions(-) diff --git a/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/DecodeTransferMetadataReactiveFilter.java b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/DecodeTransferMetadataReactiveFilter.java index 8bfe1a7fc..605f3269e 100644 --- a/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/DecodeTransferMetadataReactiveFilter.java +++ b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/DecodeTransferMetadataReactiveFilter.java @@ -97,5 +97,4 @@ public class DecodeTransferMetadataReactiveFilter implements WebFilter, Ordered return JacksonUtils.deserialize2Map(customMetadataStr); } - } diff --git a/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMedataFeignInterceptor.java b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMedataFeignInterceptor.java index 94239e750..a6af9e15e 100644 --- a/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMedataFeignInterceptor.java +++ b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMedataFeignInterceptor.java @@ -71,5 +71,4 @@ public class EncodeTransferMedataFeignInterceptor implements RequestInterceptor, } } } - } diff --git a/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMetadataZuulFilter.java b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMetadataZuulFilter.java index ec288da0a..ea75d0176 100644 --- a/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMetadataZuulFilter.java +++ b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMetadataZuulFilter.java @@ -79,5 +79,4 @@ public class EncodeTransferMetadataZuulFilter extends ZuulFilter { } return null; } - } diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/MetadataConstant.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/MetadataConstant.java index 89f2c79dd..ab2b36138 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/MetadataConstant.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/MetadataConstant.java @@ -26,6 +26,12 @@ import org.springframework.core.Ordered; */ public final class MetadataConstant { + /** + * Default Private Constructor. + */ + private MetadataConstant() { + } + /** * sct transitive header prefix. */ @@ -44,9 +50,11 @@ public final class MetadataConstant { */ public static final int POLARIS_TRANSITIVE_HEADER_PREFIX_LENGTH = POLARIS_TRANSITIVE_HEADER_PREFIX.length(); - private MetadataConstant() { + /** + * internal metadata disposable status key. + */ + public static final String INTERNAL_METADATA_DISPOSABLE = "internal-disposable-status"; - } /** * Order of filter, interceptor, ... */ diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContext.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContext.java index c172e4832..536fc4ffc 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContext.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContext.java @@ -40,6 +40,7 @@ public class MetadataContext { * transitive context. */ public static final String FRAGMENT_TRANSITIVE = "transitive"; + private static final Logger LOG = LoggerFactory.getLogger(MetadataContext.class); /** * Namespace of local instance. diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/StaticMetadataManager.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/StaticMetadataManager.java index a717db436..3d379a2c1 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/StaticMetadataManager.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/StaticMetadataManager.java @@ -18,6 +18,7 @@ package com.tencent.cloud.common.metadata; +import java.io.UnsupportedEncodingException; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -32,6 +33,11 @@ import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; +import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; +import static com.tencent.cloud.common.constant.MetadataConstant.INTERNAL_METADATA_DISPOSABLE; +import static com.tencent.cloud.common.util.JacksonUtils.serialize2Json; +import static java.net.URLEncoder.encode; + /** * manage metadata from env/config file/custom spi. * @@ -63,7 +69,7 @@ public class StaticMetadataManager { private Map configTransitiveMetadata; private Map customSPIMetadata; private Map customSPITransitiveMetadata; - + private Map disposableStatusMetadata; private Map mergedStaticMetadata; private Map mergedStaticTransitiveMetadata; private String zone; @@ -80,6 +86,8 @@ public class StaticMetadataManager { parseLocationMetadata(metadataLocalProperties, instanceMetadataProvider); + parseDisposableStatusMetadata(metadataLocalProperties); + merge(); LOGGER.info("[SCT] Loaded static metadata info. {}", this); @@ -164,6 +172,19 @@ public class StaticMetadataManager { customSPITransitiveMetadata = Collections.unmodifiableMap(transitiveMetadata); } + private void parseDisposableStatusMetadata(MetadataLocalProperties metadataLocalProperties) { + Map allMetadata = metadataLocalProperties.getContent(); + List disposableKeys = metadataLocalProperties.getDisposable(); + + Map result = new HashMap<>(); + for (String key : disposableKeys) { + if (allMetadata.containsKey(key)) { + result.put(key, "false"); + } + } + disposableStatusMetadata = Collections.unmodifiableMap(result); + } + private void merge() { // the priority is : custom > env > config Map mergedMetadataResult = new HashMap<>(); @@ -181,6 +202,14 @@ public class StaticMetadataManager { mergedTransitiveMetadataResult.putAll(envTransitiveMetadata); mergedTransitiveMetadataResult.putAll(customSPITransitiveMetadata); + // append disposable status + try { + mergedTransitiveMetadataResult.put(INTERNAL_METADATA_DISPOSABLE, encode(serialize2Json(disposableStatusMetadata), UTF_8)); + } + catch (UnsupportedEncodingException e) { + LOGGER.error("Runtime system does not support utf-8 coding.", e); + } + this.mergedStaticTransitiveMetadata = Collections.unmodifiableMap(mergedTransitiveMetadataResult); } diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/spi/InstanceMetadataProvider.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/spi/InstanceMetadataProvider.java index 5434aa140..44cfaf605 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/spi/InstanceMetadataProvider.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/spi/InstanceMetadataProvider.java @@ -43,6 +43,13 @@ public interface InstanceMetadataProvider { return Collections.emptySet(); } + /** + * @return the keys of disposable metadata. + */ + default Set getDisposableMetadataKeys() { + return Collections.emptySet(); + } + /** * The region of current instance. *