fix: router-lane rule support caller ip (#1253)

pull/1255/head
shedfreewu 1 year ago committed by GitHub
parent d4c8fff31a
commit 27b96bb7bb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -4,4 +4,5 @@
- [feat: support lossless register and deregister at #977](https://github.com/Tencent/spring-cloud-tencent/pull/1242) - [feat: support lossless register and deregister at #977](https://github.com/Tencent/spring-cloud-tencent/pull/1242)
- [feat: PolarisServiceRegistry#deregister support idempotency.](https://github.com/Tencent/spring-cloud-tencent/pull/1243) - [feat: PolarisServiceRegistry#deregister support idempotency.](https://github.com/Tencent/spring-cloud-tencent/pull/1243)
- [feat: SCT元数据管理能力与polaris-java元数据管理能力进行下沉及整合](https://github.com/Tencent/spring-cloud-tencent/pull/1249) - [feat: SCT元数据管理能力与polaris-java元数据管理能力进行下沉及整合](https://github.com/Tencent/spring-cloud-tencent/pull/1249)
- [feat: support lane router](https://github.com/Tencent/spring-cloud-tencent/pull/1250) - [feat: support lane router](https://github.com/Tencent/spring-cloud-tencent/pull/1250)
- [feat: lane router rule support caller ip](https://github.com/Tencent/spring-cloud-tencent/pull/1253)

@ -26,6 +26,7 @@ import com.tencent.cloud.metadata.core.EncodeTransferMedataRestTemplateEnhancedP
import com.tencent.cloud.metadata.core.EncodeTransferMedataScgEnhancedPlugin; import com.tencent.cloud.metadata.core.EncodeTransferMedataScgEnhancedPlugin;
import com.tencent.cloud.metadata.core.EncodeTransferMedataWebClientEnhancedPlugin; import com.tencent.cloud.metadata.core.EncodeTransferMedataWebClientEnhancedPlugin;
import com.tencent.cloud.metadata.core.EncodeTransferMetadataZuulEnhancedPlugin; import com.tencent.cloud.metadata.core.EncodeTransferMetadataZuulEnhancedPlugin;
import com.tencent.cloud.polaris.context.config.PolarisContextProperties;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@ -66,8 +67,8 @@ public class MetadataTransferAutoConfiguration {
} }
@Bean @Bean
public DecodeTransferMetadataServletFilter metadataServletFilter() { public DecodeTransferMetadataServletFilter metadataServletFilter(PolarisContextProperties polarisContextProperties) {
return new DecodeTransferMetadataServletFilter(); return new DecodeTransferMetadataServletFilter(polarisContextProperties);
} }
} }
@ -79,8 +80,8 @@ public class MetadataTransferAutoConfiguration {
protected static class MetadataReactiveFilterConfig { protected static class MetadataReactiveFilterConfig {
@Bean @Bean
public DecodeTransferMetadataReactiveFilter metadataReactiveFilter() { public DecodeTransferMetadataReactiveFilter metadataReactiveFilter(PolarisContextProperties polarisContextProperties) {
return new DecodeTransferMetadataReactiveFilter(); return new DecodeTransferMetadataReactiveFilter(polarisContextProperties);
} }
} }

@ -27,6 +27,7 @@ import com.tencent.cloud.common.metadata.MetadataContextHolder;
import com.tencent.cloud.common.util.JacksonUtils; import com.tencent.cloud.common.util.JacksonUtils;
import com.tencent.cloud.common.util.UrlUtils; import com.tencent.cloud.common.util.UrlUtils;
import com.tencent.cloud.metadata.provider.ReactiveMetadataProvider; import com.tencent.cloud.metadata.provider.ReactiveMetadataProvider;
import com.tencent.cloud.polaris.context.config.PolarisContextProperties;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
@ -49,8 +50,14 @@ import static com.tencent.cloud.common.constant.MetadataConstant.HeaderName.CUST
*/ */
public class DecodeTransferMetadataReactiveFilter implements WebFilter, Ordered { public class DecodeTransferMetadataReactiveFilter implements WebFilter, Ordered {
private PolarisContextProperties polarisContextProperties;
private static final Logger LOG = LoggerFactory.getLogger(DecodeTransferMetadataReactiveFilter.class); private static final Logger LOG = LoggerFactory.getLogger(DecodeTransferMetadataReactiveFilter.class);
public DecodeTransferMetadataReactiveFilter(PolarisContextProperties polarisContextProperties) {
this.polarisContextProperties = polarisContextProperties;
}
@Override @Override
public int getOrder() { public int getOrder() {
return OrderConstant.Server.Reactive.DECODE_TRANSFER_METADATA_FILTER_ORDER; return OrderConstant.Server.Reactive.DECODE_TRANSFER_METADATA_FILTER_ORDER;
@ -68,7 +75,7 @@ public class DecodeTransferMetadataReactiveFilter implements WebFilter, Ordered
mergedTransitiveMetadata.putAll(customTransitiveMetadata); mergedTransitiveMetadata.putAll(customTransitiveMetadata);
Map<String, String> internalDisposableMetadata = getIntervalMetadata(serverHttpRequest, CUSTOM_DISPOSABLE_METADATA); Map<String, String> internalDisposableMetadata = getIntervalMetadata(serverHttpRequest, CUSTOM_DISPOSABLE_METADATA);
Map<String, String> mergedDisposableMetadata = new HashMap<>(internalDisposableMetadata); Map<String, String> mergedDisposableMetadata = new HashMap<>(internalDisposableMetadata);
ReactiveMetadataProvider metadataProvider = new ReactiveMetadataProvider(serverHttpRequest); ReactiveMetadataProvider metadataProvider = new ReactiveMetadataProvider(serverHttpRequest, polarisContextProperties.getLocalIpAddress());
MetadataContextHolder.init(mergedTransitiveMetadata, mergedDisposableMetadata, metadataProvider); MetadataContextHolder.init(mergedTransitiveMetadata, mergedDisposableMetadata, metadataProvider);
// Save to ServerWebExchange. // Save to ServerWebExchange.
serverWebExchange.getAttributes().put( serverWebExchange.getAttributes().put(

@ -32,6 +32,7 @@ import com.tencent.cloud.common.metadata.MetadataContextHolder;
import com.tencent.cloud.common.util.JacksonUtils; import com.tencent.cloud.common.util.JacksonUtils;
import com.tencent.cloud.common.util.UrlUtils; import com.tencent.cloud.common.util.UrlUtils;
import com.tencent.cloud.metadata.provider.ServletMetadataProvider; import com.tencent.cloud.metadata.provider.ServletMetadataProvider;
import com.tencent.cloud.polaris.context.config.PolarisContextProperties;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -53,6 +54,12 @@ public class DecodeTransferMetadataServletFilter extends OncePerRequestFilter {
private static final Logger LOG = LoggerFactory.getLogger(DecodeTransferMetadataServletFilter.class); private static final Logger LOG = LoggerFactory.getLogger(DecodeTransferMetadataServletFilter.class);
private PolarisContextProperties polarisContextProperties;
public DecodeTransferMetadataServletFilter(PolarisContextProperties polarisContextProperties) {
this.polarisContextProperties = polarisContextProperties;
}
@Override @Override
protected void doFilterInternal(@NonNull HttpServletRequest httpServletRequest, protected void doFilterInternal(@NonNull HttpServletRequest httpServletRequest,
@NonNull HttpServletResponse httpServletResponse, FilterChain filterChain) @NonNull HttpServletResponse httpServletResponse, FilterChain filterChain)
@ -65,7 +72,7 @@ public class DecodeTransferMetadataServletFilter extends OncePerRequestFilter {
mergedTransitiveMetadata.putAll(customTransitiveMetadata); mergedTransitiveMetadata.putAll(customTransitiveMetadata);
Map<String, String> internalDisposableMetadata = getInternalMetadata(httpServletRequest, CUSTOM_DISPOSABLE_METADATA); Map<String, String> internalDisposableMetadata = getInternalMetadata(httpServletRequest, CUSTOM_DISPOSABLE_METADATA);
Map<String, String> mergedDisposableMetadata = new HashMap<>(internalDisposableMetadata); Map<String, String> mergedDisposableMetadata = new HashMap<>(internalDisposableMetadata);
ServletMetadataProvider metadataProvider = new ServletMetadataProvider(httpServletRequest); ServletMetadataProvider metadataProvider = new ServletMetadataProvider(httpServletRequest, polarisContextProperties.getLocalIpAddress());
MetadataContextHolder.init(mergedTransitiveMetadata, mergedDisposableMetadata, metadataProvider); MetadataContextHolder.init(mergedTransitiveMetadata, mergedDisposableMetadata, metadataProvider);
TransHeadersTransfer.transfer(httpServletRequest); TransHeadersTransfer.transfer(httpServletRequest);

@ -34,8 +34,11 @@ public class ReactiveMetadataProvider implements MetadataProvider {
private ServerHttpRequest serverHttpRequest; private ServerHttpRequest serverHttpRequest;
public ReactiveMetadataProvider(ServerHttpRequest serverHttpRequest) { private String callerIp;
public ReactiveMetadataProvider(ServerHttpRequest serverHttpRequest, String callerIp) {
this.serverHttpRequest = serverHttpRequest; this.serverHttpRequest = serverHttpRequest;
this.callerIp = callerIp;
} }
@Override @Override
@ -45,6 +48,8 @@ public class ReactiveMetadataProvider implements MetadataProvider {
return serverHttpRequest.getMethodValue(); return serverHttpRequest.getMethodValue();
case MessageMetadataContainer.LABEL_KEY_PATH: case MessageMetadataContainer.LABEL_KEY_PATH:
return UrlUtils.decode(serverHttpRequest.getPath().toString()); return UrlUtils.decode(serverHttpRequest.getPath().toString());
case MessageMetadataContainer.LABEL_KEY_CALLER_IP:
return callerIp;
default: default:
return null; return null;
} }

@ -35,8 +35,11 @@ public class ServletMetadataProvider implements MetadataProvider {
private HttpServletRequest httpServletRequest; private HttpServletRequest httpServletRequest;
public ServletMetadataProvider(HttpServletRequest httpServletRequest) { private String callerIp;
public ServletMetadataProvider(HttpServletRequest httpServletRequest, String callerIp) {
this.httpServletRequest = httpServletRequest; this.httpServletRequest = httpServletRequest;
this.callerIp = callerIp;
} }
@Override @Override
@ -46,6 +49,8 @@ public class ServletMetadataProvider implements MetadataProvider {
return httpServletRequest.getMethod(); return httpServletRequest.getMethod();
case MessageMetadataContainer.LABEL_KEY_PATH: case MessageMetadataContainer.LABEL_KEY_PATH:
return UrlUtils.decode(httpServletRequest.getRequestURI()); return UrlUtils.decode(httpServletRequest.getRequestURI());
case MessageMetadataContainer.LABEL_KEY_CALLER_IP:
return callerIp;
default: default:
return null; return null;
} }

@ -21,6 +21,7 @@ package com.tencent.cloud.metadata.config;
import com.tencent.cloud.metadata.core.EncodeTransferMedataFeignEnhancedPlugin; import com.tencent.cloud.metadata.core.EncodeTransferMedataFeignEnhancedPlugin;
import com.tencent.cloud.metadata.core.EncodeTransferMedataRestTemplateEnhancedPlugin; import com.tencent.cloud.metadata.core.EncodeTransferMedataRestTemplateEnhancedPlugin;
import com.tencent.cloud.metadata.core.EncodeTransferMedataWebClientEnhancedPlugin; import com.tencent.cloud.metadata.core.EncodeTransferMedataWebClientEnhancedPlugin;
import com.tencent.cloud.polaris.context.config.PolarisContextProperties;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.AutoConfigurations;
@ -63,7 +64,7 @@ public class MetadataTransferAutoConfigurationTest {
*/ */
@Test @Test
public void test2() { public void test2() {
this.reactiveWebApplicationContextRunner.withConfiguration(AutoConfigurations.of(MetadataTransferAutoConfiguration.class)) this.reactiveWebApplicationContextRunner.withConfiguration(AutoConfigurations.of(MetadataTransferAutoConfiguration.class, PolarisContextProperties.class))
.run(context -> { .run(context -> {
assertThat(context).hasSingleBean(MetadataTransferAutoConfiguration.MetadataTransferFeignInterceptorConfig.class); assertThat(context).hasSingleBean(MetadataTransferAutoConfiguration.MetadataTransferFeignInterceptorConfig.class);
assertThat(context).hasSingleBean(EncodeTransferMedataFeignEnhancedPlugin.class); assertThat(context).hasSingleBean(EncodeTransferMedataFeignEnhancedPlugin.class);

@ -20,6 +20,7 @@ package com.tencent.cloud.metadata.core;
import com.tencent.cloud.common.constant.MetadataConstant; import com.tencent.cloud.common.constant.MetadataConstant;
import com.tencent.cloud.common.constant.OrderConstant; import com.tencent.cloud.common.constant.OrderConstant;
import com.tencent.cloud.common.metadata.config.MetadataLocalProperties; import com.tencent.cloud.common.metadata.config.MetadataLocalProperties;
import com.tencent.cloud.polaris.context.config.PolarisContextProperties;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
@ -54,7 +55,7 @@ public class DecodeTransferMetadataReactiveFilterTest {
@BeforeEach @BeforeEach
public void setUp() { public void setUp() {
this.metadataReactiveFilter = new DecodeTransferMetadataReactiveFilter(); this.metadataReactiveFilter = new DecodeTransferMetadataReactiveFilter(new PolarisContextProperties());
} }
@Test @Test

@ -54,6 +54,7 @@ public class MetadataProviderTest {
String cookieValue1 = "cv1"; String cookieValue1 = "cv1";
String cookieValue2 = "cv2/test"; String cookieValue2 = "cv2/test";
String path = "/echo/test"; String path = "/echo/test";
String callerIp = "localhost";
MockServerHttpRequest request = MockServerHttpRequest.get(path) MockServerHttpRequest request = MockServerHttpRequest.get(path)
.header(headerKey1, headerValue1) .header(headerKey1, headerValue1)
.header(headerKey2, UrlUtils.encode(headerValue2)) .header(headerKey2, UrlUtils.encode(headerValue2))
@ -63,7 +64,7 @@ public class MetadataProviderTest {
.cookie(new HttpCookie(cookieKey2, UrlUtils.encode(cookieValue2))) .cookie(new HttpCookie(cookieKey2, UrlUtils.encode(cookieValue2)))
.build(); .build();
ReactiveMetadataProvider reactiveMetadataProvider = new ReactiveMetadataProvider(request); ReactiveMetadataProvider reactiveMetadataProvider = new ReactiveMetadataProvider(request, callerIp);
assertThat(reactiveMetadataProvider.getRawMetadataMapValue(MessageMetadataContainer.LABEL_MAP_KEY_HEADER, headerKey1)).isEqualTo(headerValue1); assertThat(reactiveMetadataProvider.getRawMetadataMapValue(MessageMetadataContainer.LABEL_MAP_KEY_HEADER, headerKey1)).isEqualTo(headerValue1);
assertThat(reactiveMetadataProvider.getRawMetadataMapValue(MessageMetadataContainer.LABEL_MAP_KEY_HEADER, headerKey2)).isEqualTo(headerValue2); assertThat(reactiveMetadataProvider.getRawMetadataMapValue(MessageMetadataContainer.LABEL_MAP_KEY_HEADER, headerKey2)).isEqualTo(headerValue2);
// com.tencent.polaris.metadata.core.manager.ComposeMetadataProvider.getRawMetadataMapValue need return null when key don't exist // com.tencent.polaris.metadata.core.manager.ComposeMetadataProvider.getRawMetadataMapValue need return null when key don't exist
@ -80,10 +81,11 @@ public class MetadataProviderTest {
assertThat(reactiveMetadataProvider.getRawMetadataStringValue(MessageMetadataContainer.LABEL_KEY_METHOD)).isEqualTo("GET"); assertThat(reactiveMetadataProvider.getRawMetadataStringValue(MessageMetadataContainer.LABEL_KEY_METHOD)).isEqualTo("GET");
assertThat(reactiveMetadataProvider.getRawMetadataStringValue(MessageMetadataContainer.LABEL_KEY_PATH)).isEqualTo(path); assertThat(reactiveMetadataProvider.getRawMetadataStringValue(MessageMetadataContainer.LABEL_KEY_PATH)).isEqualTo(path);
assertThat(reactiveMetadataProvider.getRawMetadataStringValue(MessageMetadataContainer.LABEL_KEY_CALLER_IP)).isEqualTo(callerIp);
assertThat(reactiveMetadataProvider.getRawMetadataStringValue(notExistKey)).isNull(); assertThat(reactiveMetadataProvider.getRawMetadataStringValue(notExistKey)).isNull();
request = MockServerHttpRequest.get("/echo/" + UrlUtils.decode("a@b")).build(); request = MockServerHttpRequest.get("/echo/" + UrlUtils.decode("a@b")).build();
reactiveMetadataProvider = new ReactiveMetadataProvider(request); reactiveMetadataProvider = new ReactiveMetadataProvider(request, callerIp);
assertThat(reactiveMetadataProvider.getRawMetadataStringValue(MessageMetadataContainer.LABEL_KEY_PATH)).isEqualTo("/echo/a@b"); assertThat(reactiveMetadataProvider.getRawMetadataStringValue(MessageMetadataContainer.LABEL_KEY_PATH)).isEqualTo("/echo/a@b");
} }
@ -102,6 +104,7 @@ public class MetadataProviderTest {
String cookieValue1 = "cv1"; String cookieValue1 = "cv1";
String cookieValue2 = "cv2/test"; String cookieValue2 = "cv2/test";
String path = "/echo/test"; String path = "/echo/test";
String callerIp = "localhost";
MockHttpServletRequest request = new MockHttpServletRequest(); MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader(headerKey1, headerValue1); request.addHeader(headerKey1, headerValue1);
request.addHeader(headerKey2, UrlUtils.encode(headerValue2)); request.addHeader(headerKey2, UrlUtils.encode(headerValue2));
@ -110,7 +113,7 @@ public class MetadataProviderTest {
request.setRequestURI(path); request.setRequestURI(path);
request.setQueryString(queryKey1 + "=" + queryValue1 + "&" + queryKey2 + "=" + UrlUtils.encode(queryValue2)); request.setQueryString(queryKey1 + "=" + queryValue1 + "&" + queryKey2 + "=" + UrlUtils.encode(queryValue2));
ServletMetadataProvider servletMetadataProvider = new ServletMetadataProvider(request); ServletMetadataProvider servletMetadataProvider = new ServletMetadataProvider(request, callerIp);
assertThat(servletMetadataProvider.getRawMetadataMapValue(MessageMetadataContainer.LABEL_MAP_KEY_HEADER, headerKey1)).isEqualTo(headerValue1); assertThat(servletMetadataProvider.getRawMetadataMapValue(MessageMetadataContainer.LABEL_MAP_KEY_HEADER, headerKey1)).isEqualTo(headerValue1);
assertThat(servletMetadataProvider.getRawMetadataMapValue(MessageMetadataContainer.LABEL_MAP_KEY_HEADER, headerKey2)).isEqualTo(headerValue2); assertThat(servletMetadataProvider.getRawMetadataMapValue(MessageMetadataContainer.LABEL_MAP_KEY_HEADER, headerKey2)).isEqualTo(headerValue2);
// com.tencent.polaris.metadata.core.manager.ComposeMetadataProvider.getRawMetadataMapValue need return null when key don't exist // com.tencent.polaris.metadata.core.manager.ComposeMetadataProvider.getRawMetadataMapValue need return null when key don't exist
@ -127,6 +130,7 @@ public class MetadataProviderTest {
assertThat(servletMetadataProvider.getRawMetadataStringValue(MessageMetadataContainer.LABEL_KEY_METHOD)).isEqualTo("GET"); assertThat(servletMetadataProvider.getRawMetadataStringValue(MessageMetadataContainer.LABEL_KEY_METHOD)).isEqualTo("GET");
assertThat(servletMetadataProvider.getRawMetadataStringValue(MessageMetadataContainer.LABEL_KEY_PATH)).isEqualTo(path); assertThat(servletMetadataProvider.getRawMetadataStringValue(MessageMetadataContainer.LABEL_KEY_PATH)).isEqualTo(path);
assertThat(servletMetadataProvider.getRawMetadataStringValue(MessageMetadataContainer.LABEL_KEY_CALLER_IP)).isEqualTo(callerIp);
assertThat(servletMetadataProvider.getRawMetadataStringValue(notExistKey)).isNull(); assertThat(servletMetadataProvider.getRawMetadataStringValue(notExistKey)).isNull();
request.setRequestURI("/echo/" + UrlUtils.decode("a@b")); request.setRequestURI("/echo/" + UrlUtils.decode("a@b"));

@ -47,12 +47,15 @@ public final class MetadataContextHolder {
private static StaticMetadataManager staticMetadataManager; private static StaticMetadataManager staticMetadataManager;
static {
com.tencent.polaris.metadata.core.manager.MetadataContextHolder.setInitializer(MetadataContextHolder::createMetadataManager);
}
private MetadataContextHolder() { private MetadataContextHolder() {
} }
public static MetadataContext get() { public static MetadataContext get() {
return (MetadataContext) com.tencent.polaris.metadata.core.manager.MetadataContextHolder.getOrCreate( return (MetadataContext) com.tencent.polaris.metadata.core.manager.MetadataContextHolder.getOrCreate();
MetadataContextHolder::createMetadataManager);
} }
private static MetadataContext createMetadataManager() { private static MetadataContext createMetadataManager() {
@ -135,7 +138,7 @@ public final class MetadataContextHolder {
*/ */
public static void init(Map<String, String> dynamicTransitiveMetadata, Map<String, String> dynamicDisposableMetadata, public static void init(Map<String, String> dynamicTransitiveMetadata, Map<String, String> dynamicDisposableMetadata,
MetadataProvider callerMetadataProvider) { MetadataProvider callerMetadataProvider) {
com.tencent.polaris.metadata.core.manager.MetadataContextHolder.refresh(MetadataContextHolder::createMetadataManager, metadataManager -> { com.tencent.polaris.metadata.core.manager.MetadataContextHolder.refresh(metadataManager -> {
MetadataContainer metadataContainerUpstream = metadataManager.getMetadataContainer(MetadataType.CUSTOM, false); MetadataContainer metadataContainerUpstream = metadataManager.getMetadataContainer(MetadataType.CUSTOM, false);
if (!CollectionUtils.isEmpty(dynamicTransitiveMetadata)) { if (!CollectionUtils.isEmpty(dynamicTransitiveMetadata)) {
for (Map.Entry<String, String> entry : dynamicTransitiveMetadata.entrySet()) { for (Map.Entry<String, String> entry : dynamicTransitiveMetadata.entrySet()) {

Loading…
Cancel
Save