Update metadata transfer readme .

pull/430/head
misselvexu 3 years ago
parent f3edcee21e
commit 68c1a041a3

@ -62,10 +62,6 @@ public class EncodeTransferMedataRestTemplateInterceptor implements ClientHttpRe
Map<String, String> customMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE);
Map<String, String> 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<String, String> 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<String, String> metadata, String headerName) {

@ -67,10 +67,9 @@ public class EncodeTransferMedataScgFilter implements GlobalFilter, Ordered {
}
Map<String, String> customMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE);
this.buildMetadataHeader(builder, customMetadata, CUSTOM_METADATA);
Map<String, String> disposableMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_DISPOSABLE);
// Clean up one-time metadata coming from upstream .
// Clean upstream disposable metadata.
Map<String, String> 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());
}

@ -69,10 +69,9 @@ public class EncodeTransferMetadataZuulFilter extends ZuulFilter {
// add new metadata and cover old
Map<String, String> customMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE);
this.buildMetadataHeader(requestContext, customMetadata, CUSTOM_METADATA);
Map<String, String> disposableMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_DISPOSABLE);
// Clean up one-time metadata coming from upstream .
// Clean upstream disposable metadata.
Map<String, String> 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;
}

@ -72,7 +72,7 @@ public class EncodeTransferMedataScgFilterTest {
String decode = URLDecoder.decode(metadata, UTF_8);
Map<String, String> transitiveMap = JacksonUtils.deserialize2Map(decode);
Assertions.assertThat(transitiveMap.size()).isEqualTo(2);
Assertions.assertThat(transitiveMap.size()).isEqualTo(1);
Assertions.assertThat(transitiveMap.get("b")).isEqualTo("2");
}

@ -74,7 +74,7 @@ public class EncodeTransferMetadataZuulFilterTest {
String decode = URLDecoder.decode(metadata, UTF_8);
Map<String, String> transitiveMap = JacksonUtils.deserialize2Map(decode);
Assertions.assertThat(transitiveMap.size()).isEqualTo(2);
Assertions.assertThat(transitiveMap.size()).isEqualTo(1);
Assertions.assertThat(transitiveMap.get("b")).isEqualTo("2");
}

@ -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

@ -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());

@ -132,7 +132,7 @@ public class StaticMetadataManagerTest {
Assert.assertEquals("campus1", metadata.get("campus"));
Map<String, String> 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"));

@ -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<String, String> customMetadataMap = context.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE);
customMetadataMap.forEach((key, value) -> {
// ...
});
```
- 获取上游传递过来的一次性元数据
```java
Map<String, String> upstreamDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(true);
upstreamDisposableMetadatas.forEach((key, value) -> {
// ...
});
```
- 获取本地配置的一次性元数据
```java
Map<String, String> localDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(false);
localDisposableMetadatas.forEach((key, value) -> {
// ...
});
```
### Wiki参考

@ -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<String, String> customMetadataMap = context.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE);
customMetadataMap.forEach((key, value) -> {
// ...
});
```
- Get disposable(one-time) metadata passed from upstream
```java
Map<String, String> upstreamDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(true);
upstreamDisposableMetadatas.forEach((key, value) -> {
// ...
});
```
- Get disposable(one-time) metadata for local configuration
```java
Map<String, String> localDisposableMetadatas = MetadataContextHolder.getAllDisposableMetadata(false);
localDisposableMetadatas.forEach((key, value) -> {
// ...
});
```
### Wiki Reference

@ -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<String, String> 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<String, String> 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;
}

@ -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<String, Map<String, Map<String, String>>> feign() {
Map<String, Map<String, Map<String, String>>> ret = Maps.newHashMap();
public Map<String, Map<String, String>> feign() {
Map<String, Map<String, String>> ret = new HashMap<>();
// Call remote service with feign client
Map<String, Map<String, String>> calleeMetadata = metadataMiddleService.info();
ret.put("callee-transitive-metadata", calleeMetadata);
Map<String, Map<String, String>> middleResult = metadataMiddleService.info();
if (middleResult != null) {
ret.putAll(middleResult);
}
// Get Custom Metadata From Context
MetadataContext context = MetadataContextHolder.get();
Map<String, String> 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<String, String> 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<String, String> 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<String, Map<String, Map<String, String>>> rest() {
Map<String, Map<String, Map<String, String>>> ret = Maps.newHashMap();
public Map<String, Map<String, String>> rest() {
Map<String, Map<String, String>> ret = new HashMap<>();
// Call remote service with RestTemplate
Map<String, Map<String, String>> calleeMetadata = restTemplate.getForObject(
Map<String, Map<String, String>> 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<String, String> 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<String, String> 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<String, String> 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")

@ -32,7 +32,7 @@ import org.springframework.stereotype.Component;
public class MetadataMiddleServiceFallback implements MetadataMiddleService {
@Override
public Map<String, String> info() {
public Map<String, Map<String, String>> info() {
return Maps.newHashMap();
}
}

@ -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:

@ -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<String, Map<String, String>> info() {
// Build result
Map<String, Map<String, String>> 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<String, Map<String, String>> 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<String, String> 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<String, String> 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;
}

@ -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

Loading…
Cancel
Save