diff --git a/CHANGELOG.md b/CHANGELOG.md index 984c5d46..74635434 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,3 +14,4 @@ - [feat:support read config file from local file system.](https://github.com/Tencent/spring-cloud-tencent/pull/649) - [feat: publish spring event named ConfigChangeSpringEvent when the configuration is changed](https://github.com/Tencent/spring-cloud-tencent/pull/651) - [Feature: support new expression](https://github.com/Tencent/spring-cloud-tencent/pull/661) +- [Optimize:optimize TransHeadersTransfer.](https://github.com/Tencent/spring-cloud-tencent/pull/662) 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 d9c8dbe1..03259a30 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 @@ -20,12 +20,8 @@ package com.tencent.cloud.metadata.core; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; -import java.util.Arrays; import java.util.HashMap; -import java.util.Iterator; -import java.util.List; import java.util.Map; -import java.util.Set; import com.tencent.cloud.common.constant.MetadataConstant; import com.tencent.cloud.common.metadata.MetadataContextHolder; @@ -37,7 +33,6 @@ import reactor.core.publisher.Mono; import org.springframework.core.Ordered; import org.springframework.http.HttpHeaders; import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; @@ -46,8 +41,6 @@ import org.springframework.web.server.WebFilterChain; import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; import static com.tencent.cloud.common.constant.MetadataConstant.HeaderName.CUSTOM_DISPOSABLE_METADATA; import static com.tencent.cloud.common.constant.MetadataConstant.HeaderName.CUSTOM_METADATA; -import static com.tencent.cloud.common.metadata.MetadataContext.FRAGMENT_RAW_TRANSHEADERS; -import static com.tencent.cloud.common.metadata.MetadataContext.FRAGMENT_RAW_TRANSHEADERS_KV; /** * Filter used for storing the metadata from upstream temporarily when web application is @@ -65,8 +58,7 @@ public class DecodeTransferMetadataReactiveFilter implements WebFilter, Ordered } @Override - public Mono filter(ServerWebExchange serverWebExchange, - WebFilterChain webFilterChain) { + public Mono filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) { // Get metadata string from http header. ServerHttpRequest serverHttpRequest = serverWebExchange.getRequest(); @@ -87,41 +79,13 @@ public class DecodeTransferMetadataReactiveFilter implements WebFilter, Ordered MetadataConstant.HeaderName.METADATA_CONTEXT, MetadataContextHolder.get()); - setCompleteTransHeaderIntoMC(serverHttpRequest); + TransHeadersTransfer.transfer(serverHttpRequest); return webFilterChain.filter(serverWebExchange) .doOnError(throwable -> LOG.error("handle metadata[{}] error.", MetadataContextHolder.get(), throwable)) .doFinally((type) -> MetadataContextHolder.remove()); } - /** - * According to ServerHttpRequest and trans-headers(key list in string type) in metadata, build - * the complete headers(key-value list in map type) into metadata. - */ - private void setCompleteTransHeaderIntoMC(ServerHttpRequest serverHttpRequest) { - // transHeaderMetadata: for example, {"trans-headers" : {"header1,header2,header3":""}} - Map transHeaderMetadata = MetadataContextHolder.get() - .getFragmentContext(FRAGMENT_RAW_TRANSHEADERS); - if (!CollectionUtils.isEmpty(transHeaderMetadata)) { - String transHeaders = transHeaderMetadata.keySet().stream().findFirst().orElse(""); - String[] transHeaderArray = transHeaders.split(","); - HttpHeaders headers = serverHttpRequest.getHeaders(); - Set headerKeys = headers.keySet(); - Iterator iterator = headerKeys.iterator(); - while (iterator.hasNext()) { - String httpHeader = iterator.next(); - Arrays.stream(transHeaderArray).forEach(transHeader -> { - if (transHeader.equals(httpHeader)) { - List list = headers.get(httpHeader); - String httpHeaderValue = JacksonUtils.serialize2Json(list); - MetadataContextHolder.get() - .putContext(FRAGMENT_RAW_TRANSHEADERS_KV, httpHeader, httpHeaderValue); - } - }); - } - } - } - private Map getIntervalMetadata(ServerHttpRequest serverHttpRequest, String headerName) { HttpHeaders httpHeaders = serverHttpRequest.getHeaders(); String customMetadataStr = httpHeaders.getFirst(headerName); 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 b446af2e..c4e2eefa 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 @@ -21,8 +21,6 @@ package com.tencent.cloud.metadata.core; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; -import java.util.Arrays; -import java.util.Enumeration; import java.util.HashMap; import java.util.Map; @@ -39,15 +37,12 @@ import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; import org.springframework.lang.NonNull; -import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.filter.OncePerRequestFilter; import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; import static com.tencent.cloud.common.constant.MetadataConstant.HeaderName.CUSTOM_DISPOSABLE_METADATA; import static com.tencent.cloud.common.constant.MetadataConstant.HeaderName.CUSTOM_METADATA; -import static com.tencent.cloud.common.metadata.MetadataContext.FRAGMENT_RAW_TRANSHEADERS; -import static com.tencent.cloud.common.metadata.MetadataContext.FRAGMENT_RAW_TRANSHEADERS_KV; /** * Filter used for storing the metadata from upstream temporarily when web application is @@ -76,33 +71,13 @@ public class DecodeTransferMetadataServletFilter extends OncePerRequestFilter { MetadataContextHolder.init(mergedTransitiveMetadata, mergedDisposableMetadata); - setCompleteTransHeaderIntoMC(httpServletRequest); - filterChain.doFilter(httpServletRequest, httpServletResponse); - } - - /** - * According to HttpServletRequest and trans-headers(key list in string type) in metadata, build - * the complete headers(key-value list in map type) into metadata. - */ - private void setCompleteTransHeaderIntoMC(HttpServletRequest httpServletRequest) { - // transHeaderMetadata: for example, {"trans-headers" : {"header1,header2,header3":""}} - Map transHeaderMetadata = MetadataContextHolder.get() - .getFragmentContext(FRAGMENT_RAW_TRANSHEADERS); - if (!CollectionUtils.isEmpty(transHeaderMetadata)) { - String transHeaders = transHeaderMetadata.keySet().stream().findFirst().orElse(""); - String[] transHeaderArray = transHeaders.split(","); - Enumeration httpHeaders = httpServletRequest.getHeaderNames(); - while (httpHeaders.hasMoreElements()) { - String httpHeader = httpHeaders.nextElement(); - Arrays.stream(transHeaderArray).forEach(transHeader -> { - if (transHeader.equals(httpHeader)) { - String httpHeaderValue = httpServletRequest.getHeader(httpHeader); - // for example, {"trans-headers-kv" : {"header1":"v1","header2":"v2"...}} - MetadataContextHolder.get() - .putContext(FRAGMENT_RAW_TRANSHEADERS_KV, httpHeader, httpHeaderValue); - } - }); - } + TransHeadersTransfer.transfer(httpServletRequest); + try { + filterChain.doFilter(httpServletRequest, httpServletResponse); + } + finally { + // Clean up ThreadLocal. + MetadataContextHolder.remove(); } } 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 b35ec02d..68d3ed00 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 @@ -19,7 +19,6 @@ package com.tencent.cloud.metadata.core; import java.io.UnsupportedEncodingException; -import java.util.HashMap; import java.util.Map; import com.tencent.cloud.common.constant.MetadataConstant; @@ -59,21 +58,14 @@ public class EncodeTransferMedataFeignInterceptor implements RequestInterceptor, public void apply(RequestTemplate requestTemplate) { // get metadata of current thread MetadataContext metadataContext = MetadataContextHolder.get(); - Map customMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); - Map disposableMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_DISPOSABLE); - Map transHeaders = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_RAW_TRANSHEADERS_KV); + Map customMetadata = metadataContext.getCustomMetadata(); + Map disposableMetadata = metadataContext.getDisposableMetadata(); + Map transHeaders = metadataContext.getTransHeaders(); - // Clean up one-time metadata coming from upstream . - Map newestCustomMetadata = new HashMap<>(); - customMetadata.forEach((key, value) -> { - if (!disposableMetadata.containsKey(key)) { - newestCustomMetadata.put(key, value); - } - }); this.buildMetadataHeader(requestTemplate, disposableMetadata, CUSTOM_DISPOSABLE_METADATA); // process custom metadata - this.buildMetadataHeader(requestTemplate, newestCustomMetadata, CUSTOM_METADATA); + this.buildMetadataHeader(requestTemplate, customMetadata, CUSTOM_METADATA); // set headers that need to be transmitted from the upstream this.buildTransmittedHeader(requestTemplate, transHeaders); 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 89d5c5f6..9420b628 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 @@ -21,7 +21,6 @@ package com.tencent.cloud.metadata.core; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; -import java.util.HashMap; import java.util.Map; import com.tencent.cloud.common.constant.MetadataConstant; @@ -59,21 +58,15 @@ public class EncodeTransferMedataRestTemplateInterceptor implements ClientHttpRe @NonNull ClientHttpRequestExecution clientHttpRequestExecution) throws IOException { // get metadata of current thread MetadataContext metadataContext = MetadataContextHolder.get(); - Map customMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); - Map disposableMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_DISPOSABLE); - Map transHeaders = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_RAW_TRANSHEADERS_KV); + Map customMetadata = metadataContext.getCustomMetadata(); + Map disposableMetadata = metadataContext.getDisposableMetadata(); + Map transHeaders = metadataContext.getTransHeaders(); - Map newestCustomMetadata = new HashMap<>(); - customMetadata.forEach((key, value) -> { - if (!disposableMetadata.containsKey(key)) { - newestCustomMetadata.put(key, value); - } - }); // build custom disposable metadata request header this.buildMetadataHeader(httpRequest, disposableMetadata, CUSTOM_DISPOSABLE_METADATA); // build custom metadata request header - this.buildMetadataHeader(httpRequest, newestCustomMetadata, CUSTOM_METADATA); + this.buildMetadataHeader(httpRequest, customMetadata, CUSTOM_METADATA); // set headers that need to be transmitted from the upstream this.buildTransmittedHeader(httpRequest, transHeaders); 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 32c693d9..ca079e72 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 @@ -20,12 +20,7 @@ package com.tencent.cloud.metadata.core; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; import java.util.Map; -import java.util.Set; import com.tencent.cloud.common.constant.MetadataConstant; import com.tencent.cloud.common.metadata.MetadataContext; @@ -36,7 +31,6 @@ import reactor.core.publisher.Mono; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; -import org.springframework.http.HttpHeaders; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.util.CollectionUtils; import org.springframework.web.server.ServerWebExchange; @@ -44,8 +38,6 @@ import org.springframework.web.server.ServerWebExchange; import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; import static com.tencent.cloud.common.constant.MetadataConstant.HeaderName.CUSTOM_DISPOSABLE_METADATA; import static com.tencent.cloud.common.constant.MetadataConstant.HeaderName.CUSTOM_METADATA; -import static com.tencent.cloud.common.metadata.MetadataContext.FRAGMENT_RAW_TRANSHEADERS; -import static com.tencent.cloud.common.metadata.MetadataContext.FRAGMENT_RAW_TRANSHEADERS_KV; import static org.springframework.cloud.gateway.filter.LoadBalancerClientFilter.LOAD_BALANCER_CLIENT_FILTER_ORDER; /** @@ -73,53 +65,16 @@ public class EncodeTransferMedataScgFilter implements GlobalFilter, Ordered { metadataContext = MetadataContextHolder.get(); } - Map customMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); - Map disposableMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_DISPOSABLE); + Map customMetadata = metadataContext.getCustomMetadata(); + Map disposableMetadata = metadataContext.getDisposableMetadata(); - // Clean upstream disposable metadata. - Map newestCustomMetadata = new HashMap<>(); - customMetadata.forEach((key, value) -> { - if (!disposableMetadata.containsKey(key)) { - newestCustomMetadata.put(key, value); - } - }); - - this.buildMetadataHeader(builder, newestCustomMetadata, CUSTOM_METADATA); + this.buildMetadataHeader(builder, customMetadata, CUSTOM_METADATA); this.buildMetadataHeader(builder, disposableMetadata, CUSTOM_DISPOSABLE_METADATA); - setCompleteTransHeaderIntoMC(exchange.getRequest()); + TransHeadersTransfer.transfer(exchange.getRequest()); return chain.filter(exchange.mutate().request(builder.build()).build()); } - /** - * According to ServerHttpRequest and trans-headers(key list in string type) in metadata, build - * the complete headers(key-value list in map type) into metadata. - */ - private void setCompleteTransHeaderIntoMC(ServerHttpRequest serverHttpRequest) { - // transHeaderMetadata: for example, {"trans-headers" : {"header1,header2,header3":""}} - Map transHeaderMetadata = MetadataContextHolder.get() - .getFragmentContext(FRAGMENT_RAW_TRANSHEADERS); - if (!CollectionUtils.isEmpty(transHeaderMetadata)) { - String transHeaders = transHeaderMetadata.keySet().stream().findFirst().orElse(""); - String[] transHeaderArray = transHeaders.split(","); - HttpHeaders headers = serverHttpRequest.getHeaders(); - Set headerKeys = headers.keySet(); - Iterator iterator = headerKeys.iterator(); - while (iterator.hasNext()) { - String httpHeader = iterator.next(); - Arrays.stream(transHeaderArray).forEach(transHeader -> { - if (transHeader.equals(httpHeader)) { - List list = headers.get(httpHeader); - String httpHeaderValue = JacksonUtils.serialize2Json(list); - // for example, {"trans-headers-kv" : {"header1":"v1","header2":"v2"...}} - MetadataContextHolder.get() - .putContext(FRAGMENT_RAW_TRANSHEADERS_KV, httpHeader, httpHeaderValue); - } - }); - } - } - } - /** * Set metadata into the request header for {@link ServerHttpRequest.Builder} . * @param builder instance of {@link ServerHttpRequest.Builder} 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 659603c7..62e4857c 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 @@ -20,9 +20,6 @@ package com.tencent.cloud.metadata.core; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; -import java.util.Arrays; -import java.util.Enumeration; -import java.util.HashMap; import java.util.Map; import com.netflix.zuul.ZuulFilter; @@ -36,8 +33,6 @@ import org.springframework.util.CollectionUtils; import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; import static com.tencent.cloud.common.constant.MetadataConstant.HeaderName.CUSTOM_DISPOSABLE_METADATA; import static com.tencent.cloud.common.constant.MetadataConstant.HeaderName.CUSTOM_METADATA; -import static com.tencent.cloud.common.metadata.MetadataContext.FRAGMENT_RAW_TRANSHEADERS; -import static com.tencent.cloud.common.metadata.MetadataContext.FRAGMENT_RAW_TRANSHEADERS_KV; import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.RIBBON_ROUTING_FILTER_ORDER; import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.ROUTE_TYPE; @@ -71,52 +66,17 @@ public class EncodeTransferMetadataZuulFilter extends ZuulFilter { // get metadata of current thread MetadataContext metadataContext = MetadataContextHolder.get(); - // add new metadata and cover old - Map customMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); - Map disposableMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_DISPOSABLE); - - // Clean upstream disposable metadata. - Map newestCustomMetadata = new HashMap<>(); - customMetadata.forEach((key, value) -> { - if (!disposableMetadata.containsKey(key)) { - newestCustomMetadata.put(key, value); - } - }); + Map customMetadata = metadataContext.getCustomMetadata(); + Map disposableMetadata = metadataContext.getDisposableMetadata(); // Rebuild Metadata Header - this.buildMetadataHeader(requestContext, newestCustomMetadata, CUSTOM_METADATA); + this.buildMetadataHeader(requestContext, customMetadata, CUSTOM_METADATA); this.buildMetadataHeader(requestContext, disposableMetadata, CUSTOM_DISPOSABLE_METADATA); - setCompleteTransHeaderIntoMC(requestContext); + TransHeadersTransfer.transfer(requestContext.getRequest()); return null; } - /** - * According to ServerHttpRequest and trans-headers(key list in string type) in metadata, build - * the complete headers(key-value list in map type) into metadata. - */ - private void setCompleteTransHeaderIntoMC(RequestContext requestContext) { - // transHeaderMetadata: for example, {"trans-headers" : {"header1,header2,header3":""}} - Map transHeaderMetadata = MetadataContextHolder.get() - .getFragmentContext(FRAGMENT_RAW_TRANSHEADERS); - if (!CollectionUtils.isEmpty(transHeaderMetadata)) { - String transHeaders = transHeaderMetadata.keySet().stream().findFirst().orElse(""); - String[] transHeaderArray = transHeaders.split(","); - Enumeration httpHeaders = requestContext.getRequest().getHeaderNames(); - while (httpHeaders.hasMoreElements()) { - String httpHeader = httpHeaders.nextElement(); - Arrays.stream(transHeaderArray).forEach(transHeader -> { - if (transHeader.equals(httpHeader)) { - String httpHeaderValue = requestContext.getRequest().getHeader(httpHeader); - // for example, {"trans-headers-kv" : {"header1":"v1","header2":"v2"...}} - MetadataContextHolder.get() - .putContext(FRAGMENT_RAW_TRANSHEADERS_KV, httpHeader, httpHeaderValue); - } - }); - } - } - } - /** * Set metadata into the request header for {@link RequestContext} . * diff --git a/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/TransHeadersTransfer.java b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/TransHeadersTransfer.java new file mode 100644 index 00000000..dd9a337d --- /dev/null +++ b/spring-cloud-starter-tencent-metadata-transfer/src/main/java/com/tencent/cloud/metadata/core/TransHeadersTransfer.java @@ -0,0 +1,99 @@ +/* + * 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.core; + +import java.util.Arrays; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; + +import com.tencent.cloud.common.metadata.MetadataContextHolder; +import com.tencent.cloud.common.util.JacksonUtils; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.util.CollectionUtils; + +/** + * According to request and trans-headers(key list in string type) in metadata, build + * the complete headers(key-value list in map type) into metadata. + * + * @author lingxiao.wlx + */ +public final class TransHeadersTransfer { + + private TransHeadersTransfer() { + } + + /** + * According to {@link HttpServletRequest} and trans-headers(key list in string type) in metadata, build + * the complete headers(key-value list in map type) into metadata. + * + * @param httpServletRequest httpServletRequest + */ + public static void transfer(HttpServletRequest httpServletRequest) { + // transHeaderMetadata: for example, {"trans-headers" : {"header1,header2,header3":""}} + Map transHeaderMetadata = MetadataContextHolder.get().getTransHeaders(); + if (!CollectionUtils.isEmpty(transHeaderMetadata)) { + String transHeaders = transHeaderMetadata.keySet().stream().findFirst().orElse(""); + String[] transHeaderArray = transHeaders.split(","); + Enumeration httpHeaders = httpServletRequest.getHeaderNames(); + while (httpHeaders.hasMoreElements()) { + String httpHeader = httpHeaders.nextElement(); + Arrays.stream(transHeaderArray).forEach(transHeader -> { + if (transHeader.equals(httpHeader)) { + String httpHeaderValue = httpServletRequest.getHeader(httpHeader); + // for example, {"trans-headers-kv" : {"header1":"v1","header2":"v2"...}} + MetadataContextHolder.get().setTransHeadersKV(httpHeader, httpHeaderValue); + } + }); + } + } + } + + /** + * According to {@link ServerHttpRequest} and trans-headers(key list in string type) in metadata, build + * the complete headers(key-value list in map type) into metadata. + * + * @param serverHttpRequest serverHttpRequest + */ + public static void transfer(ServerHttpRequest serverHttpRequest) { + // transHeaderMetadata: for example, {"trans-headers" : {"header1,header2,header3":""}} + Map transHeaderMetadata = MetadataContextHolder.get().getTransHeaders(); + if (!CollectionUtils.isEmpty(transHeaderMetadata)) { + String transHeaders = transHeaderMetadata.keySet().stream().findFirst().orElse(""); + String[] transHeaderArray = transHeaders.split(","); + HttpHeaders headers = serverHttpRequest.getHeaders(); + Set headerKeys = headers.keySet(); + for (String httpHeader : headerKeys) { + Arrays.stream(transHeaderArray).forEach(transHeader -> { + if (transHeader.equals(httpHeader)) { + List list = headers.get(httpHeader); + String httpHeaderValue = JacksonUtils.serialize2Json(list); + // for example, {"trans-headers-kv" : {"header1":"v1","header2":"v2"...}} + MetadataContextHolder.get().setTransHeadersKV(httpHeader, httpHeaderValue); + } + }); + } + } + } +} diff --git a/spring-cloud-starter-tencent-metadata-transfer/src/test/java/com/tencent/cloud/metadata/core/TransHeadersTransferTest.java b/spring-cloud-starter-tencent-metadata-transfer/src/test/java/com/tencent/cloud/metadata/core/TransHeadersTransferTest.java new file mode 100644 index 00000000..4b7b09a5 --- /dev/null +++ b/spring-cloud-starter-tencent-metadata-transfer/src/test/java/com/tencent/cloud/metadata/core/TransHeadersTransferTest.java @@ -0,0 +1,86 @@ +/* + * 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.core; + +import java.util.Map; + +import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.cloud.common.metadata.MetadataContextHolder; +import com.tencent.cloud.common.util.JacksonUtils; +import org.junit.AfterClass; +import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.runner.RunWith; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.mock.http.server.reactive.MockServerHttpRequest; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +/** + * Test for {@link TransHeadersTransfer}. + * + * @author lingxiao.wlx + */ +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = RANDOM_PORT, + classes = DecodeTransferMetadataServletFilterTest.TestApplication.class, + properties = {"spring.config.location = classpath:application-test.yml", "spring.main.web-application-type=reactive"}) +public class TransHeadersTransferTest { + @AfterClass + public static void afterClass() { + MetadataContextHolder.remove(); + } + + @Test + public void transferServletTest() { + MetadataContext metadataContext = MetadataContextHolder.get(); + metadataContext.setTransHeaders("header1,header2,header3", ""); + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader("header1", "1"); + request.addHeader("header2", "2"); + request.addHeader("header3", "3"); + TransHeadersTransfer.transfer(request); + Map transHeadersKV = MetadataContextHolder.get().getTransHeadersKV(); + Assertions.assertEquals(transHeadersKV.get("header1"), "1"); + Assertions.assertEquals(transHeadersKV.get("header2"), "2"); + Assertions.assertEquals(transHeadersKV.get("header3"), "3"); + } + + @Test + public void transferReactiveTest() { + MetadataContext metadataContext = MetadataContextHolder.get(); + metadataContext.setTransHeaders("header1,header2,header3", ""); + MockServerHttpRequest.BaseBuilder builder = MockServerHttpRequest.get(""); + String[] header1 = {"1"}; + String[] header2 = {"2"}; + String[] header3 = {"3"}; + builder.header("header1", header1); + builder.header("header2", header2); + builder.header("header3", header3); + MockServerHttpRequest request = builder.build(); + TransHeadersTransfer.transfer(request); + Map transHeadersKV = MetadataContextHolder.get().getTransHeadersKV(); + Assertions.assertEquals(transHeadersKV.get("header1"), JacksonUtils.serialize2Json(header1)); + Assertions.assertEquals(transHeadersKV.get("header2"), JacksonUtils.serialize2Json(header2)); + Assertions.assertEquals(transHeadersKV.get("header3"), JacksonUtils.serialize2Json(header3)); + } +} diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/feign/RouterLabelFeignInterceptor.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/feign/RouterLabelFeignInterceptor.java index 9f3a4ecf..ed0453d6 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/feign/RouterLabelFeignInterceptor.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/feign/RouterLabelFeignInterceptor.java @@ -89,6 +89,7 @@ public class RouterLabelFeignInterceptor implements RequestInterceptor, Ordered String peerServiceName = requestTemplate.feignTarget().name(); Set expressionLabelKeys = routerRuleLabelResolver.getExpressionLabelKeys(MetadataContext.LOCAL_NAMESPACE, MetadataContext.LOCAL_SERVICE, peerServiceName); + Map ruleExpressionLabels = getRuleExpressionLabels(requestTemplate, expressionLabelKeys); labels.putAll(ruleExpressionLabels); @@ -108,8 +109,7 @@ public class RouterLabelFeignInterceptor implements RequestInterceptor, Ordered } // labels from downstream - Map transitiveLabels = MetadataContextHolder.get() - .getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + Map transitiveLabels = MetadataContextHolder.get().getTransitiveMetadata(); labels.putAll(transitiveLabels); // pass label by header @@ -124,7 +124,6 @@ public class RouterLabelFeignInterceptor implements RequestInterceptor, Ordered } private Map getRuleExpressionLabels(RequestTemplate requestTemplate, Set labelKeys) { - if (CollectionUtils.isEmpty(labelKeys)) { return Collections.emptyMap(); } diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/FeignExpressionLabelUtilsTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/FeignExpressionLabelUtilsTest.java index fa9086d5..66aa7e7b 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/FeignExpressionLabelUtilsTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/FeignExpressionLabelUtilsTest.java @@ -31,8 +31,7 @@ import org.springframework.util.StringUtils; /** * Test for {@link FeignExpressionLabelUtils}. - * - * @author lepdou 2022-05-26 + *@author lepdou 2022-05-26 */ public class FeignExpressionLabelUtilsTest { diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/RouterLabelFeignInterceptorTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/RouterLabelFeignInterceptorTest.java index 3eda0d61..ee589d63 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/RouterLabelFeignInterceptorTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/RouterLabelFeignInterceptorTest.java @@ -46,7 +46,6 @@ import org.mockito.MockedStatic; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; -import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; @@ -68,10 +67,10 @@ public class RouterLabelFeignInterceptorTest { private PolarisContextProperties polarisContextProperties; @Test - public void testResolveRouterLabel() { + public void testResolveRouterLabel() throws UnsupportedEncodingException { RouterLabelFeignInterceptor routerLabelFeignInterceptor = new RouterLabelFeignInterceptor( - Collections.singletonList(routerLabelResolver), staticMetadataManager, routerRuleLabelResolver, - polarisContextProperties); + Collections.singletonList(routerLabelResolver), + staticMetadataManager, routerRuleLabelResolver, polarisContextProperties); // mock request template RequestTemplate requestTemplate = new RequestTemplate(); @@ -94,7 +93,7 @@ public class RouterLabelFeignInterceptorTest { Map transitiveLabels = new HashMap<>(); transitiveLabels.put("k1", "v1"); transitiveLabels.put("k2", "v22"); - when(metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE)).thenReturn(transitiveLabels); + when(metadataContext.getTransitiveMetadata()).thenReturn(transitiveLabels); // mock MetadataContextHolder#get try (MockedStatic mockedMetadataContextHolder = Mockito.mockStatic(MetadataContextHolder.class)) { @@ -113,7 +112,6 @@ public class RouterLabelFeignInterceptorTest { customResolvedLabels.put("k3", "v3"); when(routerLabelResolver.resolve(requestTemplate, expressionKeys)).thenReturn(customResolvedLabels); - // mock local metadata Map localMetadata = new HashMap<>(); localMetadata.put("k3", "v31"); localMetadata.put("k4", "v4"); @@ -122,23 +120,17 @@ public class RouterLabelFeignInterceptorTest { routerLabelFeignInterceptor.apply(requestTemplate); Collection routerLabels = requestTemplate.headers().get(RouterConstant.ROUTER_LABEL_HEADER); - Map routerLabelsMap = new HashMap<>(); - try { - String routerLabelContent = routerLabels.stream().findFirst().get(); - routerLabelsMap.putAll(JacksonUtils.deserialize2Map( - URLDecoder.decode(routerLabelContent, UTF_8))); - } - catch (UnsupportedEncodingException e) { - throw new RuntimeException("unsupported charset exception " + UTF_8); - } - Assert.assertNotNull(routerLabelsMap); - for (String value : routerLabelsMap.values()) { - Assert.assertEquals("v1", routerLabelsMap.get("k1")); - Assert.assertEquals("v22", routerLabelsMap.get("k2")); - Assert.assertEquals("v3", routerLabelsMap.get("k3")); - Assert.assertEquals("v4", routerLabelsMap.get("k4")); - Assert.assertEquals(headerUidValue, routerLabelsMap.get("${http.header.uid}")); - Assert.assertEquals("", routerLabelsMap.get("${http.header.name}")); + + Assert.assertNotNull(routerLabels); + for (String value : routerLabels) { + Map labels = JacksonUtils.deserialize2Map(URLDecoder.decode(value, "UTF-8")); + + Assert.assertEquals("v1", labels.get("k1")); + Assert.assertEquals("v22", labels.get("k2")); + Assert.assertEquals("v3", labels.get("k3")); + Assert.assertEquals("v4", labels.get("k4")); + Assert.assertEquals(headerUidValue, labels.get("${http.header.uid}")); + Assert.assertEquals("", labels.get("${http.header.name}")); } } } 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 f8078c39..510d3f69 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 @@ -19,6 +19,7 @@ package com.tencent.cloud.common.metadata; import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -112,6 +113,64 @@ public class MetadataContext { this.fragmentContexts = new ConcurrentHashMap<>(); } + + public Map getDisposableMetadata() { + return this.getFragmentContext(MetadataContext.FRAGMENT_DISPOSABLE); + } + + public Map getTransitiveMetadata() { + return this.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + } + + public Map getCustomMetadata() { + Map transitiveMetadata = this.getTransitiveMetadata(); + Map disposableMetadata = this.getDisposableMetadata(); + Map customMetadata = new HashMap<>(); + // Clean up one-time metadata coming from upstream . + transitiveMetadata.forEach((key, value) -> { + if (!disposableMetadata.containsKey(key)) { + customMetadata.put(key, value); + } + }); + return Collections.unmodifiableMap(customMetadata); + } + + public Map getTransHeaders() { + return this.getFragmentContext(MetadataContext.FRAGMENT_RAW_TRANSHEADERS); + } + + public Map getTransHeadersKV() { + return this.getFragmentContext(MetadataContext.FRAGMENT_RAW_TRANSHEADERS_KV); + } + + public Map getLoadbalancerMetadata() { + return this.getFragmentContext(FRAGMENT_LOAD_BALANCER); + } + + public void setTransitiveMetadata(Map transitiveMetadata) { + this.putFragmentContext(FRAGMENT_TRANSITIVE, Collections.unmodifiableMap(transitiveMetadata)); + } + + public void setDisposableMetadata(Map disposableMetadata) { + this.putFragmentContext(FRAGMENT_DISPOSABLE, Collections.unmodifiableMap(disposableMetadata)); + } + + public void setUpstreamDisposableMetadata(Map upstreamDisposableMetadata) { + this.putFragmentContext(FRAGMENT_UPSTREAM_DISPOSABLE, Collections.unmodifiableMap(upstreamDisposableMetadata)); + } + + public void setTransHeadersKV(String key, String value) { + this.putContext(FRAGMENT_RAW_TRANSHEADERS_KV, key, value); + } + + public void setTransHeaders(String key, String value) { + this.putContext(FRAGMENT_RAW_TRANSHEADERS, key, value); + } + + public void setLoadbalancer(String key, String value) { + this.putContext(FRAGMENT_LOAD_BALANCER, key, value); + } + public Map getFragmentContext(String fragment) { Map fragmentContext = fragmentContexts.get(fragment); if (fragmentContext == null) { 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 e0dbd2d9..60983ef6 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 @@ -13,7 +13,6 @@ * 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.common.metadata; @@ -44,6 +43,7 @@ public final class MetadataContextHolder { private static final ThreadLocal METADATA_CONTEXT = new InheritableThreadLocal<>(); private static MetadataLocalProperties metadataLocalProperties; + private static StaticMetadataManager staticMetadataManager; private MetadataContextHolder() { diff --git a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/MetadataContextHolderTest.java b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/MetadataContextHolderTest.java index a7214b03..bda0535b 100644 --- a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/MetadataContextHolderTest.java +++ b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/MetadataContextHolderTest.java @@ -13,7 +13,6 @@ * 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.common.metadata; @@ -47,10 +46,10 @@ public class MetadataContextHolderTest { customMetadata.put("a", "1"); customMetadata.put("b", "2"); MetadataContext metadataContext = MetadataContextHolder.get(); - metadataContext.putFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE, customMetadata); + metadataContext.setTransitiveMetadata(customMetadata); MetadataContextHolder.set(metadataContext); - customMetadata = MetadataContextHolder.get().getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + customMetadata = MetadataContextHolder.get().getTransitiveMetadata(); Assertions.assertThat(customMetadata.get("a")).isEqualTo("1"); Assertions.assertThat(customMetadata.get("b")).isEqualTo("2"); @@ -62,7 +61,7 @@ public class MetadataContextHolderTest { customMetadata.put("c", "3"); MetadataContextHolder.init(customMetadata, new HashMap<>()); metadataContext = MetadataContextHolder.get(); - customMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + customMetadata = metadataContext.getTransitiveMetadata(); Assertions.assertThat(customMetadata.get("a")).isEqualTo("1"); Assertions.assertThat(customMetadata.get("b")).isEqualTo("22"); Assertions.assertThat(customMetadata.get("c")).isEqualTo("3"); diff --git a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/ExpressionParserV1Test.java b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/ExpressionParserV1Test.java index 2f6e5b64..ae55900f 100644 --- a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/ExpressionParserV1Test.java +++ b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/ExpressionParserV1Test.java @@ -22,7 +22,7 @@ import org.junit.Assert; import org.junit.Test; /** - * Test for {@link ExpressionParserV1} + * Test for {@link ExpressionParserV1}. * @author lepdou 2022-10-08 */ public class ExpressionParserV1Test { diff --git a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/ExpressionParserV2Test.java b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/ExpressionParserV2Test.java index a97b64ba..38d4a661 100644 --- a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/ExpressionParserV2Test.java +++ b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/ExpressionParserV2Test.java @@ -22,7 +22,7 @@ import org.junit.Assert; import org.junit.Test; /** - * Test for {@link ExpressionParserV2} + * Test for {@link ExpressionParserV2}. * @author lepdou 2022-10-08 */ public class ExpressionParserV2Test { 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 7da621e8..9ee58a04 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 @@ -55,7 +55,7 @@ public class MetadataBackendController { // Get Custom Metadata From Context MetadataContext context = MetadataContextHolder.get(); - Map customMetadataMap = context.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + Map customMetadataMap = context.getTransitiveMetadata(); customMetadataMap.forEach((key, value) -> { LOG.info("Metadata Backend Custom Metadata (Key-Value): {} : {}", key, value); 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 3d107f55..20ca8ae3 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 @@ -69,7 +69,7 @@ public class MetadataFrontendController { // Get Custom Metadata From Context MetadataContext context = MetadataContextHolder.get(); - Map customMetadataMap = context.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + Map customMetadataMap = context.getTransitiveMetadata(); customMetadataMap.forEach((key, value) -> { LOG.info("Metadata Middle Custom Metadata (Key-Value): {} : {}", key, value); @@ -116,7 +116,7 @@ public class MetadataFrontendController { // Get Custom Metadata From Context MetadataContext context = MetadataContextHolder.get(); - Map customMetadataMap = context.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + Map customMetadataMap = context.getTransitiveMetadata(); customMetadataMap.forEach((key, value) -> { LOG.info("Metadata Middle Custom Metadata (Key-Value): {} : {}", key, value); 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 7ea673a5..18f075e2 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 @@ -92,7 +92,7 @@ public class MetadataMiddleController { // Get Custom Metadata From Context MetadataContext context = MetadataContextHolder.get(); - Map customMetadataMap = context.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + Map customMetadataMap = context.getTransitiveMetadata(); customMetadataMap.forEach((key, value) -> { LOG.info("Metadata Middle Custom Metadata (Key-Value): {} : {}", key, value); diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-gateway-plugin/src/main/java/com/tencent/cloud/plugin/gateway/staining/TrafficStainingGatewayFilter.java b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-gateway-plugin/src/main/java/com/tencent/cloud/plugin/gateway/staining/TrafficStainingGatewayFilter.java index c6ddfd45..e81dec91 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-gateway-plugin/src/main/java/com/tencent/cloud/plugin/gateway/staining/TrafficStainingGatewayFilter.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-tencent-gateway-plugin/src/main/java/com/tencent/cloud/plugin/gateway/staining/TrafficStainingGatewayFilter.java @@ -77,13 +77,13 @@ public class TrafficStainingGatewayFilter implements GlobalFilter, Ordered { metadataContext = MetadataContextHolder.get(); } - Map oldTransitiveMetadata = metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE); + Map oldTransitiveMetadata = metadataContext.getTransitiveMetadata(); // append new transitive metadata Map newTransitiveMetadata = new HashMap<>(oldTransitiveMetadata); newTransitiveMetadata.putAll(stainedLabels); - metadataContext.putFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE, newTransitiveMetadata); + metadataContext.setTransitiveMetadata(newTransitiveMetadata); }).build(); return chain.filter(exchange.mutate().request(request).build()); diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java index ed2f0205..021ba726 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporter.java @@ -115,8 +115,7 @@ public class EnhancedRestTemplateReporter extends AbstractPolarisReporterAdapter private void reportResult(URI url, ClientHttpResponse response) { ServiceCallResult resultRequest = createServiceCallResult(url); try { - Map loadBalancerContext = MetadataContextHolder.get() - .getFragmentContext(MetadataContext.FRAGMENT_LOAD_BALANCER); + Map loadBalancerContext = MetadataContextHolder.get().getLoadbalancerMetadata(); String targetHost = loadBalancerContext.get("host"); String targetPort = loadBalancerContext.get("port"); @@ -134,7 +133,7 @@ public class EnhancedRestTemplateReporter extends AbstractPolarisReporterAdapter resultRequest.setRetStatus(RetStatus.RetFail); } - List labels = response.getHeaders().get(RouterConstant.ROUTER_LABELS); + List labels = response.getHeaders().get(RouterConstant.ROUTER_LABEL_HEADER); if (CollectionUtils.isNotEmpty(labels)) { String label = labels.get(0); try { diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporterTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporterTest.java index 7372eceb..581c2d09 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporterTest.java +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateReporterTest.java @@ -61,7 +61,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** - * Test for {@link EnhancedRestTemplateReporter} + * Test for {@link EnhancedRestTemplateReporter}. * @author lepdou 2022-09-06 */ @RunWith(MockitoJUnitRunner.class) @@ -91,7 +91,7 @@ public class EnhancedRestTemplateReporterTest { Map loadBalancerContext = new HashMap<>(); loadBalancerContext.put("host", "1.1.1.1"); loadBalancerContext.put("port", "8080"); - when(metadataContext.getFragmentContext(MetadataContext.FRAGMENT_LOAD_BALANCER)).thenReturn(loadBalancerContext); + when(metadataContext.getLoadbalancerMetadata()).thenReturn(loadBalancerContext); mockedMetadataContextHolder = Mockito.mockStatic(MetadataContextHolder.class); mockedMetadataContextHolder.when(MetadataContextHolder::get).thenReturn(metadataContext); @@ -129,7 +129,7 @@ public class EnhancedRestTemplateReporterTest { URI uri = mock(URI.class); String labels = URLEncoder.encode("{\"k1\":\"v1\",\"k2\":\"v2\"}", UTF_8); - response.getHeaders().set(RouterConstant.ROUTER_LABELS, labels); + response.getHeaders().set(RouterConstant.ROUTER_LABEL_HEADER, labels); enhancedRestTemplateReporter.handleError(uri, HttpMethod.GET, response); verify(consumerAPI, times(2)).updateServiceCallResult((ServiceCallResult) captor.capture());