From 506b3267ea5b4f71650518f7292454c9c7307147 Mon Sep 17 00:00:00 2001 From: misselvexu Date: Wed, 13 Jul 2022 21:16:10 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20the=20issue=20of=20repeatedly=20passing?= =?UTF-8?q?=20one-time=20key=20=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DecodeTransferMetadataServletFilter.java | 5 +- .../common/constant/MetadataConstant.java | 2 +- .../metadata/MetadataContextHolder.java | 70 ++++++++++--------- .../metadata/StaticMetadataManager.java | 10 +-- .../callee/MetadataCalleeController.java | 14 ++-- ...rvice.java => MetadataCalleeService2.java} | 4 +- ...va => MetadataCalleeService2Fallback.java} | 2 +- .../src/main/resources/bootstrap.yml | 5 ++ .../src/main/resources/bootstrap.yml | 2 +- 9 files changed, 62 insertions(+), 52 deletions(-) rename spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/{MetadataCallee2Service.java => MetadataCalleeService2.java} (92%) rename spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/{MetadataCallee2ServiceFallback.java => MetadataCalleeService2Fallback.java} (93%) diff --git a/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/DecodeTransferMetadataServletFilter.java b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/DecodeTransferMetadataServletFilter.java index b82f028d7..f19fec148 100644 --- a/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/DecodeTransferMetadataServletFilter.java +++ b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/DecodeTransferMetadataServletFilter.java @@ -36,6 +36,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; +import org.springframework.lang.NonNull; import org.springframework.util.StringUtils; import org.springframework.web.filter.OncePerRequestFilter; @@ -53,8 +54,8 @@ public class DecodeTransferMetadataServletFilter extends OncePerRequestFilter { private static final Logger LOG = LoggerFactory.getLogger(DecodeTransferMetadataServletFilter.class); @Override - protected void doFilterInternal(HttpServletRequest httpServletRequest, - HttpServletResponse httpServletResponse, FilterChain filterChain) + protected void doFilterInternal(@NonNull HttpServletRequest httpServletRequest, + @NonNull HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { Map internalTransitiveMetadata = getInternalTransitiveMetadata(httpServletRequest); Map customTransitiveMetadata = CustomTransitiveMetadataResolver.resolve(httpServletRequest); 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 80d4b8f36..fcef4e3f8 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 @@ -35,7 +35,7 @@ public final class MetadataConstant { /** * internal metadata disposable status key. */ - public static final String INTERNAL_METADATA_DISPOSABLE = "internal-disposable-status"; + public static final String INTERNAL_METADATA_DISPOSABLE = "internal-metadata-disposable-status"; /** * Order of filter, interceptor, ... diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContextHolder.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContextHolder.java index 1fc4e6ef5..66c48e4f3 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContextHolder.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/MetadataContextHolder.java @@ -22,6 +22,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.Set; import com.tencent.cloud.common.metadata.config.MetadataLocalProperties; import com.tencent.cloud.common.util.ApplicationContextAwareUtils; @@ -31,12 +32,9 @@ import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; -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.deserialize2Map; import static com.tencent.cloud.common.util.JacksonUtils.serialize2Json; -import static java.net.URLDecoder.decode; -import static java.net.URLEncoder.encode; /** * Metadata Context Holder. @@ -103,44 +101,52 @@ public final class MetadataContextHolder { // Save transitive metadata to ThreadLocal. if (!CollectionUtils.isEmpty(dynamicTransitiveMetadata)) { - // processing disposable keys - if (dynamicTransitiveMetadata.containsKey(INTERNAL_METADATA_DISPOSABLE)) { - String disposableKeyStatus = dynamicTransitiveMetadata.get(INTERNAL_METADATA_DISPOSABLE); - try { - if (StringUtils.hasText(disposableKeyStatus)) { - Map keyStatus = deserialize2Map(decode(disposableKeyStatus, UTF_8)); - Iterator> it = keyStatus.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry entry = it.next(); - String key = entry.getKey(); - boolean status = Boolean.parseBoolean(entry.getValue()); - if (!status) { - keyStatus.put(key, "true"); - } - else { - // removed disposable key - dynamicTransitiveMetadata.remove(key); - it.remove(); - } + // Check local static metadata . + Map localTransitives = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + String localDisposable = localTransitives.get(INTERNAL_METADATA_DISPOSABLE); + Map localValidDisposables = new HashMap<>(); + if (StringUtils.hasText(localDisposable)) { + Set disposables = deserialize2Map(localDisposable).keySet(); + for (String disposable : disposables) { + localValidDisposables.put(disposable, localTransitives.containsKey(disposable)); + } + } + + // processing disposable keys . + String disposableKeyStatus = dynamicTransitiveMetadata.get(INTERNAL_METADATA_DISPOSABLE); + if (StringUtils.hasText(disposableKeyStatus)) { + Map keyStatus = deserialize2Map(disposableKeyStatus); + Iterator> it = keyStatus.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + String key = entry.getKey(); + boolean status = Boolean.parseBoolean(entry.getValue()); + if (!localValidDisposables.containsKey(key)) { + if (!status) { + keyStatus.put(key, "true"); + } + else { + // removed disposable key + dynamicTransitiveMetadata.remove(key); + it.remove(); } - // reset - dynamicTransitiveMetadata.put(INTERNAL_METADATA_DISPOSABLE, encode(serialize2Json(keyStatus), UTF_8)); + } + else { + // removed disposable key + dynamicTransitiveMetadata.remove(key); + keyStatus.put(key, "false"); } } - catch (Exception e) { - LOGGER.error("Runtime system does not support utf-8 coding.", e); - } - + // reset + dynamicTransitiveMetadata.put(INTERNAL_METADATA_DISPOSABLE, serialize2Json(keyStatus)); } - Map staticTransitiveMetadata = - metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + Map staticTransitiveMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); Map mergedTransitiveMetadata = new HashMap<>(); mergedTransitiveMetadata.putAll(staticTransitiveMetadata); mergedTransitiveMetadata.putAll(dynamicTransitiveMetadata); - metadataContext.putFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE, - Collections.unmodifiableMap(mergedTransitiveMetadata)); + metadataContext.putFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE, Collections.unmodifiableMap(mergedTransitiveMetadata)); } MetadataContextHolder.set(metadataContext); } 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 3d379a2c1..7e5a7cf85 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,7 +18,6 @@ package com.tencent.cloud.common.metadata; -import java.io.UnsupportedEncodingException; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -33,10 +32,8 @@ 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. @@ -203,12 +200,7 @@ public class StaticMetadataManager { 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); - } + mergedTransitiveMetadataResult.put(INTERNAL_METADATA_DISPOSABLE, serialize2Json(disposableStatusMetadata)); this.mergedStaticTransitiveMetadata = Collections.unmodifiableMap(mergedTransitiveMetadataResult); } diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeController.java b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeController.java index 51ba2e9d7..41e8ae3b5 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeController.java +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeController.java @@ -44,12 +44,12 @@ public class MetadataCalleeController { @Value("${server.port:0}") private int port; - private final MetadataCallee2Service metadataCallee2Service; + private final MetadataCalleeService2 metadataCalleeService2; private final RestTemplate restTemplate; - public MetadataCalleeController(MetadataCallee2Service metadataCallee2Service, RestTemplate restTemplate) { - this.metadataCallee2Service = metadataCallee2Service; + public MetadataCalleeController(MetadataCalleeService2 metadataCalleeService2, RestTemplate restTemplate) { + this.metadataCalleeService2 = metadataCalleeService2; this.restTemplate = restTemplate; } @@ -66,7 +66,13 @@ public class MetadataCalleeController { "http://MetadataCalleeService2/metadata/service/callee2/info", Map.class); calleeMetadata.forEach((key, value) -> { - LOG.info("Callee2 Metadata (Key-Value): {} : {}", key, value); + LOG.info("RestTemplate Callee2 Metadata (Key-Value): {} : {}", key, value); + }); + + // Call remote service with Feign + Map calleeMetadata2 = metadataCalleeService2.info(); + calleeMetadata2.forEach((key, value) -> { + LOG.info("Feign Callee2 Metadata (Key-Value): {} : {}", key, value); }); // Get Custom Metadata From Context diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCallee2Service.java b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeService2.java similarity index 92% rename from spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCallee2Service.java rename to spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeService2.java index 221e619f8..eebb427e9 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCallee2Service.java +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeService2.java @@ -28,8 +28,8 @@ import org.springframework.web.bind.annotation.GetMapping; * @author Palmer Xu */ @FeignClient(value = "MetadataCalleeService2", - fallback = MetadataCallee2ServiceFallback.class) -public interface MetadataCallee2Service { + fallback = MetadataCalleeService2Fallback.class) +public interface MetadataCalleeService2 { /** * Get information of callee. diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCallee2ServiceFallback.java b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeService2Fallback.java similarity index 93% rename from spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCallee2ServiceFallback.java rename to spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeService2Fallback.java index b18ce6de3..45f7a8b44 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCallee2ServiceFallback.java +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeService2Fallback.java @@ -29,7 +29,7 @@ import org.springframework.stereotype.Component; * @author Palmer Xu */ @Component -public class MetadataCallee2ServiceFallback implements MetadataCallee2Service { +public class MetadataCalleeService2Fallback implements MetadataCalleeService2 { @Override public Map info() { diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/resources/bootstrap.yml index f0cada36a..cd045ea55 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/resources/bootstrap.yml @@ -19,9 +19,14 @@ spring: CUSTOM-METADATA-KEY-LOCAL-2: CUSTOM-VALUE-LOCAL-2 # Example: transitive CUSTOM-METADATA-KEY-TRANSITIVE-2: CUSTOM-VALUE-TRANSITIVE-2 + # Example: disposable +# CUSTOM-METADATA-KEY-DISPOSABLE: CUSTOM-VALUE-DISPOSABLE-CALLEE # Assigned which metadata key-value will be passed along the link transitive: - CUSTOM-METADATA-KEY-TRANSITIVE-2 +# - CUSTOM-METADATA-KEY-DISPOSABLE + disposable: + - CUSTOM-METADATA-KEY-DISPOSABLE management: endpoints: diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-caller-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-caller-service/src/main/resources/bootstrap.yml index 62927b121..df40cbab7 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-caller-service/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-caller-service/src/main/resources/bootstrap.yml @@ -19,7 +19,7 @@ spring: content: # Example: intransitive CUSTOM-METADATA-KEY-LOCAL: CUSTOM-VALUE-LOCAL - # + # Example: disposable CUSTOM-METADATA-KEY-DISPOSABLE: CUSTOM-VALUE-DISPOSABLE # Example: transitive CUSTOM-METADATA-KEY-TRANSITIVE: CUSTOM-VALUE-TRANSITIVE