diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java index 6470c0c76..6e1b2d746 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java @@ -33,7 +33,7 @@ import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.pojo.PolarisServiceInstance; import com.tencent.cloud.common.util.JacksonUtils; import com.tencent.cloud.polaris.router.resttemplate.PolarisLoadBalancerRequest; -import com.tencent.cloud.polaris.router.spi.InstanceTransformer; +import com.tencent.cloud.rpc.enhancement.transformer.InstanceTransformer; import com.tencent.cloud.polaris.router.spi.RouterRequestInterceptor; import com.tencent.cloud.polaris.router.spi.RouterResponseInterceptor; import com.tencent.polaris.api.exception.ErrorCode; diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/RouterUtils.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/RouterUtils.java index 1dfe01fc9..e79a1efd8 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/RouterUtils.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/RouterUtils.java @@ -24,7 +24,7 @@ import java.util.function.Function; import java.util.stream.Collectors; import com.tencent.cloud.common.metadata.MetadataContext; -import com.tencent.cloud.polaris.router.spi.InstanceTransformer; +import com.tencent.cloud.rpc.enhancement.transformer.InstanceTransformer; import com.tencent.polaris.api.pojo.DefaultServiceInstances; import com.tencent.polaris.api.pojo.Instance; import com.tencent.polaris.api.pojo.ServiceInstances; diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfiguration.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfiguration.java index da0e6cce6..79e10a5b1 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfiguration.java @@ -22,10 +22,10 @@ import java.util.List; import com.tencent.cloud.common.pojo.PolarisServiceInstance; import com.tencent.cloud.polaris.router.PolarisRouterServiceInstanceListSupplier; -import com.tencent.cloud.polaris.router.spi.InstanceTransformer; +import com.tencent.cloud.rpc.enhancement.transformer.InstanceTransformer; import com.tencent.cloud.polaris.router.spi.RouterRequestInterceptor; import com.tencent.cloud.polaris.router.spi.RouterResponseInterceptor; -import com.tencent.cloud.polaris.router.transformer.PolarisInstanceTransformer; +import com.tencent.cloud.rpc.enhancement.transformer.PolarisInstanceTransformer; import com.tencent.polaris.router.api.core.RouterAPI; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplierTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplierTest.java index 6ac5238a2..858ab7e9a 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplierTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplierTest.java @@ -41,7 +41,7 @@ import com.tencent.cloud.polaris.router.interceptor.RuleBasedRouterRequestInterc import com.tencent.cloud.polaris.router.resttemplate.PolarisLoadBalancerRequest; import com.tencent.cloud.polaris.router.spi.RouterRequestInterceptor; import com.tencent.cloud.polaris.router.spi.RouterResponseInterceptor; -import com.tencent.cloud.polaris.router.transformer.PolarisInstanceTransformer; +import com.tencent.cloud.rpc.enhancement.transformer.PolarisInstanceTransformer; import com.tencent.polaris.api.exception.PolarisException; import com.tencent.polaris.api.pojo.DefaultInstance; import com.tencent.polaris.api.pojo.DefaultServiceInstances; diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/RouterUtilsTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/RouterUtilsTest.java index 724c401ee..a89e9c6af 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/RouterUtilsTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/RouterUtilsTest.java @@ -24,7 +24,7 @@ import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.pojo.PolarisServiceInstance; import com.tencent.cloud.common.util.ApplicationContextAwareUtils; -import com.tencent.cloud.polaris.router.transformer.PolarisInstanceTransformer; +import com.tencent.cloud.rpc.enhancement.transformer.PolarisInstanceTransformer; import com.tencent.polaris.api.pojo.DefaultInstance; import com.tencent.polaris.api.pojo.Instance; import com.tencent.polaris.api.pojo.ServiceInstances; diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfigurationTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfigurationTest.java index 3f35570c8..8998dd57f 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfigurationTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/LoadBalancerConfigurationTest.java @@ -20,7 +20,7 @@ package com.tencent.cloud.polaris.router.config; import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration; import com.tencent.cloud.polaris.router.PolarisRouterServiceInstanceListSupplier; -import com.tencent.cloud.polaris.router.transformer.PolarisInstanceTransformer; +import com.tencent.cloud.rpc.enhancement.transformer.PolarisInstanceTransformer; import com.tencent.polaris.router.api.core.RouterAPI; import org.junit.jupiter.api.Test; diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/transformer/PolarisInstanceTransformerTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/transformer/PolarisInstanceTransformerTest.java index b723d46be..9a2f77bf8 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/transformer/PolarisInstanceTransformerTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/transformer/PolarisInstanceTransformerTest.java @@ -20,6 +20,7 @@ package com.tencent.cloud.polaris.router.transformer; import com.tencent.cloud.common.pojo.PolarisServiceInstance; import com.tencent.cloud.common.util.ApplicationContextAwareUtils; +import com.tencent.cloud.rpc.enhancement.transformer.PolarisInstanceTransformer; import com.tencent.polaris.api.pojo.DefaultInstance; import com.tencent.polaris.api.pojo.Instance; import org.junit.jupiter.api.BeforeAll; diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfiguration.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfiguration.java index 08aaf6651..9145d82aa 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfiguration.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfiguration.java @@ -21,7 +21,7 @@ package com.tencent.cloud.plugin.discovery.adapter.config; import com.tencent.cloud.plugin.discovery.adapter.transformer.NacosInstanceTransformer; import com.tencent.cloud.polaris.router.config.ConditionalOnPolarisRouterEnabled; import com.tencent.cloud.polaris.router.config.LoadBalancerConfiguration; -import com.tencent.cloud.polaris.router.spi.InstanceTransformer; +import com.tencent.cloud.rpc.enhancement.transformer.InstanceTransformer; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/transformer/NacosInstanceTransformer.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/transformer/NacosInstanceTransformer.java index 498040c04..2959e86df 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/transformer/NacosInstanceTransformer.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/main/java/com/tencent/cloud/plugin/discovery/adapter/transformer/NacosInstanceTransformer.java @@ -18,7 +18,7 @@ package com.tencent.cloud.plugin.discovery.adapter.transformer; -import com.tencent.cloud.polaris.router.spi.InstanceTransformer; +import com.tencent.cloud.rpc.enhancement.transformer.InstanceTransformer; import com.tencent.polaris.api.pojo.DefaultInstance; import org.apache.commons.lang.StringUtils; diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/test/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfigurationTest.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/test/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfigurationTest.java index cae2a60fd..f8f4b7e95 100644 --- a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/test/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfigurationTest.java +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-discovery-adapter-plugin/src/test/java/com/tencent/cloud/plugin/discovery/adapter/config/NacosDiscoveryAdapterAutoConfigurationTest.java @@ -19,7 +19,7 @@ package com.tencent.cloud.plugin.discovery.adapter.config; import com.tencent.cloud.plugin.discovery.adapter.transformer.NacosInstanceTransformer; -import com.tencent.cloud.polaris.router.transformer.PolarisInstanceTransformer; +import com.tencent.cloud.rpc.enhancement.transformer.PolarisInstanceTransformer; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementAutoConfiguration.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementAutoConfiguration.java index 3a5d1b712..e032c4778 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementAutoConfiguration.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/config/RpcEnhancementAutoConfiguration.java @@ -20,6 +20,7 @@ package com.tencent.cloud.rpc.enhancement.config; import java.util.Collections; import java.util.List; +import com.tencent.cloud.common.pojo.PolarisServiceInstance; import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled; import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration; import com.tencent.cloud.rpc.enhancement.feign.EnhancedFeignBeanPostProcessor; @@ -40,6 +41,8 @@ import com.tencent.cloud.rpc.enhancement.plugin.reporter.SuccessPolarisReporter; import com.tencent.cloud.rpc.enhancement.resttemplate.EnhancedRestTemplateInterceptor; import com.tencent.cloud.rpc.enhancement.resttemplate.PolarisLoadBalancerRequestTransformer; import com.tencent.cloud.rpc.enhancement.scg.EnhancedGatewayGlobalFilter; +import com.tencent.cloud.rpc.enhancement.transformer.InstanceTransformer; +import com.tencent.cloud.rpc.enhancement.transformer.PolarisInstanceTransformer; import com.tencent.cloud.rpc.enhancement.webclient.EnhancedWebClientExchangeFilterFunction; import com.tencent.cloud.rpc.enhancement.webclient.PolarisLoadBalancerClientRequestTransformer; import com.tencent.polaris.api.core.ConsumerAPI; @@ -86,6 +89,13 @@ import static jakarta.servlet.DispatcherType.REQUEST; @AutoConfigureAfter(PolarisContextAutoConfiguration.class) public class RpcEnhancementAutoConfiguration { + @Bean + @ConditionalOnMissingBean + @ConditionalOnClass(PolarisServiceInstance.class) + public InstanceTransformer instanceTransformer() { + return new PolarisInstanceTransformer(); + } + @Bean @Lazy public EnhancedPluginRunner enhancedFeignPluginRunner( @@ -108,13 +118,13 @@ public class RpcEnhancementAutoConfiguration { } @Bean - public AssemblyClientExceptionHook assemblyClientExceptionHook(AssemblyAPI assemblyAPI) { - return new AssemblyClientExceptionHook(assemblyAPI); + public AssemblyClientExceptionHook assemblyClientExceptionHook(AssemblyAPI assemblyAPI, InstanceTransformer instanceTransformer) { + return new AssemblyClientExceptionHook(assemblyAPI, instanceTransformer); } @Bean - public AssemblyClientPostHook assemblyClientPostHook(AssemblyAPI assemblyAPI) { - return new AssemblyClientPostHook(assemblyAPI); + public AssemblyClientPostHook assemblyClientPostHook(AssemblyAPI assemblyAPI, InstanceTransformer instanceTransformer) { + return new AssemblyClientPostHook(assemblyAPI, instanceTransformer); } @Bean diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/filter/EnhancedReactiveFilter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/filter/EnhancedReactiveFilter.java index 0e7e972a3..4fa6899ce 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/filter/EnhancedReactiveFilter.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/filter/EnhancedReactiveFilter.java @@ -54,6 +54,8 @@ public class EnhancedReactiveFilter implements WebFilter, Ordered { .build(); enhancedPluginContext.setRequest(enhancedRequestContext); + enhancedPluginContext.setLocalServiceInstance(pluginRunner.getLocalServiceInstance()); + // Run pre enhanced plugins. pluginRunner.run(EnhancedPluginType.Server.PRE, enhancedPluginContext); diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/filter/EnhancedServletFilter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/filter/EnhancedServletFilter.java index 66359ad7e..894e8944a 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/filter/EnhancedServletFilter.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/filter/EnhancedServletFilter.java @@ -73,6 +73,8 @@ public class EnhancedServletFilter extends OncePerRequestFilter { .build(); enhancedPluginContext.setRequest(enhancedRequestContext); + enhancedPluginContext.setLocalServiceInstance(pluginRunner.getLocalServiceInstance()); + // Run pre enhanced plugins. pluginRunner.run(EnhancedPluginType.Server.PRE, enhancedPluginContext); diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/PolarisEnhancedPluginUtils.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/PolarisEnhancedPluginUtils.java index 02b6e4446..819f57f4e 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/PolarisEnhancedPluginUtils.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/PolarisEnhancedPluginUtils.java @@ -24,9 +24,14 @@ import java.net.URLDecoder; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import com.tencent.cloud.common.constant.HeaderConstant; import com.tencent.cloud.common.constant.RouterConstant; import com.tencent.cloud.common.metadata.MetadataContext; @@ -252,5 +257,27 @@ public final class PolarisEnhancedPluginUtils { return null; } + public static Map getLabelMap(HttpHeaders headers) { + if (headers != null) { + Collection labels = headers.get(RouterConstant.ROUTER_LABEL_HEADER); + if (CollectionUtils.isNotEmpty(labels) && labels.iterator().hasNext()) { + String label = labels.iterator().next(); + try { + label = URLDecoder.decode(label, UTF_8); + } + catch (UnsupportedEncodingException e) { + LOG.error("unsupported charset exception " + UTF_8, e); + } + try { + return new ObjectMapper().readValue(label, new TypeReference>() {}); + } + catch (JsonProcessingException e) { + LOG.error("parse label map exception", e); + } + } + } + return null; + } + } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyMetadataProvider.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyMetadataProvider.java new file mode 100644 index 000000000..63fbeed1e --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyMetadataProvider.java @@ -0,0 +1,35 @@ +package com.tencent.cloud.rpc.enhancement.plugin.assembly; + +import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.polaris.api.pojo.ServiceKey; +import com.tencent.polaris.api.rpc.MetadataProvider; + +import org.springframework.cloud.client.ServiceInstance; + +public class AssemblyMetadataProvider implements MetadataProvider { + + private final ServiceInstance serviceInstance; + + private final String namespace; + + public AssemblyMetadataProvider(ServiceInstance localServiceInstance, String namespace) { + this.serviceInstance = localServiceInstance; + this.namespace = namespace; + } + + @Override + public String getMetadata(String key) { + return serviceInstance.getMetadata().get(key); + } + + @Override + public ServiceKey getLocalService() { + return new ServiceKey(namespace, serviceInstance.getServiceId()); + } + + @Override + public String getLocalIp() { + return serviceInstance.getHost(); + } + +} diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientExceptionHook.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientExceptionHook.java index 12107c4f3..a2642beec 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientExceptionHook.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientExceptionHook.java @@ -22,12 +22,15 @@ import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils; +import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyMetadataProvider; import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyRequestContext; import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyResponseContext; +import com.tencent.cloud.rpc.enhancement.transformer.InstanceTransformer; import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.rpc.RequestContext; import com.tencent.polaris.assembly.api.AssemblyAPI; import com.tencent.polaris.assembly.api.pojo.AfterRequest; +import com.tencent.polaris.assembly.api.pojo.Capability; import org.springframework.core.Ordered; @@ -40,8 +43,11 @@ public class AssemblyClientExceptionHook implements EnhancedPlugin { private final AssemblyAPI assemblyAPI; - public AssemblyClientExceptionHook(AssemblyAPI assemblyAPI) { + private final InstanceTransformer instanceTransformer; + + public AssemblyClientExceptionHook(AssemblyAPI assemblyAPI, InstanceTransformer instanceTransformer) { this.assemblyAPI = assemblyAPI; + this.instanceTransformer = instanceTransformer; } @Override @@ -51,17 +57,21 @@ public class AssemblyClientExceptionHook implements EnhancedPlugin { @Override public void run(EnhancedPluginContext context) { + AfterRequest afterRequest = new AfterRequest(); - afterRequest.setTargetService(new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getTargetServiceInstance().getServiceId())); - RequestContext requestContext = new AssemblyRequestContext( + afterRequest.setCapabilities(new Capability[]{Capability.ALL}); + afterRequest.setRequestContext(new AssemblyRequestContext( context.getRequest(), new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()), context.getLocalServiceInstance().getHost() - ); - afterRequest.setRequestContext(requestContext); - - AssemblyResponseContext responseContext = new AssemblyResponseContext(null, context.getThrowable()); - afterRequest.setResponseContext(responseContext); + )); + afterRequest.setResponseContext(new AssemblyResponseContext(null, context.getThrowable())); + afterRequest.setMetadataProvider(new AssemblyMetadataProvider(context.getLocalServiceInstance(), MetadataContext.LOCAL_NAMESPACE)); + afterRequest.setDelay(context.getDelay()); + afterRequest.setRouteLabels(PolarisEnhancedPluginUtils.getLabelMap(context.getRequest().getHttpHeaders())); + // TargetService and TargetInstance only exist in client side + afterRequest.setTargetService(new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getTargetServiceInstance().getServiceId())); + afterRequest.setTargetInstance(instanceTransformer.transform(context.getTargetServiceInstance())); assemblyAPI.afterCallService(afterRequest); } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPostHook.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPostHook.java index e78817139..65160dca0 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPostHook.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPostHook.java @@ -22,12 +22,15 @@ import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils; +import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyMetadataProvider; import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyRequestContext; import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyResponseContext; +import com.tencent.cloud.rpc.enhancement.transformer.InstanceTransformer; import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.rpc.RequestContext; import com.tencent.polaris.assembly.api.AssemblyAPI; import com.tencent.polaris.assembly.api.pojo.AfterRequest; +import com.tencent.polaris.assembly.api.pojo.Capability; import org.springframework.core.Ordered; @@ -40,8 +43,11 @@ public class AssemblyClientPostHook implements EnhancedPlugin { private final AssemblyAPI assemblyAPI; - public AssemblyClientPostHook(AssemblyAPI assemblyAPI) { + private final InstanceTransformer instanceTransformer; + + public AssemblyClientPostHook(AssemblyAPI assemblyAPI, InstanceTransformer instanceTransformer) { this.assemblyAPI = assemblyAPI; + this.instanceTransformer = instanceTransformer; } @Override @@ -51,17 +57,21 @@ public class AssemblyClientPostHook implements EnhancedPlugin { @Override public void run(EnhancedPluginContext context) { + AfterRequest afterRequest = new AfterRequest(); - afterRequest.setTargetService(new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getTargetServiceInstance().getServiceId())); - RequestContext requestContext = new AssemblyRequestContext( + afterRequest.setCapabilities(new Capability[]{Capability.ALL}); + afterRequest.setRequestContext(new AssemblyRequestContext( context.getRequest(), new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()), context.getLocalServiceInstance().getHost() - ); - afterRequest.setRequestContext(requestContext); - - AssemblyResponseContext responseContext = new AssemblyResponseContext(context.getResponse(), null); - afterRequest.setResponseContext(responseContext); + )); + afterRequest.setResponseContext(new AssemblyResponseContext(context.getResponse(), null)); + afterRequest.setMetadataProvider(new AssemblyMetadataProvider(context.getLocalServiceInstance(), MetadataContext.LOCAL_NAMESPACE)); + afterRequest.setDelay(context.getDelay()); + afterRequest.setRouteLabels(PolarisEnhancedPluginUtils.getLabelMap(context.getRequest().getHttpHeaders())); + // TargetService and TargetInstance only exist in client side + afterRequest.setTargetService(new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getTargetServiceInstance().getServiceId())); + afterRequest.setTargetInstance(instanceTransformer.transform(context.getTargetServiceInstance())); assemblyAPI.afterCallService(afterRequest); } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPreHook.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPreHook.java index aa6795860..029f69a8f 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPreHook.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPreHook.java @@ -21,11 +21,13 @@ import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; +import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyMetadataProvider; import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyRequestContext; import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.rpc.RequestContext; import com.tencent.polaris.assembly.api.AssemblyAPI; import com.tencent.polaris.assembly.api.pojo.BeforeRequest; +import com.tencent.polaris.assembly.api.pojo.Capability; import org.springframework.core.Ordered; @@ -49,14 +51,18 @@ public class AssemblyClientPreHook implements EnhancedPlugin { @Override public void run(EnhancedPluginContext context) { + BeforeRequest beforeRequest = new BeforeRequest(); - beforeRequest.setTargetService(new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getTargetServiceInstance().getServiceId())); - RequestContext requestContext = new AssemblyRequestContext( + beforeRequest.setCapabilities(new Capability[]{Capability.ALL}); + beforeRequest.setRequestContext(new AssemblyRequestContext( context.getRequest(), new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()), context.getLocalServiceInstance().getHost() - ); - beforeRequest.setRequestContext(requestContext); + )); + beforeRequest.setMetadataProvider(new AssemblyMetadataProvider(context.getLocalServiceInstance(), MetadataContext.LOCAL_NAMESPACE)); + // TargetService only exist in client side + beforeRequest.setTargetService(new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getTargetServiceInstance().getServiceId())); + assemblyAPI.beforeCallService(beforeRequest); } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerExceptionHook.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerExceptionHook.java index 508546dea..9c479d861 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerExceptionHook.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerExceptionHook.java @@ -22,12 +22,14 @@ import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils; +import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyMetadataProvider; import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyRequestContext; import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyResponseContext; import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.rpc.RequestContext; import com.tencent.polaris.assembly.api.AssemblyAPI; import com.tencent.polaris.assembly.api.pojo.AfterRequest; +import com.tencent.polaris.assembly.api.pojo.Capability; import org.springframework.core.Ordered; @@ -52,15 +54,16 @@ public class AssemblyServerExceptionHook implements EnhancedPlugin { @Override public void run(EnhancedPluginContext context) { AfterRequest afterRequest = new AfterRequest(); - RequestContext requestContext = new AssemblyRequestContext( + afterRequest.setCapabilities(new Capability[]{Capability.ALL}); + afterRequest.setRequestContext(new AssemblyRequestContext( context.getRequest(), new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()), context.getLocalServiceInstance().getHost() - ); - afterRequest.setRequestContext(requestContext); - - AssemblyResponseContext responseContext = new AssemblyResponseContext(null, context.getThrowable()); - afterRequest.setResponseContext(responseContext); + )); + afterRequest.setResponseContext(new AssemblyResponseContext(null, context.getThrowable())); + afterRequest.setMetadataProvider(new AssemblyMetadataProvider(context.getLocalServiceInstance(), MetadataContext.LOCAL_NAMESPACE)); + afterRequest.setDelay(context.getDelay()); + afterRequest.setRouteLabels(PolarisEnhancedPluginUtils.getLabelMap(context.getRequest().getHttpHeaders())); assemblyAPI.afterProcess(afterRequest); } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPostHook.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPostHook.java index 891aff83d..3b7653066 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPostHook.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPostHook.java @@ -22,12 +22,14 @@ import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils; +import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyMetadataProvider; import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyRequestContext; import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyResponseContext; import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.rpc.RequestContext; import com.tencent.polaris.assembly.api.AssemblyAPI; import com.tencent.polaris.assembly.api.pojo.AfterRequest; +import com.tencent.polaris.assembly.api.pojo.Capability; import org.springframework.core.Ordered; @@ -52,15 +54,16 @@ public class AssemblyServerPostHook implements EnhancedPlugin { @Override public void run(EnhancedPluginContext context) { AfterRequest afterRequest = new AfterRequest(); - RequestContext requestContext = new AssemblyRequestContext( + afterRequest.setCapabilities(new Capability[]{Capability.ALL}); + afterRequest.setRequestContext(new AssemblyRequestContext( context.getRequest(), new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()), context.getLocalServiceInstance().getHost() - ); - afterRequest.setRequestContext(requestContext); - - AssemblyResponseContext responseContext = new AssemblyResponseContext(context.getResponse(), null); - afterRequest.setResponseContext(responseContext); + )); + afterRequest.setResponseContext(new AssemblyResponseContext(context.getResponse(), null)); + afterRequest.setMetadataProvider(new AssemblyMetadataProvider(context.getLocalServiceInstance(), MetadataContext.LOCAL_NAMESPACE)); + afterRequest.setDelay(context.getDelay()); + afterRequest.setRouteLabels(PolarisEnhancedPluginUtils.getLabelMap(context.getRequest().getHttpHeaders())); assemblyAPI.afterProcess(afterRequest); } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPreHook.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPreHook.java index a678d68a6..d83477082 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPreHook.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPreHook.java @@ -21,11 +21,13 @@ import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; +import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyMetadataProvider; import com.tencent.cloud.rpc.enhancement.plugin.assembly.AssemblyRequestContext; import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.rpc.RequestContext; import com.tencent.polaris.assembly.api.AssemblyAPI; import com.tencent.polaris.assembly.api.pojo.BeforeRequest; +import com.tencent.polaris.assembly.api.pojo.Capability; import org.springframework.core.Ordered; @@ -50,12 +52,14 @@ public class AssemblyServerPreHook implements EnhancedPlugin { @Override public void run(EnhancedPluginContext context) { BeforeRequest beforeRequest = new BeforeRequest(); - RequestContext requestContext = new AssemblyRequestContext( + beforeRequest.setCapabilities(new Capability[]{Capability.ALL}); + beforeRequest.setRequestContext(new AssemblyRequestContext( context.getRequest(), new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()), context.getLocalServiceInstance().getHost() - ); - beforeRequest.setRequestContext(requestContext); + )); + beforeRequest.setMetadataProvider(new AssemblyMetadataProvider(context.getLocalServiceInstance(), MetadataContext.LOCAL_NAMESPACE)); + assemblyAPI.beforeProcess(beforeRequest); } diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/spi/InstanceTransformer.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/transformer/InstanceTransformer.java similarity index 97% rename from spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/spi/InstanceTransformer.java rename to spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/transformer/InstanceTransformer.java index f5684299e..13c19dfb0 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/spi/InstanceTransformer.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/transformer/InstanceTransformer.java @@ -16,7 +16,7 @@ * */ -package com.tencent.cloud.polaris.router.spi; +package com.tencent.cloud.rpc.enhancement.transformer; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.polaris.api.pojo.DefaultInstance; diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/transformer/PolarisInstanceTransformer.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/transformer/PolarisInstanceTransformer.java similarity index 92% rename from spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/transformer/PolarisInstanceTransformer.java rename to spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/transformer/PolarisInstanceTransformer.java index 183090362..8f0909d32 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/transformer/PolarisInstanceTransformer.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/transformer/PolarisInstanceTransformer.java @@ -16,10 +16,10 @@ * */ -package com.tencent.cloud.polaris.router.transformer; +package com.tencent.cloud.rpc.enhancement.transformer; import com.tencent.cloud.common.pojo.PolarisServiceInstance; -import com.tencent.cloud.polaris.router.spi.InstanceTransformer; +import com.tencent.cloud.rpc.enhancement.transformer.InstanceTransformer; import com.tencent.polaris.api.pojo.DefaultInstance; import org.springframework.cloud.client.ServiceInstance; diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/PolarisEnhancedPluginUtilsTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/PolarisEnhancedPluginUtilsTest.java index 295846bfa..b52d2d843 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/PolarisEnhancedPluginUtilsTest.java +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/PolarisEnhancedPluginUtilsTest.java @@ -21,15 +21,13 @@ import java.net.SocketTimeoutException; import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; +import java.util.HashMap; import com.tencent.cloud.common.constant.HeaderConstant; import com.tencent.cloud.common.constant.RouterConstant; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.util.ApplicationContextAwareUtils; import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; -import com.tencent.polaris.api.config.Configuration; -import com.tencent.polaris.api.config.global.APIConfig; -import com.tencent.polaris.api.config.global.GlobalConfig; import com.tencent.polaris.api.plugin.circuitbreaker.ResourceStat; import com.tencent.polaris.api.pojo.RetStatus; import com.tencent.polaris.api.rpc.ServiceCallResult; @@ -100,6 +98,10 @@ public class PolarisEnhancedPluginUtilsTest { HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.add(RouterConstant.ROUTER_LABEL_HEADER, "{\"k1\":\"v1\"}"); + assertThat(PolarisEnhancedPluginUtils.getLabelMap(requestHeaders)).isEqualTo(new HashMap(){{ + put("k1", "v1"); + }}); + serviceCallResult = PolarisEnhancedPluginUtils.createServiceCallResult( "0.0.0.0", "test",