From 1173cb4f1e40ccc3d9d62506b215286bdd01c128 Mon Sep 17 00:00:00 2001 From: misselvexu Date: Tue, 12 Jul 2022 21:24:25 +0800 Subject: [PATCH 1/9] Add metadata disposable support . --- .../metadata/config/MetadataLocalProperties.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/config/MetadataLocalProperties.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/config/MetadataLocalProperties.java index 0d0039bc3..2964e0178 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/config/MetadataLocalProperties.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/config/MetadataLocalProperties.java @@ -43,6 +43,11 @@ public class MetadataLocalProperties { */ private List transitive; + /** + * A disposable metadata key list . + */ + private List disposable; + public Map getContent() { if (CollectionUtils.isEmpty(content)) { content = new HashMap<>(); @@ -64,4 +69,15 @@ public class MetadataLocalProperties { public void setTransitive(List transitive) { this.transitive = transitive; } + + public List getDisposable() { + if (CollectionUtils.isEmpty(disposable)) { + disposable = new ArrayList<>(); + } + return disposable; + } + + public void setDisposable(List disposable) { + this.disposable = disposable; + } } From 4bd882cb03c20c54a1f3985fd661c15e4b7fd042 Mon Sep 17 00:00:00 2001 From: misselvexu Date: Wed, 13 Jul 2022 12:23:35 +0800 Subject: [PATCH 2/9] Optimize disposable metadata transfer logic . --- .../DecodeTransferMetadataReactiveFilter.java | 1 - .../EncodeTransferMedataFeignInterceptor.java | 1 - .../EncodeTransferMetadataZuulFilter.java | 1 - .../common/constant/MetadataConstant.java | 11 +++++++ .../common/metadata/MetadataContext.java | 1 + .../metadata/StaticMetadataManager.java | 31 ++++++++++++++++++- .../common/spi/InstanceMetadataProvider.java | 7 +++++ 7 files changed, 49 insertions(+), 4 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 09e17e1e8..80d4b8f36 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,17 @@ import org.springframework.core.Ordered; */ public final class MetadataConstant { + /** + * Default private constructor . + */ + 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. * From ce8c84638a8f8d3f049b8a1786111fd731e64a91 Mon Sep 17 00:00:00 2001 From: misselvexu Date: Wed, 13 Jul 2022 15:58:09 +0800 Subject: [PATCH 3/9] Add disposable key clean logic --- .../DecodeTransferMetadataServletFilter.java | 9 +---- .../metadata/MetadataContextHolder.java | 39 +++++++++++++++++++ 2 files changed, 41 insertions(+), 7 deletions(-) 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 3abf391e3..b82f028d7 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 @@ -63,14 +63,9 @@ public class DecodeTransferMetadataServletFilter extends OncePerRequestFilter { mergedTransitiveMetadata.putAll(internalTransitiveMetadata); mergedTransitiveMetadata.putAll(customTransitiveMetadata); - try { - MetadataContextHolder.init(mergedTransitiveMetadata); + MetadataContextHolder.init(mergedTransitiveMetadata); - filterChain.doFilter(httpServletRequest, httpServletResponse); - } - catch (IOException | ServletException | RuntimeException e) { - throw e; - } + filterChain.doFilter(httpServletRequest, httpServletResponse); } private Map getInternalTransitiveMetadata(HttpServletRequest httpServletRequest) { 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 e92c526b3..e4ac40359 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 @@ -20,12 +20,21 @@ package com.tencent.cloud.common.metadata; import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import com.tencent.cloud.common.metadata.config.MetadataLocalProperties; import com.tencent.cloud.common.util.ApplicationContextAwareUtils; +import org.slf4j.Logger; +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 java.net.URLDecoder.decode; /** * Metadata Context Holder. @@ -34,6 +43,8 @@ import org.springframework.util.CollectionUtils; */ public final class MetadataContextHolder { + private static final Logger LOGGER = LoggerFactory.getLogger(MetadataContextHolder.class); + private static final ThreadLocal METADATA_CONTEXT = new InheritableThreadLocal<>(); private static MetadataLocalProperties metadataLocalProperties; @@ -89,6 +100,34 @@ 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(); + } + } + } + } + catch (Exception e) { + LOGGER.error("Runtime system does not support utf-8 coding.", e); + } + } + Map staticTransitiveMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); Map mergedTransitiveMetadata = new HashMap<>(); From dae4726f001020a75362e0958fce4726f24ad40c Mon Sep 17 00:00:00 2001 From: misselvexu Date: Wed, 13 Jul 2022 17:15:06 +0800 Subject: [PATCH 4/9] Add disposable samples . --- .../metadata/MetadataContextHolder.java | 6 ++ .../callee/MetadataCallee2Service.java | 41 ++++++++++++ .../MetadataCallee2ServiceFallback.java | 39 +++++++++++ .../callee/MetadataCalleeController.java | 18 +++++ .../service/callee/MetadataCalleeService.java | 11 ++++ .../src/main/resources/bootstrap.yml | 20 +++++- .../metadata-callee-service2/pom.xml | 51 +++++++++++++++ .../callee/MetadataCalleeController.java | 65 +++++++++++++++++++ .../callee/MetadataCalleeService2.java | 35 ++++++++++ .../src/main/resources/bootstrap.yml | 20 ++++++ .../src/main/resources/bootstrap.yml | 7 +- .../metadata-transfer-example/pom.xml | 1 + 12 files changed, 312 insertions(+), 2 deletions(-) create mode 100644 spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCallee2Service.java create mode 100644 spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCallee2ServiceFallback.java create mode 100644 spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/pom.xml create mode 100644 spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeController.java create mode 100644 spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeService2.java create mode 100644 spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/resources/bootstrap.yml 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 e4ac40359..17bce8e04 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 @@ -18,6 +18,7 @@ package com.tencent.cloud.common.metadata; +import java.net.URLEncoder; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; @@ -34,7 +35,9 @@ 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. @@ -121,11 +124,14 @@ public final class MetadataContextHolder { it.remove(); } } + // reset + dynamicTransitiveMetadata.put(INTERNAL_METADATA_DISPOSABLE, encode(serialize2Json(keyStatus), UTF_8)); } } catch (Exception e) { LOGGER.error("Runtime system does not support utf-8 coding.", e); } + } Map staticTransitiveMetadata = 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/MetadataCallee2Service.java new file mode 100644 index 000000000..221e619f8 --- /dev/null +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCallee2Service.java @@ -0,0 +1,41 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package com.tencent.cloud.metadata.service.callee; + +import java.util.Map; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * Metadata callee feign client. + * + * @author Palmer Xu + */ +@FeignClient(value = "MetadataCalleeService2", + fallback = MetadataCallee2ServiceFallback.class) +public interface MetadataCallee2Service { + + /** + * Get information of callee. + * @return information of callee + */ + @GetMapping("/metadata/service/callee2/info") + Map info(); + +} 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/MetadataCallee2ServiceFallback.java new file mode 100644 index 000000000..b18ce6de3 --- /dev/null +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCallee2ServiceFallback.java @@ -0,0 +1,39 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package com.tencent.cloud.metadata.service.callee; + +import java.util.Map; + +import com.google.common.collect.Maps; + +import org.springframework.stereotype.Component; + +/** + * Metadata callee feign client fallback. + * + * @author Palmer Xu + */ +@Component +public class MetadataCallee2ServiceFallback implements MetadataCallee2Service { + + @Override + public Map info() { + return Maps.newHashMap(); + } + +} 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 4966e9bdc..51ba2e9d7 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 @@ -28,6 +28,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; /** * Metadata callee controller. @@ -43,6 +44,15 @@ public class MetadataCalleeController { @Value("${server.port:0}") private int port; + private final MetadataCallee2Service metadataCallee2Service; + + private final RestTemplate restTemplate; + + public MetadataCalleeController(MetadataCallee2Service metadataCallee2Service, RestTemplate restTemplate) { + this.metadataCallee2Service = metadataCallee2Service; + this.restTemplate = restTemplate; + } + /** * Get information of callee. * @return information of callee @@ -51,6 +61,14 @@ public class MetadataCalleeController { public Map info() { LOG.info("Metadata Service Callee [{}] is called.", port); + // Call remote service with RestTemplate + Map calleeMetadata = restTemplate.getForObject( + "http://MetadataCalleeService2/metadata/service/callee2/info", + Map.class); + calleeMetadata.forEach((key, value) -> { + LOG.info("Callee2 Metadata (Key-Value): {} : {}", key, value); + }); + // Get Custom Metadata From Context MetadataContext context = MetadataContextHolder.get(); Map customMetadataMap = context.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeService.java b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeService.java index 06771a5e8..6858ada26 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeService.java +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeService.java @@ -19,6 +19,10 @@ package com.tencent.cloud.metadata.service.callee; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Bean; +import org.springframework.web.client.RestTemplate; /** * Metadata callee application. @@ -26,10 +30,17 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * @author Palmer Xu */ @SpringBootApplication +@EnableFeignClients public class MetadataCalleeService { public static void main(String[] args) { SpringApplication.run(MetadataCalleeService.class, args); } + @Bean + @LoadBalanced + public RestTemplate restTemplate() { + return new RestTemplate(); + } + } 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 85c842c7c..f0cada36a 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 @@ -5,9 +5,27 @@ spring: name: MetadataCalleeService cloud: polaris: - address: grpc://183.47.111.80:8091 + address: grpc://127.0.0.1:8091 namespace: default enabled: true discovery: enabled: true register: true + tencent: + metadata: + # Defined your metadata keys & values + content: + # Example: intransitive + CUSTOM-METADATA-KEY-LOCAL-2: CUSTOM-VALUE-LOCAL-2 + # Example: transitive + CUSTOM-METADATA-KEY-TRANSITIVE-2: CUSTOM-VALUE-TRANSITIVE-2 + # Assigned which metadata key-value will be passed along the link + transitive: + - CUSTOM-METADATA-KEY-TRANSITIVE-2 + +management: + endpoints: + web: + exposure: + include: + - polaris-metadata \ No newline at end of file diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/pom.xml b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/pom.xml new file mode 100644 index 000000000..2af871c5b --- /dev/null +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/pom.xml @@ -0,0 +1,51 @@ + + + + metadata-transfer-example + com.tencent.cloud + ${revision} + ../pom.xml + + 4.0.0 + + metadata-callee-service2 + Spring Cloud Tencent Metadata Transfer Callee Service 2 + + + + com.tencent.cloud + spring-cloud-starter-tencent-polaris-discovery + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.0 + + + attach-sources + + jar + + + + + + + diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeController.java b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeController.java new file mode 100644 index 000000000..106cb0638 --- /dev/null +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeController.java @@ -0,0 +1,65 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package com.tencent.cloud.metadata.service.callee; + +import java.util.Map; + +import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.cloud.common.metadata.MetadataContextHolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Metadata callee controller. + * + * @author Palmer Xu + */ +@RestController +@RequestMapping("/metadata/service/callee2") +public class MetadataCalleeController { + + private static final Logger LOG = LoggerFactory.getLogger(MetadataCalleeController.class); + + @Value("${server.port:0}") + private int port; + + /** + * Get information of callee. + * @return information of callee + */ + @GetMapping("/info") + public Map info() { + LOG.info("Metadata Service Callee-2 [{}] is called.", port); + + // Get Custom Metadata From Context + MetadataContext context = MetadataContextHolder.get(); + Map customMetadataMap = context.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + + customMetadataMap.forEach((key, value) -> { + LOG.info("Custom Metadata (Key-Value): {} : {}", key, value); + }); + + return customMetadataMap; + } + +} diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeService2.java b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeService2.java new file mode 100644 index 000000000..69c0b2168 --- /dev/null +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/java/com/tencent/cloud/metadata/service/callee/MetadataCalleeService2.java @@ -0,0 +1,35 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package com.tencent.cloud.metadata.service.callee; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Metadata callee application. + * + * @author Palmer Xu + */ +@SpringBootApplication +public class MetadataCalleeService2 { + + public static void main(String[] args) { + SpringApplication.run(MetadataCalleeService2.class, args); + } + +} diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/resources/bootstrap.yml new file mode 100644 index 000000000..1506d6457 --- /dev/null +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/resources/bootstrap.yml @@ -0,0 +1,20 @@ +server: + port: 48088 +spring: + application: + name: MetadataCalleeService2 + cloud: + polaris: + address: grpc://127.0.0.1:8091 + namespace: default + enabled: true + discovery: + enabled: true + register: true + +management: + endpoints: + web: + exposure: + include: + - polaris-metadata \ No newline at end of file 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 a390f51a6..62927b121 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 @@ -5,7 +5,7 @@ spring: name: MetadataCallerService cloud: polaris: - address: grpc://183.47.111.80:8091 + address: grpc://127.0.0.1:8091 namespace: default enabled: true discovery: @@ -19,11 +19,16 @@ spring: content: # Example: intransitive CUSTOM-METADATA-KEY-LOCAL: CUSTOM-VALUE-LOCAL + # + CUSTOM-METADATA-KEY-DISPOSABLE: CUSTOM-VALUE-DISPOSABLE # Example: transitive CUSTOM-METADATA-KEY-TRANSITIVE: CUSTOM-VALUE-TRANSITIVE # Assigned which metadata key-value will be passed along the link transitive: - CUSTOM-METADATA-KEY-TRANSITIVE + - CUSTOM-METADATA-KEY-DISPOSABLE + disposable: + - CUSTOM-METADATA-KEY-DISPOSABLE management: endpoints: web: diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/pom.xml b/spring-cloud-tencent-examples/metadata-transfer-example/pom.xml index bd2b961ec..d692fdce4 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/pom.xml +++ b/spring-cloud-tencent-examples/metadata-transfer-example/pom.xml @@ -16,6 +16,7 @@ metadata-callee-service + metadata-callee-service2 metadata-caller-service From af672367c57b34e85f0a6de64c7af36647736025 Mon Sep 17 00:00:00 2001 From: misselvexu Date: Wed, 13 Jul 2022 17:16:42 +0800 Subject: [PATCH 5/9] Removed useless imports . --- .../com/tencent/cloud/common/metadata/MetadataContextHolder.java | 1 - 1 file changed, 1 deletion(-) 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 17bce8e04..1fc4e6ef5 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 @@ -18,7 +18,6 @@ package com.tencent.cloud.common.metadata; -import java.net.URLEncoder; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; From 506b3267ea5b4f71650518f7292454c9c7307147 Mon Sep 17 00:00:00 2001 From: misselvexu Date: Wed, 13 Jul 2022 21:16:10 +0800 Subject: [PATCH 6/9] =?UTF-8?q?Fix=20the=20issue=20of=20repeatedly=20passi?= =?UTF-8?q?ng=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 From 1f135bdab1df487b6935669fae29519fd65beef8 Mon Sep 17 00:00:00 2001 From: misselvexu Date: Wed, 13 Jul 2022 21:23:58 +0800 Subject: [PATCH 7/9] Recovery polaris.address default config . --- .../metadata-callee-service/src/main/resources/bootstrap.yml | 2 +- .../metadata-callee-service2/src/main/resources/bootstrap.yml | 2 +- .../metadata-caller-service/src/main/resources/bootstrap.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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 cd045ea55..529bbbc76 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 @@ -5,7 +5,7 @@ spring: name: MetadataCalleeService cloud: polaris: - address: grpc://127.0.0.1:8091 + address: grpc://183.47.111.80:8091 namespace: default enabled: true discovery: diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/resources/bootstrap.yml index 1506d6457..1bf197361 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service2/src/main/resources/bootstrap.yml @@ -5,7 +5,7 @@ spring: name: MetadataCalleeService2 cloud: polaris: - address: grpc://127.0.0.1:8091 + address: grpc://183.47.111.80:8091 namespace: default enabled: true discovery: 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 df40cbab7..6b1d46521 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 @@ -5,7 +5,7 @@ spring: name: MetadataCallerService cloud: polaris: - address: grpc://127.0.0.1:8091 + address: grpc://183.47.111.80:8091 namespace: default enabled: true discovery: From 177c000081599cbda7797a8ac2736ef2c759dcf3 Mon Sep 17 00:00:00 2001 From: misselvexu Date: Wed, 13 Jul 2022 21:33:25 +0800 Subject: [PATCH 8/9] Fix StaticMetadataManagerTest UT . --- .../cloud/common/metadata/StaticMetadataManagerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/StaticMetadataManagerTest.java b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/StaticMetadataManagerTest.java index b2aa08cd4..a1cbea356 100644 --- a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/StaticMetadataManagerTest.java +++ b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/StaticMetadataManagerTest.java @@ -132,7 +132,7 @@ public class StaticMetadataManagerTest { Assert.assertEquals("campus1", metadata.get("campus")); Map transitiveMetadata = metadataManager.getMergedStaticTransitiveMetadata(); - Assert.assertEquals(2, transitiveMetadata.size()); + Assert.assertEquals(3, transitiveMetadata.size()); Assert.assertEquals("v1", metadata.get("k1")); Assert.assertEquals("v22", metadata.get("k2")); From 93ad42d62acd1d1d05c438838fb635bb66b41354 Mon Sep 17 00:00:00 2001 From: misselvexu Date: Wed, 13 Jul 2022 21:44:07 +0800 Subject: [PATCH 9/9] improve metadata transfer unit test case . --- .../cloud/metadata/core/EncodeTransferMedataScgFilterTest.java | 2 +- .../metadata/core/EncodeTransferMetadataZuulFilterTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-starter-tencent-metadata-transfer/src/test/java/com/tencent/cloud/metadata/core/EncodeTransferMedataScgFilterTest.java b/spring-cloud-starter-tencent-metadata-transfer/src/test/java/com/tencent/cloud/metadata/core/EncodeTransferMedataScgFilterTest.java index 67a38e21f..92d95038f 100644 --- a/spring-cloud-starter-tencent-metadata-transfer/src/test/java/com/tencent/cloud/metadata/core/EncodeTransferMedataScgFilterTest.java +++ b/spring-cloud-starter-tencent-metadata-transfer/src/test/java/com/tencent/cloud/metadata/core/EncodeTransferMedataScgFilterTest.java @@ -72,7 +72,7 @@ public class EncodeTransferMedataScgFilterTest { String decode = URLDecoder.decode(metadata, UTF_8); Map transitiveMap = JacksonUtils.deserialize2Map(decode); - Assertions.assertThat(transitiveMap.size()).isEqualTo(1); + Assertions.assertThat(transitiveMap.size()).isEqualTo(2); Assertions.assertThat(transitiveMap.get("b")).isEqualTo("2"); } diff --git a/spring-cloud-starter-tencent-metadata-transfer/src/test/java/com/tencent/cloud/metadata/core/EncodeTransferMetadataZuulFilterTest.java b/spring-cloud-starter-tencent-metadata-transfer/src/test/java/com/tencent/cloud/metadata/core/EncodeTransferMetadataZuulFilterTest.java index 0b0a2e2df..a40efc2e8 100644 --- a/spring-cloud-starter-tencent-metadata-transfer/src/test/java/com/tencent/cloud/metadata/core/EncodeTransferMetadataZuulFilterTest.java +++ b/spring-cloud-starter-tencent-metadata-transfer/src/test/java/com/tencent/cloud/metadata/core/EncodeTransferMetadataZuulFilterTest.java @@ -74,7 +74,7 @@ public class EncodeTransferMetadataZuulFilterTest { String decode = URLDecoder.decode(metadata, UTF_8); Map transitiveMap = JacksonUtils.deserialize2Map(decode); - Assertions.assertThat(transitiveMap.size()).isEqualTo(1); + Assertions.assertThat(transitiveMap.size()).isEqualTo(2); Assertions.assertThat(transitiveMap.get("b")).isEqualTo("2"); }