From 68c1a041a359e29407335dc51920bc53dee87f8d Mon Sep 17 00:00:00 2001 From: misselvexu Date: Sun, 17 Jul 2022 19:00:33 +0800 Subject: [PATCH] Update metadata transfer readme . --- ...TransferMedataRestTemplateInterceptor.java | 14 +-- .../core/EncodeTransferMedataScgFilter.java | 8 +- .../EncodeTransferMetadataZuulFilter.java | 9 +- .../EncodeTransferMedataScgFilterTest.java | 2 +- .../EncodeTransferMetadataZuulFilterTest.java | 2 +- .../metadata/MetadataContextHolder.java | 6 +- .../endpoint/PolarisMetadataEndpoint.java | 7 +- .../metadata/StaticMetadataManagerTest.java | 2 +- .../metadata-transfer-example/README-zh.md | 114 +++++++++++++++--- .../metadata-transfer-example/README.md | 112 ++++++++++++++--- .../backend/MetadataBackendController.java | 11 +- .../frontend/MetadataFrontendController.java | 89 +++++++++++--- .../MetadataMiddleServiceFallback.java | 2 +- .../src/main/resources/bootstrap.yml | 3 +- .../middle/MetadataMiddleController.java | 27 +++-- .../src/main/resources/bootstrap.yml | 3 +- 16 files changed, 320 insertions(+), 91 deletions(-) diff --git a/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMedataRestTemplateInterceptor.java b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMedataRestTemplateInterceptor.java index b95d44532..513310da4 100644 --- a/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMedataRestTemplateInterceptor.java +++ b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMedataRestTemplateInterceptor.java @@ -62,10 +62,6 @@ public class EncodeTransferMedataRestTemplateInterceptor implements ClientHttpRe Map customMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); Map disposableMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_DISPOSABLE); - // build custom metadata request header - this.buildMetadataHeader(httpRequest, customMetadata, CUSTOM_METADATA); - - // Clean up one-time metadata coming from upstream . Map newestCustomMetadata = new HashMap<>(); customMetadata.forEach((key, value) -> { if (!disposableMetadata.containsKey(key)) { @@ -73,15 +69,19 @@ public class EncodeTransferMedataRestTemplateInterceptor implements ClientHttpRe } }); // build custom disposable metadata request header - this.buildMetadataHeader(httpRequest, newestCustomMetadata, CUSTOM_DISPOSABLE_METADATA); + this.buildMetadataHeader(httpRequest, disposableMetadata, CUSTOM_DISPOSABLE_METADATA); + + // build custom metadata request header + this.buildMetadataHeader(httpRequest, newestCustomMetadata, CUSTOM_METADATA); return clientHttpRequestExecution.execute(httpRequest, bytes); } /** * Set metadata into the request header for {@link HttpRequest} . - * @param request instance of {@link HttpRequest} - * @param metadata metadata map . + * + * @param request instance of {@link HttpRequest} + * @param metadata metadata map . * @param headerName target metadata http header name . */ private void buildMetadataHeader(HttpRequest request, Map metadata, String headerName) { diff --git a/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMedataScgFilter.java b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMedataScgFilter.java index d132a8d7c..44d80cd7b 100644 --- a/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMedataScgFilter.java +++ b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/EncodeTransferMedataScgFilter.java @@ -67,10 +67,9 @@ public class EncodeTransferMedataScgFilter implements GlobalFilter, Ordered { } Map customMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); - this.buildMetadataHeader(builder, customMetadata, CUSTOM_METADATA); - Map disposableMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_DISPOSABLE); - // Clean up one-time metadata coming from upstream . + + // Clean upstream disposable metadata. Map newestCustomMetadata = new HashMap<>(); customMetadata.forEach((key, value) -> { if (!disposableMetadata.containsKey(key)) { @@ -78,7 +77,8 @@ public class EncodeTransferMedataScgFilter implements GlobalFilter, Ordered { } }); - this.buildMetadataHeader(builder, newestCustomMetadata, CUSTOM_DISPOSABLE_METADATA); + this.buildMetadataHeader(builder, newestCustomMetadata, CUSTOM_METADATA); + this.buildMetadataHeader(builder, disposableMetadata, CUSTOM_DISPOSABLE_METADATA); return chain.filter(exchange.mutate().request(builder.build()).build()); } 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 1d903983a..4328792c0 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 @@ -69,10 +69,9 @@ public class EncodeTransferMetadataZuulFilter extends ZuulFilter { // add new metadata and cover old Map customMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); - this.buildMetadataHeader(requestContext, customMetadata, CUSTOM_METADATA); - Map disposableMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_DISPOSABLE); - // Clean up one-time metadata coming from upstream . + + // Clean upstream disposable metadata. Map newestCustomMetadata = new HashMap<>(); customMetadata.forEach((key, value) -> { if (!disposableMetadata.containsKey(key)) { @@ -80,7 +79,9 @@ public class EncodeTransferMetadataZuulFilter extends ZuulFilter { } }); - this.buildMetadataHeader(requestContext, newestCustomMetadata, CUSTOM_DISPOSABLE_METADATA); + // Rebuild Metadata Header + this.buildMetadataHeader(requestContext, newestCustomMetadata, CUSTOM_METADATA); + this.buildMetadataHeader(requestContext, disposableMetadata, CUSTOM_DISPOSABLE_METADATA); return null; } 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 92d95038f..67a38e21f 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(2); + Assertions.assertThat(transitiveMap.size()).isEqualTo(1); 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 a40efc2e8..0b0a2e2df 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(2); + Assertions.assertThat(transitiveMap.size()).isEqualTo(1); Assertions.assertThat(transitiveMap.get("b")).isEqualTo("2"); } 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 6efaf8f77..40b8c9616 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 @@ -57,12 +57,10 @@ public final class MetadataContextHolder { } if (metadataLocalProperties == null) { - metadataLocalProperties = (MetadataLocalProperties) ApplicationContextAwareUtils - .getApplicationContext().getBean("metadataLocalProperties"); + metadataLocalProperties = ApplicationContextAwareUtils.getApplicationContext().getBean(MetadataLocalProperties.class); } if (staticMetadataManager == null) { - staticMetadataManager = (StaticMetadataManager) ApplicationContextAwareUtils - .getApplicationContext().getBean("metadataManager"); + staticMetadataManager = ApplicationContextAwareUtils.getApplicationContext().getBean(StaticMetadataManager.class); } // init static transitive metadata diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/endpoint/PolarisMetadataEndpoint.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/endpoint/PolarisMetadataEndpoint.java index 360018ea2..ea7954c37 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/endpoint/PolarisMetadataEndpoint.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/endpoint/PolarisMetadataEndpoint.java @@ -45,9 +45,14 @@ public class PolarisMetadataEndpoint { result.put("Env", staticMetadataManager.getAllEnvMetadata()); result.put("EnvTransitive", staticMetadataManager.getEnvTransitiveMetadata()); result.put("ConfigTransitive", staticMetadataManager.getConfigTransitiveMetadata()); + result.put("ConfigDisposable", staticMetadataManager.getConfigDisposableMetadata()); result.put("Config", staticMetadataManager.getAllConfigMetadata()); result.put("MergeStatic", staticMetadataManager.getMergedStaticMetadata()); - result.put("CustomSPI", staticMetadataManager.getCustomSPITransitiveMetadata()); + result.put("MergeStaticTransitive", staticMetadataManager.getMergedStaticTransitiveMetadata()); + result.put("MergeStaticDisposable", staticMetadataManager.getMergedStaticDisposableMetadata()); + result.put("CustomSPI", staticMetadataManager.getAllCustomMetadata()); + result.put("CustomSPITransitive", staticMetadataManager.getCustomSPITransitiveMetadata()); + result.put("CustomSPIDisposable", staticMetadataManager.getCustomSPIDisposableMetadata()); result.put("zone", staticMetadataManager.getZone()); result.put("region", staticMetadataManager.getRegion()); result.put("campus", staticMetadataManager.getCampus()); 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 a1cbea356..b2aa08cd4 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(3, transitiveMetadata.size()); + Assert.assertEquals(2, transitiveMetadata.size()); Assert.assertEquals("v1", metadata.get("k1")); Assert.assertEquals("v22", metadata.get("k2")); diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/README-zh.md b/spring-cloud-tencent-examples/metadata-transfer-example/README-zh.md index 9af9aff6d..764a80c38 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/README-zh.md +++ b/spring-cloud-tencent-examples/metadata-transfer-example/README-zh.md @@ -4,7 +4,7 @@ 本样例将介绍如何在Spring Cloud项目中使用```spring-cloud-starter-tencent-metadata-transfer```以使用其各项功能。 -本样例包括```metadata-callee-service```、```metadata-caller-service```。 +本样例包括```metadata-frontend```、```metadata-middle```、```metadata-backend```。 ## 使用说明 @@ -41,8 +41,9 @@ spring: ##### IDEA启动 分别启动 -- ```spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service```的```MetadataCalleeService``` -- ```spring-cloud-tencent-examples/metadata-transfer-example/metadata-caller-service```的```MetadataCallerService``` +- ```spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend```的```MetadataFrontendService``` +- ```spring-cloud-tencent-examples/metadata-transfer-example/metadata-middle```的```MetadataMiddleService``` +- ```spring-cloud-tencent-examples/metadata-transfer-example/metadata-backend```的```MetadataBackendService``` ##### Maven打包启动 @@ -53,7 +54,7 @@ spring: mvn clean package ``` -然后在```metadata-callee-service```、```metadata-caller-service```下找到生成的jar包,运行 +然后在```metadata-frontend```、```metadata-middle```、```metadata-backend```下找到生成的jar包,运行 ``` java -jar ${app.jar} @@ -63,7 +64,7 @@ java -jar ${app.jar} ### 元数据配置 -在```spring-cloud-tencent-examples/metadata-transfer-example/metadata-caller-service```项目的```bootstrap.yml```配置文件中 +- 在```spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend```项目的```bootstrap.yml```配置文件中 ```yaml spring: @@ -76,10 +77,37 @@ spring: CUSTOM-METADATA-KEY-LOCAL: CUSTOM-VALUE-LOCAL # 示例:可传递元数据 CUSTOM-METADATA-KEY-TRANSITIVE: CUSTOM-VALUE-TRANSITIVE + # 示例:一次性元数据 + CUSTOM-METADATA-KEY-DISPOSABLE: CUSTOM-VALUE-DISPOSABLE-FRONTEND # 指定哪个元数据的键值将沿着链接传递 transitive: - CUSTOM-METADATA-KEY-TRANSITIVE + # 指定哪个元数据的键值只进行一次性传递(一跳) + disposable: + - CUSTOM-METADATA-KEY-DISPOSABLE +``` + +- 在```spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend```项目的```bootstrap.yml```配置文件中 +```yaml +spring: + cloud: + tencent: + metadata: + # 定义元数据的键值对 + content: + # 示例:本地元数据,默认不在链路中传递 + CUSTOM-METADATA-KEY-LOCAL-2: CUSTOM-VALUE-LOCAL-2 + # 示例:可传递元数据 + CUSTOM-METADATA-KEY-TRANSITIVE-2: CUSTOM-VALUE-TRANSITIVE-2 + # 示例:一次性元数据 + CUSTOM-METADATA-KEY-DISPOSABLE: CUSTOM-VALUE-DISPOSABLE-MIDDLE + # 指定哪个元数据的键值将沿着链接传递 + transitive: + - CUSTOM-METADATA-KEY-TRANSITIVE-2 + # 指定哪个元数据的键值只进行一次性传递(一跳) + disposable: + - CUSTOM-METADATA-KEY-DISPOSABLE ``` ### 验证 @@ -87,31 +115,85 @@ spring: #### 请求调用 ```shell -curl -L -X GET 'http://127.0.0.1:48080/metadata/service/caller/feign/info' +curl -L -X GET 'http://127.0.0.1:48080/metadata/service/frontend/feign/info' ``` 预期返回值 -``` +```json { - "caller-metadata-contents": { + "frontend-transitive-metadata": { + "CUSTOM-METADATA-KEY-TRANSITIVE": "CUSTOM-VALUE-TRANSITIVE" + }, + "frontend-upstream-disposable-metadata": { + }, + "frontend-local-disposable-metadata": { + "CUSTOM-METADATA-KEY-DISPOSABLE": "CUSTOM-VALUE-DISPOSABLE-FRONTEND" + }, + + "middle-transitive-metadata": { "CUSTOM-METADATA-KEY-TRANSITIVE": "CUSTOM-VALUE-TRANSITIVE", - "CUSTOM-METADATA-KEY-LOCAL": "CUSTOM-VALUE-LOCAL" + "CUSTOM-METADATA-KEY-TRANSITIVE-2": "CUSTOM-VALUE-TRANSITIVE-2" }, - "callee-transitive-metadata": { - "CUSTOM-METADATA-KEY-TRANSITIVE": "CUSTOM-VALUE-TRANSITIVE" + "middle-upstream-disposable-metadata": { + "CUSTOM-METADATA-KEY-DISPOSABLE": "CUSTOM-VALUE-DISPOSABLE-FRONTEND" }, - "caller-transitive-metadata": { - "CUSTOM-METADATA-KEY-TRANSITIVE": "CUSTOM-VALUE-TRANSITIVE" + "middle-local-disposable-metadata": { + "CUSTOM-METADATA-KEY-DISPOSABLE": "CUSTOM-VALUE-DISPOSABLE-MIDDLE" + }, + + "backend-transitive-metadata": { + "CUSTOM-METADATA-KEY-TRANSITIVE": "CUSTOM-VALUE-TRANSITIVE", + "CUSTOM-METADATA-KEY-TRANSITIVE-2": "CUSTOM-VALUE-TRANSITIVE-2" + }, + "backend-upstream-disposable-metadata": { + "CUSTOM-METADATA-KEY-DISPOSABLE": "CUSTOM-VALUE-DISPOSABLE-MIDDLE" + }, + "backend-local-disposable-metadata": { } } ``` 返回值解析 -- Key `caller-metadata-contents` 表示 `metadata-caller-service` 项目中默认配置的所有的元数据。 -- Key `caller-transitive-metadata` 表示 `metadata-caller-service` 项目中指定的可以在链路中传递的元数据列表。 -- Key `callee-transitive-metadata` 表示 `metadata-callee-service` 项目被 `metadata-caller-service` 调用时传递过来的上游的元数据列表。 +> `*`(星号),代表示例中的`frontend`、`middle`、`backend`。 + +- Key `*-transitive-metadata` 表示服务中默认配置的所有的可传递(全链路)的元数据。 +- Key `*-upstream-disposable-metadata` 表示服务中从上游请求中获取到的一次性传递的元数据。 +- Key `*-local-disposable-metadata` 表示当前服务配置的往下游传递的一次性的元数据。 + +### 如何通过Api获取传递的元数据 + +- 获取全局传递的元数据 + +```java +MetadataContext context = MetadataContextHolder.get(); + Map customMetadataMap = context.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + +customMetadataMap.forEach((key, value) -> { + // ... +}); + +``` + +- 获取上游传递过来的一次性元数据 + +```java +Map upstreamDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(true); +upstreamDisposableMetadatas.forEach((key, value) -> { + // ... +}); +``` + +- 获取本地配置的一次性元数据 + +```java +Map localDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(false); +localDisposableMetadatas.forEach((key, value) -> { + // ... +}); +``` + ### Wiki参考 diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/README.md b/spring-cloud-tencent-examples/metadata-transfer-example/README.md index c89a12d7b..9fc663666 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/README.md +++ b/spring-cloud-tencent-examples/metadata-transfer-example/README.md @@ -5,7 +5,7 @@ This example shows how to use ```spring-cloud-starter-tencent-metadata-transfer``` in Spring Cloud project for its features. -This example contains ```metadata-callee-service```、```metadata-caller-service```. +This example contains ```metadata-frontend```、```metadata-middle```、```metadata-backend```. ## Instruction @@ -41,8 +41,10 @@ Reference to [Polaris Getting Started](https://github.com/PolarisMesh/polaris#ge - IDEA Launching -- ```spring-cloud-tencent-examples/metadata-transfer-example/metadata-callee-service```‘s```MetadataCalleeService``` -- ```spring-cloud-tencent-examples/metadata-transfer-example/metadata-caller-service```'s```MetadataCallerService``` +- ```spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend```'s ```MetadataFrontendService``` +- ```spring-cloud-tencent-examples/metadata-transfer-example/metadata-middle```'s ```MetadataMiddleService``` +- ```spring-cloud-tencent-examples/metadata-transfer-example/metadata-backend```'s ```MetadataBackendService``` + - Maven Package Launching @@ -52,7 +54,7 @@ Execute under ```spring-cloud-tencent-examples/metadata-transfer-example``` mvn clean package ``` -Then find the jars under ```metadata-callee-service```、```metadata-caller-service```, and run it: +Then find the jars under ```metadata-frontend```、```metadata-middle```、```metadata-backend```, and run it: ``` java -jar ${app.jar} @@ -63,7 +65,7 @@ Launch application, change ${app.jar} to jar's package name. ### Metadata Configuration -In the ```bootstrap.yml``` configuration file of the ```spring-cloud-tencent-examples/metadata-transfer-example/metadata-caller-service``` project +- In the ```bootstrap.yml``` configuration file of the ```spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend``` project ```yaml spring: @@ -76,9 +78,38 @@ spring: CUSTOM-METADATA-KEY-LOCAL: CUSTOM-VALUE-LOCAL # Example: transitive CUSTOM-METADATA-KEY-TRANSITIVE: CUSTOM-VALUE-TRANSITIVE + # Example: disposable + CUSTOM-METADATA-KEY-DISPOSABLE: CUSTOM-VALUE-DISPOSABLE-FRONTEND # Assigned which metadata key-value will be passed along the link transitive: - CUSTOM-METADATA-KEY-TRANSITIVE + # Specify which metadata key value will be passed only once (one-step) + disposable: + - CUSTOM-METADATA-KEY-DISPOSABLE + +``` + +- In the ```bootstrap.yml``` configuration file of the ```spring-cloud-tencent-examples/metadata-transfer-example/metadata-middle``` project + +```yaml +spring: + cloud: + 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 + # Example: disposable + CUSTOM-METADATA-KEY-DISPOSABLE: CUSTOM-VALUE-DISPOSABLE-MIDDLE + # Assigned which metadata key-value will be passed along the link + transitive: + - CUSTOM-METADATA-KEY-TRANSITIVE-2 + # Specify which metadata key value will be passed only once (one-step) + disposable: + - CUSTOM-METADATA-KEY-DISPOSABLE ``` @@ -94,24 +125,77 @@ Expected return rate ``` { - "caller-metadata-contents": { + "frontend-transitive-metadata": { + "CUSTOM-METADATA-KEY-TRANSITIVE": "CUSTOM-VALUE-TRANSITIVE" + }, + "frontend-upstream-disposable-metadata": { + }, + "frontend-local-disposable-metadata": { + "CUSTOM-METADATA-KEY-DISPOSABLE": "CUSTOM-VALUE-DISPOSABLE-FRONTEND" + }, + + "middle-transitive-metadata": { "CUSTOM-METADATA-KEY-TRANSITIVE": "CUSTOM-VALUE-TRANSITIVE", - "CUSTOM-METADATA-KEY-LOCAL": "CUSTOM-VALUE-LOCAL" + "CUSTOM-METADATA-KEY-TRANSITIVE-2": "CUSTOM-VALUE-TRANSITIVE-2" }, - "callee-transitive-metadata": { - "CUSTOM-METADATA-KEY-TRANSITIVE": "CUSTOM-VALUE-TRANSITIVE" + "middle-upstream-disposable-metadata": { + "CUSTOM-METADATA-KEY-DISPOSABLE": "CUSTOM-VALUE-DISPOSABLE-FRONTEND" }, - "caller-transitive-metadata": { - "CUSTOM-METADATA-KEY-TRANSITIVE": "CUSTOM-VALUE-TRANSITIVE" + "middle-local-disposable-metadata": { + "CUSTOM-METADATA-KEY-DISPOSABLE": "CUSTOM-VALUE-DISPOSABLE-MIDDLE" + }, + + "backend-transitive-metadata": { + "CUSTOM-METADATA-KEY-TRANSITIVE": "CUSTOM-VALUE-TRANSITIVE", + "CUSTOM-METADATA-KEY-TRANSITIVE-2": "CUSTOM-VALUE-TRANSITIVE-2" + }, + "backend-upstream-disposable-metadata": { + "CUSTOM-METADATA-KEY-DISPOSABLE": "CUSTOM-VALUE-DISPOSABLE-MIDDLE" + }, + "backend-local-disposable-metadata": { } } ``` Response value description -- Key `caller-metadata-contents` represents all metadata configured by default in the `metadata-caller-service` project. -- Key `caller-transitive-metadata` represents the list of metadata that can be passed in the link specified in the `metadata-caller-service` item. -- Key `callee-transitive-metadata` represents the list of upstream metadata passed when the `metadata-callee-service` project is called by `metadata-caller-service`. +> `*` (asterisk), representing `frontend`, `middle`, `backend` in the example. + +- Key `*-transitive-metadata` represents all the passable (fully linked) metadata configured by default in the service. +- Key `*-upstream-disposable-metadata` indicates the one-time transmissible metadata obtained from upstream requests in the service. +- Key `*-local-disposable-metadata` indicates the one-time metadata passed downstream as configured by the current service. + +### How to get the passed metadata via Api + +- Get the metadata passed globally + +```java +MetadataContext context = MetadataContextHolder.get(); + Map customMetadataMap = context.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + +customMetadataMap.forEach((key, value) -> { + // ... +}); +``` + +- Get disposable(one-time) metadata passed from upstream + +```java +Map upstreamDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(true); +upstreamDisposableMetadatas.forEach((key, value) -> { + // ... +}); +``` + +- Get disposable(one-time) metadata for local configuration + +```java +Map localDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(false); +localDisposableMetadatas.forEach((key, value) -> { + // ... +}); +``` + ### Wiki Reference diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-backend/src/main/java/com/tencent/cloud/metadata/service/backend/MetadataBackendController.java b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-backend/src/main/java/com/tencent/cloud/metadata/service/backend/MetadataBackendController.java index a098c7470..7da621e81 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-backend/src/main/java/com/tencent/cloud/metadata/service/backend/MetadataBackendController.java +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-backend/src/main/java/com/tencent/cloud/metadata/service/backend/MetadataBackendController.java @@ -19,7 +19,6 @@ package com.tencent.cloud.metadata.service.backend; import java.util.HashMap; import java.util.Map; -import java.util.Optional; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; @@ -62,23 +61,23 @@ public class MetadataBackendController { LOG.info("Metadata Backend Custom Metadata (Key-Value): {} : {}", key, value); }); - ret.put("transitive-metadata", customMetadataMap); + ret.put("backend-transitive-metadata", customMetadataMap); // Get All Disposable metadata from upstream service Map upstreamDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(true); upstreamDisposableMetadatas.forEach((key, value) -> { - LOG.info("Backend All Upstream Custom Disposable Metadata (Key-Value): {} : {}", key, value); + LOG.info("Upstream Disposable Metadata (Key-Value): {} : {}", key, value); }); - ret.put("upstream-disposable-metadata", upstreamDisposableMetadatas); + ret.put("backend-upstream-disposable-metadata", upstreamDisposableMetadatas); // Get All Disposable metadata from upstream service Map localDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(false); localDisposableMetadatas.forEach((key, value) -> { - LOG.info("Backend All Upstream Custom Disposable Metadata (Key-Value): {} : {}", key, value); + LOG.info("Local Custom Disposable Metadata (Key-Value): {} : {}", key, value); }); - ret.put("local-disposable-metadata", localDisposableMetadatas); + ret.put("backend-local-disposable-metadata", localDisposableMetadatas); return ret; } diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend/src/main/java/com/tencent/cloud/metadata/service/frontend/MetadataFrontendController.java b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend/src/main/java/com/tencent/cloud/metadata/service/frontend/MetadataFrontendController.java index d5a9af127..3d107f555 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend/src/main/java/com/tencent/cloud/metadata/service/frontend/MetadataFrontendController.java +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend/src/main/java/com/tencent/cloud/metadata/service/frontend/MetadataFrontendController.java @@ -17,12 +17,13 @@ package com.tencent.cloud.metadata.service.frontend; +import java.util.HashMap; import java.util.Map; -import com.google.common.collect.Maps; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; -import com.tencent.cloud.common.metadata.config.MetadataLocalProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -38,55 +39,113 @@ import org.springframework.web.client.RestTemplate; @RequestMapping("/metadata/service/frontend") public class MetadataFrontendController { + private static final Logger LOG = LoggerFactory.getLogger(MetadataFrontendController.class); + private final RestTemplate restTemplate; private final MetadataMiddleService metadataMiddleService; - private final MetadataLocalProperties metadataLocalProperties; - public MetadataFrontendController(RestTemplate restTemplate, - MetadataMiddleService metadataMiddleService, - MetadataLocalProperties metadataLocalProperties) { + MetadataMiddleService metadataMiddleService) { this.restTemplate = restTemplate; this.metadataMiddleService = metadataMiddleService; - this.metadataLocalProperties = metadataLocalProperties; } /** * Get metadata info from remote service. + * * @return metadata map */ @GetMapping("/feign/info") - public Map>> feign() { - Map>> ret = Maps.newHashMap(); + public Map> feign() { + Map> ret = new HashMap<>(); // Call remote service with feign client - Map> calleeMetadata = metadataMiddleService.info(); - ret.put("callee-transitive-metadata", calleeMetadata); + Map> middleResult = metadataMiddleService.info(); + + if (middleResult != null) { + ret.putAll(middleResult); + } + + // Get Custom Metadata From Context + MetadataContext context = MetadataContextHolder.get(); + Map customMetadataMap = context.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + + customMetadataMap.forEach((key, value) -> { + LOG.info("Metadata Middle Custom Metadata (Key-Value): {} : {}", key, value); + }); + + ret.put("frontend-transitive-metadata", customMetadataMap); + + // Get All Disposable metadata from upstream service + Map upstreamDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(true); + upstreamDisposableMetadatas.forEach((key, value) -> { + LOG.info("Upstream Custom Disposable Metadata (Key-Value): {} : {}", key, value); + }); + + ret.put("frontend-upstream-disposable-metadata", upstreamDisposableMetadatas); + + // Get All Disposable metadata from upstream service + Map localDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(false); + localDisposableMetadatas.forEach((key, value) -> { + LOG.info("Local Custom Disposable Metadata (Key-Value): {} : {}", key, value); + }); + + ret.put("frontend-local-disposable-metadata", localDisposableMetadatas); return ret; } /** * Get metadata information of callee. + * * @return information of callee */ @SuppressWarnings("unchecked") @GetMapping("/rest/info") - public Map>> rest() { - Map>> ret = Maps.newHashMap(); + public Map> rest() { + Map> ret = new HashMap<>(); // Call remote service with RestTemplate - Map> calleeMetadata = restTemplate.getForObject( + Map> middleResult = restTemplate.getForObject( "http://MetadataMiddleService/metadata/service/middle/info", Map.class); - ret.put("callee-transitive-metadata", calleeMetadata); + if (middleResult != null) { + ret.putAll(middleResult); + } + + // Get Custom Metadata From Context + MetadataContext context = MetadataContextHolder.get(); + Map customMetadataMap = context.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + + customMetadataMap.forEach((key, value) -> { + LOG.info("Metadata Middle Custom Metadata (Key-Value): {} : {}", key, value); + }); + + ret.put("frontend-transitive-metadata", customMetadataMap); + + // Get All Disposable metadata from upstream service + Map upstreamDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(true); + upstreamDisposableMetadatas.forEach((key, value) -> { + LOG.info("Upstream Custom Disposable Metadata (Key-Value): {} : {}", key, value); + }); + + ret.put("frontend-upstream-disposable-metadata", upstreamDisposableMetadatas); + + // Get All Disposable metadata from upstream service + Map localDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(false); + localDisposableMetadatas.forEach((key, value) -> { + LOG.info("Local Custom Disposable Metadata (Key-Value): {} : {}", key, value); + }); + + ret.put("frontend-local-disposable-metadata", localDisposableMetadatas); return ret; } /** * health check. + * * @return health check info */ @GetMapping("/healthCheck") diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend/src/main/java/com/tencent/cloud/metadata/service/frontend/MetadataMiddleServiceFallback.java b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend/src/main/java/com/tencent/cloud/metadata/service/frontend/MetadataMiddleServiceFallback.java index b8f36bf75..727f65c63 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend/src/main/java/com/tencent/cloud/metadata/service/frontend/MetadataMiddleServiceFallback.java +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend/src/main/java/com/tencent/cloud/metadata/service/frontend/MetadataMiddleServiceFallback.java @@ -32,7 +32,7 @@ import org.springframework.stereotype.Component; public class MetadataMiddleServiceFallback implements MetadataMiddleService { @Override - public Map info() { + public Map> info() { return Maps.newHashMap(); } } diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend/src/main/resources/bootstrap.yml index e2e59590c..719424131 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-frontend/src/main/resources/bootstrap.yml @@ -22,11 +22,10 @@ spring: # Example: disposable CUSTOM-METADATA-KEY-DISPOSABLE: CUSTOM-VALUE-DISPOSABLE # Example: transitive - CUSTOM-METADATA-KEY-TRANSITIVE: CUSTOM-VALUE-TRANSITIVE + CUSTOM-METADATA-KEY-TRANSITIVE: CUSTOM-VALUE-TRANSITIVE-FRONTEND # 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: diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-middle/src/main/java/com/tencent/cloud/metadata/service/middle/MetadataMiddleController.java b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-middle/src/main/java/com/tencent/cloud/metadata/service/middle/MetadataMiddleController.java index ae9122aab..7ea673a50 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-middle/src/main/java/com/tencent/cloud/metadata/service/middle/MetadataMiddleController.java +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-middle/src/main/java/com/tencent/cloud/metadata/service/middle/MetadataMiddleController.java @@ -19,7 +19,6 @@ package com.tencent.cloud.metadata.service.middle; import java.util.HashMap; import java.util.Map; -import java.util.Optional; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; @@ -59,10 +58,15 @@ public class MetadataMiddleController { /** * Get information of callee. + * * @return information of callee */ @GetMapping("/info") public Map> info() { + + // Build result + Map> ret = new HashMap<>(); + LOG.info("Metadata Middle Service [{}] is called.", port); // Call remote service with RestTemplate @@ -71,7 +75,7 @@ public class MetadataMiddleController { if (backendResult != null) { LOG.info("RestTemplate Backend Metadata"); - serialize2Json(backendResult, true); + LOG.info("\r{}", serialize2Json(backendResult, true)); backendResult.clear(); } @@ -79,13 +83,12 @@ public class MetadataMiddleController { backendResult = metadataBackendService.info(); if (backendResult != null) { LOG.info("Feign Backend Metadata"); - serialize2Json(backendResult, true); - - backendResult.clear(); + LOG.info("\r{}", serialize2Json(backendResult, true)); } - // Build result - Map> ret = new HashMap<>(); + if (backendResult != null) { + ret.putAll(backendResult); + } // Get Custom Metadata From Context MetadataContext context = MetadataContextHolder.get(); @@ -95,23 +98,23 @@ public class MetadataMiddleController { LOG.info("Metadata Middle Custom Metadata (Key-Value): {} : {}", key, value); }); - ret.put("transitive-metadata", customMetadataMap); + ret.put("middle-transitive-metadata", customMetadataMap); // Get All Disposable metadata from upstream service Map upstreamDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(true); upstreamDisposableMetadatas.forEach((key, value) -> { - LOG.info("Middle All Upstream Custom Disposable Metadata (Key-Value): {} : {}", key, value); + LOG.info("Upstream Custom Disposable Metadata (Key-Value): {} : {}", key, value); }); - ret.put("upstream-disposable-metadata", upstreamDisposableMetadatas); + ret.put("middle-upstream-disposable-metadata", upstreamDisposableMetadatas); // Get All Disposable metadata from upstream service Map localDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(false); localDisposableMetadatas.forEach((key, value) -> { - LOG.info("Middle All Upstream Custom Disposable Metadata (Key-Value): {} : {}", key, value); + LOG.info("Local Custom Disposable Metadata (Key-Value): {} : {}", key, value); }); - ret.put("local-disposable-metadata", localDisposableMetadatas); + ret.put("middle-local-disposable-metadata", localDisposableMetadatas); return ret; } diff --git a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-middle/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-middle/src/main/resources/bootstrap.yml index 365882447..db78677b5 100644 --- a/spring-cloud-tencent-examples/metadata-transfer-example/metadata-middle/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/metadata-transfer-example/metadata-middle/src/main/resources/bootstrap.yml @@ -20,11 +20,10 @@ spring: # Example: transitive CUSTOM-METADATA-KEY-TRANSITIVE-2: CUSTOM-VALUE-TRANSITIVE-2 # Example: disposable -# CUSTOM-METADATA-KEY-DISPOSABLE: CUSTOM-VALUE-DISPOSABLE-CALLEE + CUSTOM-METADATA-KEY-DISPOSABLE: CUSTOM-VALUE-DISPOSABLE-MIDDLE # 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