From ad9e7cf1d9e566089154c9014fd2b2c39c2f8e91 Mon Sep 17 00:00:00 2001 From: seanyu Date: Tue, 25 Apr 2023 20:01:26 +0800 Subject: [PATCH] refactor rpc enhancement --- ...olarisCircuitBreakerAutoConfiguration.java | 8 +- ...olarisCircuitBreakerAutoConfiguration.java | 8 +- .../ExceptionCircuitBreakerReporter.java | 18 +-- .../SuccessCircuitBreakerReporter.java | 18 +-- .../ExceptionCircuitBreakerReporterTest.java | 4 +- .../SuccessCircuitBreakerReporterTest.java | 4 +- .../PolarisLoadBalancerAutoConfiguration.java | 29 +++++ ...olarisLoadBalancerRingHashKeyProvider.java | 2 +- .../PolarisAutoServiceRegistration.java | 17 ++- ...larisServiceRegistryAutoConfiguration.java | 11 +- .../common/metadata/MetadataContext.java | 17 ++- spring-cloud-tencent-dependencies/pom.xml | 8 +- spring-cloud-tencent-plugin-starters/pom.xml | 2 + .../pom.xml | 48 +++++++ .../config/PolarisFlowConfigModifier.java | 35 ++++++ .../PolarisTsfAdapterAutoConfiguration.java | 42 +++++++ spring-cloud-tencent-polaris-context/pom.xml | 5 + .../PolarisContextAutoConfiguration.java | 7 ++ spring-cloud-tencent-rpc-enhancement/pom.xml | 2 +- .../RpcEnhancementAutoConfiguration.java | 117 +++++++++++++++--- .../feign/EnhancedFeignBeanPostProcessor.java | 5 +- ...hancedFeignBlockingLoadBalancerClient.java | 7 +- .../feign/EnhancedFeignClient.java | 30 +++-- ...isLoadBalancerFeignRequestTransformer.java | 49 ++++++++ .../filter/EnhancedReactiveFilter.java | 91 ++++++++++++++ .../filter/EnhancedServletFilter.java | 113 +++++++++++++++++ .../plugin/DefaultEnhancedPluginRunner.java | 34 ++++- .../plugin/EnhancedPluginContext.java | 27 +++- .../plugin/EnhancedPluginRunner.java | 5 + .../plugin/EnhancedPluginType.java | 69 +++++++---- .../PolarisEnhancedPluginUtils.java} | 54 ++++---- .../assembly/AssemblyRequestContext.java | 103 +++++++++++++++ .../assembly/AssemblyResponseContext.java | 79 ++++++++++++ .../client/AssemblyClientExceptionHook.java | 74 +++++++++++ .../client/AssemblyClientPostHook.java | 74 +++++++++++ .../client/AssemblyClientPreHook.java | 68 ++++++++++ .../server/AssemblyServerExceptionHook.java | 74 +++++++++++ .../server/AssemblyServerPostHook.java | 73 +++++++++++ .../server/AssemblyServerPreHook.java | 67 ++++++++++ .../reporter/ExceptionPolarisReporter.java | 30 ++--- .../reporter/SuccessPolarisReporter.java | 30 ++--- .../BlockingLoadBalancerClientAspect.java | 43 ------- .../EnhancedRestTemplateInterceptor.java | 32 ++--- ...olarisLoadBalancerRequestTransformer.java} | 36 +++--- .../scg/EnhancedGatewayGlobalFilter.java | 27 ++-- ...ancedWebClientExchangeFilterFunction.java} | 39 +++--- ...sLoadBalancerClientRequestTransformer.java | 11 +- ...edFeignBlockingLoadBalancerClientTest.java | 2 +- .../feign/EnhancedFeignClientTest.java | 18 ++- .../plugin/EnhancedPluginContextTest.java | 18 +-- .../plugin/ExceptionPolarisReporterTest.java | 4 +- .../PolarisEnhancedPluginUtilsTest.java} | 93 ++++++-------- .../plugin/SuccessPolarisReporterTest.java | 4 +- .../BlockingLoadBalancerClientAspectTest.java | 92 -------------- .../EnhancedRestTemplateInterceptorTest.java | 3 +- .../scg/EnhancedGatewayGlobalFilterTest.java | 3 +- ...dWebClientExchangeFilterFunctionTest.java} | 5 +- 57 files changed, 1530 insertions(+), 458 deletions(-) create mode 100644 spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-tsf-adapter-plugin/pom.xml create mode 100644 spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-tsf-adapter-plugin/src/main/java/com/tencent/cloud/tsf/adapter/config/PolarisFlowConfigModifier.java create mode 100644 spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-tsf-adapter-plugin/src/main/java/com/tencent/cloud/tsf/adapter/config/PolarisTsfAdapterAutoConfiguration.java create mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/PolarisLoadBalancerFeignRequestTransformer.java create mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/filter/EnhancedReactiveFilter.java create mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/filter/EnhancedServletFilter.java rename spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/{AbstractPolarisReporterAdapter.java => plugin/PolarisEnhancedPluginUtils.java} (87%) create mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyRequestContext.java create mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyResponseContext.java create mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientExceptionHook.java create mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPostHook.java create mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPreHook.java create mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerExceptionHook.java create mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPostHook.java create mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPreHook.java delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/BlockingLoadBalancerClientAspect.java rename spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/{LoadBalancerClientAspectUtils.java => PolarisLoadBalancerRequestTransformer.java} (55%) rename spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/webclient/{EnhancedWebClientReporter.java => EnhancedWebClientExchangeFilterFunction.java} (68%) rename spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/{AbstractPolarisReporterAdapterTest.java => plugin/PolarisEnhancedPluginUtilsTest.java} (71%) delete mode 100644 spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/BlockingLoadBalancerClientAspectTest.java rename spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/webclient/{EnhancedWebClientReporterTest.java => EnhancedWebClientExchangeFilterFunctionTest.java} (94%) diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java index 2c1f9decb..70999eff4 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java @@ -66,15 +66,15 @@ public class PolarisCircuitBreakerAutoConfiguration { @Bean @ConditionalOnMissingBean(SuccessCircuitBreakerReporter.class) public SuccessCircuitBreakerReporter successCircuitBreakerReporter(RpcEnhancementReporterProperties properties, - SDKContext polarisContext, CircuitBreakAPI circuitBreakAPI) { - return new SuccessCircuitBreakerReporter(properties, polarisContext, circuitBreakAPI); + CircuitBreakAPI circuitBreakAPI) { + return new SuccessCircuitBreakerReporter(properties, circuitBreakAPI); } @Bean @ConditionalOnMissingBean(ExceptionCircuitBreakerReporter.class) public ExceptionCircuitBreakerReporter exceptionCircuitBreakerReporter(RpcEnhancementReporterProperties properties, - SDKContext polarisContext, CircuitBreakAPI circuitBreakAPI) { - return new ExceptionCircuitBreakerReporter(properties, polarisContext, circuitBreakAPI); + CircuitBreakAPI circuitBreakAPI) { + return new ExceptionCircuitBreakerReporter(properties, circuitBreakAPI); } @Bean diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/ReactivePolarisCircuitBreakerAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/ReactivePolarisCircuitBreakerAutoConfiguration.java index f2f509218..fba34d253 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/ReactivePolarisCircuitBreakerAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/ReactivePolarisCircuitBreakerAutoConfiguration.java @@ -64,15 +64,15 @@ public class ReactivePolarisCircuitBreakerAutoConfiguration { @Bean @ConditionalOnMissingBean(SuccessCircuitBreakerReporter.class) public SuccessCircuitBreakerReporter successCircuitBreakerReporter(RpcEnhancementReporterProperties properties, - SDKContext polarisContext, CircuitBreakAPI circuitBreakAPI) { - return new SuccessCircuitBreakerReporter(properties, polarisContext, circuitBreakAPI); + CircuitBreakAPI circuitBreakAPI) { + return new SuccessCircuitBreakerReporter(properties, circuitBreakAPI); } @Bean @ConditionalOnMissingBean(ExceptionCircuitBreakerReporter.class) public ExceptionCircuitBreakerReporter exceptionCircuitBreakerReporter(RpcEnhancementReporterProperties properties, - SDKContext polarisContext, CircuitBreakAPI circuitBreakAPI) { - return new ExceptionCircuitBreakerReporter(properties, polarisContext, circuitBreakAPI); + CircuitBreakAPI circuitBreakAPI) { + return new ExceptionCircuitBreakerReporter(properties, circuitBreakAPI); } @Bean diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/reporter/ExceptionCircuitBreakerReporter.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/reporter/ExceptionCircuitBreakerReporter.java index b47c1a4a2..fd2583786 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/reporter/ExceptionCircuitBreakerReporter.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/reporter/ExceptionCircuitBreakerReporter.java @@ -19,15 +19,14 @@ package com.tencent.cloud.polaris.circuitbreaker.reporter; import java.util.Optional; -import com.tencent.cloud.rpc.enhancement.AbstractPolarisReporterAdapter; import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; +import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils; 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.EnhancedRequestContext; import com.tencent.polaris.api.plugin.circuitbreaker.ResourceStat; import com.tencent.polaris.circuitbreak.api.CircuitBreakAPI; -import com.tencent.polaris.client.api.SDKContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,16 +34,17 @@ import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.cloud.client.ServiceInstance; import org.springframework.core.Ordered; -public class ExceptionCircuitBreakerReporter extends AbstractPolarisReporterAdapter implements EnhancedPlugin { +public class ExceptionCircuitBreakerReporter implements EnhancedPlugin { private static final Logger LOG = LoggerFactory.getLogger(ExceptionCircuitBreakerReporter.class); private final CircuitBreakAPI circuitBreakAPI; + private final RpcEnhancementReporterProperties reportProperties; + public ExceptionCircuitBreakerReporter(RpcEnhancementReporterProperties reportProperties, - SDKContext context, CircuitBreakAPI circuitBreakAPI) { - super(reportProperties, context); + this.reportProperties = reportProperties; this.circuitBreakAPI = circuitBreakAPI; } @@ -55,19 +55,19 @@ public class ExceptionCircuitBreakerReporter extends AbstractPolarisReporterAdap @Override public EnhancedPluginType getType() { - return EnhancedPluginType.EXCEPTION; + return EnhancedPluginType.Client.EXCEPTION; } @Override public void run(EnhancedPluginContext context) throws Throwable { - if (!super.reportProperties.isEnabled()) { + if (!this.reportProperties.isEnabled()) { return; } EnhancedRequestContext request = context.getRequest(); - ServiceInstance serviceInstance = Optional.ofNullable(context.getServiceInstance()).orElse(new DefaultServiceInstance()); + ServiceInstance serviceInstance = Optional.ofNullable(context.getTargetServiceInstance()).orElse(new DefaultServiceInstance()); - ResourceStat resourceStat = createInstanceResourceStat( + ResourceStat resourceStat = PolarisEnhancedPluginUtils.createInstanceResourceStat( serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort(), diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/reporter/SuccessCircuitBreakerReporter.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/reporter/SuccessCircuitBreakerReporter.java index ce5fe2a81..ed0d856a4 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/reporter/SuccessCircuitBreakerReporter.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/reporter/SuccessCircuitBreakerReporter.java @@ -19,8 +19,8 @@ package com.tencent.cloud.polaris.circuitbreaker.reporter; import java.util.Optional; -import com.tencent.cloud.rpc.enhancement.AbstractPolarisReporterAdapter; import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; +import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; @@ -29,7 +29,6 @@ import com.tencent.cloud.rpc.enhancement.plugin.EnhancedResponseContext; import com.tencent.cloud.rpc.enhancement.plugin.reporter.SuccessPolarisReporter; import com.tencent.polaris.api.plugin.circuitbreaker.ResourceStat; import com.tencent.polaris.circuitbreak.api.CircuitBreakAPI; -import com.tencent.polaris.client.api.SDKContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,16 +37,17 @@ import org.springframework.cloud.client.ServiceInstance; import org.springframework.core.Ordered; -public class SuccessCircuitBreakerReporter extends AbstractPolarisReporterAdapter implements EnhancedPlugin { +public class SuccessCircuitBreakerReporter implements EnhancedPlugin { private static final Logger LOG = LoggerFactory.getLogger(SuccessPolarisReporter.class); private final CircuitBreakAPI circuitBreakAPI; + private final RpcEnhancementReporterProperties reportProperties; + public SuccessCircuitBreakerReporter(RpcEnhancementReporterProperties reportProperties, - SDKContext context, CircuitBreakAPI circuitBreakAPI) { - super(reportProperties, context); + this.reportProperties = reportProperties; this.circuitBreakAPI = circuitBreakAPI; } @@ -58,19 +58,19 @@ public class SuccessCircuitBreakerReporter extends AbstractPolarisReporterAdapte @Override public EnhancedPluginType getType() { - return EnhancedPluginType.POST; + return EnhancedPluginType.Client.POST; } @Override public void run(EnhancedPluginContext context) throws Throwable { - if (!super.reportProperties.isEnabled()) { + if (!this.reportProperties.isEnabled()) { return; } EnhancedRequestContext request = context.getRequest(); EnhancedResponseContext response = context.getResponse(); - ServiceInstance serviceInstance = Optional.ofNullable(context.getServiceInstance()).orElse(new DefaultServiceInstance()); + ServiceInstance serviceInstance = Optional.ofNullable(context.getTargetServiceInstance()).orElse(new DefaultServiceInstance()); - ResourceStat resourceStat = createInstanceResourceStat( + ResourceStat resourceStat = PolarisEnhancedPluginUtils.createInstanceResourceStat( serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort(), diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/reporter/ExceptionCircuitBreakerReporterTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/reporter/ExceptionCircuitBreakerReporterTest.java index 53e38c9d2..7be53b2fa 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/reporter/ExceptionCircuitBreakerReporterTest.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/reporter/ExceptionCircuitBreakerReporterTest.java @@ -95,7 +95,7 @@ public class ExceptionCircuitBreakerReporterTest { @Test public void testType() { - assertThat(exceptionCircuitBreakerReporter.getType()).isEqualTo(EnhancedPluginType.EXCEPTION); + assertThat(exceptionCircuitBreakerReporter.getType()).isEqualTo(EnhancedPluginType.Client.EXCEPTION); } @Test @@ -121,7 +121,7 @@ public class ExceptionCircuitBreakerReporterTest { pluginContext.setRequest(request); pluginContext.setResponse(response); - pluginContext.setServiceInstance(serviceInstance); + pluginContext.setTargetServiceInstance(serviceInstance); pluginContext.setThrowable(new RuntimeException()); exceptionCircuitBreakerReporter.run(pluginContext); diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/reporter/SuccessCircuitBreakerReporterTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/reporter/SuccessCircuitBreakerReporterTest.java index 4dcd3d19e..9ecb9378b 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/reporter/SuccessCircuitBreakerReporterTest.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/reporter/SuccessCircuitBreakerReporterTest.java @@ -94,7 +94,7 @@ public class SuccessCircuitBreakerReporterTest { @Test public void testType() { - assertThat(successCircuitBreakerReporter.getType()).isEqualTo(EnhancedPluginType.POST); + assertThat(successCircuitBreakerReporter.getType()).isEqualTo(EnhancedPluginType.Client.POST); } @Test @@ -120,7 +120,7 @@ public class SuccessCircuitBreakerReporterTest { pluginContext.setRequest(request); pluginContext.setResponse(response); - pluginContext.setServiceInstance(serviceInstance); + pluginContext.setTargetServiceInstance(serviceInstance); successCircuitBreakerReporter.run(pluginContext); successCircuitBreakerReporter.getOrder(); diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerAutoConfiguration.java index 38f1e0dfa..8ee742d6a 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerAutoConfiguration.java @@ -17,15 +17,25 @@ package com.tencent.cloud.polaris.loadbalancer; +import java.util.ArrayList; +import java.util.List; + import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled; +import com.tencent.cloud.rpc.enhancement.resttemplate.EnhancedRestTemplateInterceptor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; +import org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor; +import org.springframework.cloud.client.loadbalancer.RestTemplateCustomizer; import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; import org.springframework.cloud.loadbalancer.config.LoadBalancerAutoConfiguration; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestInterceptor; /** * Auto-configuration of loadbalancer for Polaris. @@ -41,4 +51,23 @@ import org.springframework.context.annotation.Configuration; @LoadBalancerClients(defaultConfiguration = PolarisLoadBalancerClientConfiguration.class) public class PolarisLoadBalancerAutoConfiguration { + @Bean + @ConditionalOnMissingBean + public RestTemplateCustomizer restTemplateCustomizer(@Autowired(required = false) LoadBalancerInterceptor loadBalancerInterceptor) { + return restTemplate -> { + List list = new ArrayList<>(restTemplate.getInterceptors()); + // LoadBalancerInterceptor must invoke before EnhancedRestTemplateInterceptor + if (loadBalancerInterceptor != null) { + int addIndex = list.size(); + for (int i = 0; i < list.size(); i++) { + if (list.get(i) instanceof EnhancedRestTemplateInterceptor) { + addIndex = i; + } + } + list.add(addIndex, loadBalancerInterceptor); + } + restTemplate.setInterceptors(list); + }; + } + } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerRingHashKeyProvider.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerRingHashKeyProvider.java index 8a94f799b..e07d57dcc 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerRingHashKeyProvider.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerRingHashKeyProvider.java @@ -36,7 +36,7 @@ public final class PolarisLoadBalancerRingHashKeyProvider { } static String getHashKey() { - return MetadataContextHolder.get().getLoadbalancerMetadata().get(LOAD_BALANCER_HASH_KEY); + return (String) MetadataContextHolder.get().getLoadbalancerMetadata().get(LOAD_BALANCER_HASH_KEY); } } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisAutoServiceRegistration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisAutoServiceRegistration.java index 4bbf3d925..3ff960863 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisAutoServiceRegistration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisAutoServiceRegistration.java @@ -17,6 +17,9 @@ package com.tencent.cloud.polaris.registry; +import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.polaris.api.pojo.ServiceKey; +import com.tencent.polaris.assembly.api.AssemblyAPI; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,10 +39,17 @@ public class PolarisAutoServiceRegistration extends AbstractAutoServiceRegistrat private final PolarisRegistration registration; - public PolarisAutoServiceRegistration(ServiceRegistry serviceRegistry, - AutoServiceRegistrationProperties autoServiceRegistrationProperties, PolarisRegistration registration) { + private final AssemblyAPI assemblyAPI; + + public PolarisAutoServiceRegistration( + ServiceRegistry serviceRegistry, + AutoServiceRegistrationProperties autoServiceRegistrationProperties, + PolarisRegistration registration, + AssemblyAPI assemblyAPI + ) { super(serviceRegistry, autoServiceRegistrationProperties); this.registration = registration; + this.assemblyAPI = assemblyAPI; } @Override @@ -58,6 +68,9 @@ public class PolarisAutoServiceRegistration extends AbstractAutoServiceRegistrat LOGGER.debug("Registration disabled."); return; } + if (assemblyAPI != null) { + assemblyAPI.initService(new ServiceKey(MetadataContext.LOCAL_NAMESPACE, MetadataContext.LOCAL_SERVICE)); + } super.register(); } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java index be5d244f9..7ef33c7fb 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java @@ -26,6 +26,7 @@ import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler; import com.tencent.cloud.polaris.extend.consul.ConsulContextProperties; import com.tencent.cloud.polaris.extend.nacos.NacosContextProperties; import com.tencent.cloud.rpc.enhancement.stat.config.PolarisStatProperties; +import com.tencent.polaris.assembly.api.AssemblyAPI; import com.tencent.polaris.client.api.SDKContext; import org.springframework.beans.factory.annotation.Autowired; @@ -78,9 +79,13 @@ public class PolarisServiceRegistryAutoConfiguration { @Bean @ConditionalOnBean(AutoServiceRegistrationProperties.class) - public PolarisAutoServiceRegistration polarisAutoServiceRegistration(PolarisServiceRegistry registry, - AutoServiceRegistrationProperties autoServiceRegistrationProperties, PolarisRegistration registration) { - return new PolarisAutoServiceRegistration(registry, autoServiceRegistrationProperties, registration); + public PolarisAutoServiceRegistration polarisAutoServiceRegistration( + PolarisServiceRegistry registry, + AutoServiceRegistrationProperties autoServiceRegistrationProperties, + PolarisRegistration registration, + @Autowired(required = false) AssemblyAPI assemblyAPI + ) { + return new PolarisAutoServiceRegistration(registry, autoServiceRegistrationProperties, registration, assemblyAPI); } @Bean 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 badbd5d3f..75481aa5a 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 @@ -48,11 +48,6 @@ public class MetadataContext { */ public static final String FRAGMENT_DISPOSABLE = "disposable"; - /** - * load balancer context. - */ - public static final String FRAGMENT_LOAD_BALANCER = "loadbalancer"; - /** * upstream disposable Context. */ @@ -115,8 +110,12 @@ public class MetadataContext { private final Map> fragmentContexts; + private final Map loadbalancerMetadata; + + public MetadataContext() { this.fragmentContexts = new ConcurrentHashMap<>(); + this.loadbalancerMetadata = new ConcurrentHashMap<>(); } public Map getDisposableMetadata() { @@ -148,8 +147,8 @@ public class MetadataContext { return this.getFragmentContext(MetadataContext.FRAGMENT_RAW_TRANSHEADERS_KV); } - public Map getLoadbalancerMetadata() { - return this.getFragmentContext(FRAGMENT_LOAD_BALANCER); + public Map getLoadbalancerMetadata() { + return this.loadbalancerMetadata; } public void setTransitiveMetadata(Map transitiveMetadata) { @@ -172,8 +171,8 @@ public class MetadataContext { this.putContext(FRAGMENT_RAW_TRANSHEADERS, key, value); } - public void setLoadbalancer(String key, String value) { - this.putContext(FRAGMENT_LOAD_BALANCER, key, value); + public void setLoadbalancer(String key, Object value) { + this.loadbalancerMetadata.put(key, value); } public Map getFragmentContext(String fragment) { diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index 275c6aac6..4b4c47e69 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -73,7 +73,7 @@ 1.12.0-2022.0.1-SNAPSHOT - 1.12.0 + 1.13.0-SNAPSHOT 31.1-jre 4.9.0 1.12.19 @@ -164,6 +164,12 @@ ${revision} + + com.tencent.cloud + spring-cloud-starter-tencent-tsf-adapter-plugin + ${revision} + + com.tencent.cloud spring-cloud-tencent-featureenv-plugin diff --git a/spring-cloud-tencent-plugin-starters/pom.xml b/spring-cloud-tencent-plugin-starters/pom.xml index bc2f153b9..3de6b8ac8 100644 --- a/spring-cloud-tencent-plugin-starters/pom.xml +++ b/spring-cloud-tencent-plugin-starters/pom.xml @@ -18,6 +18,8 @@ spring-cloud-tencent-featureenv-plugin spring-cloud-tencent-gateway-plugin spring-cloud-starter-tencent-discovery-adapter-plugin + spring-cloud-starter-tencent-tsf-adapter-plugin + diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-tsf-adapter-plugin/pom.xml b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-tsf-adapter-plugin/pom.xml new file mode 100644 index 000000000..9fe8b4f2f --- /dev/null +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-tsf-adapter-plugin/pom.xml @@ -0,0 +1,48 @@ + + + + spring-cloud-tencent-plugin-starters + com.tencent.cloud + ${revision} + ../pom.xml + + 4.0.0 + + spring-cloud-starter-tencent-tsf-adapter-plugin + Spring Cloud Starter Tencent TSF Plugin + + + + + + com.tencent.cloud + spring-cloud-tencent-polaris-context + + + com.tencent.cloud + spring-cloud-tencent-rpc-enhancement + + + + + + com.tencent.polaris + polaris-assembly-factory + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.mockito + mockito-inline + test + + + diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-tsf-adapter-plugin/src/main/java/com/tencent/cloud/tsf/adapter/config/PolarisFlowConfigModifier.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-tsf-adapter-plugin/src/main/java/com/tencent/cloud/tsf/adapter/config/PolarisFlowConfigModifier.java new file mode 100644 index 000000000..2f46dd201 --- /dev/null +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-tsf-adapter-plugin/src/main/java/com/tencent/cloud/tsf/adapter/config/PolarisFlowConfigModifier.java @@ -0,0 +1,35 @@ +/* + * 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.tsf.adapter.config; + +import com.tencent.cloud.polaris.context.PolarisConfigModifier; +import com.tencent.polaris.factory.config.ConfigurationImpl; + +public class PolarisFlowConfigModifier implements PolarisConfigModifier { + + @Override + public void modify(ConfigurationImpl configuration) { + + } + + @Override + public int getOrder() { + return 0; + } + +} diff --git a/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-tsf-adapter-plugin/src/main/java/com/tencent/cloud/tsf/adapter/config/PolarisTsfAdapterAutoConfiguration.java b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-tsf-adapter-plugin/src/main/java/com/tencent/cloud/tsf/adapter/config/PolarisTsfAdapterAutoConfiguration.java new file mode 100644 index 000000000..538144f7d --- /dev/null +++ b/spring-cloud-tencent-plugin-starters/spring-cloud-starter-tencent-tsf-adapter-plugin/src/main/java/com/tencent/cloud/tsf/adapter/config/PolarisTsfAdapterAutoConfiguration.java @@ -0,0 +1,42 @@ +/* + * 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.tsf.adapter.config; + +import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled; +import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementAutoConfiguration; +import com.tencent.polaris.api.exception.PolarisException; + +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration(proxyBeanMethods = false) +@ConditionalOnPolarisEnabled +@AutoConfigureAfter(RpcEnhancementAutoConfiguration.class) +public class PolarisTsfAdapterAutoConfiguration { + + @Bean + @ConditionalOnMissingBean + public PolarisFlowConfigModifier polarisFlowConfigModifier() throws PolarisException { + return new PolarisFlowConfigModifier(); + } + + + +} diff --git a/spring-cloud-tencent-polaris-context/pom.xml b/spring-cloud-tencent-polaris-context/pom.xml index 5b6c5cca2..0ae402020 100644 --- a/spring-cloud-tencent-polaris-context/pom.xml +++ b/spring-cloud-tencent-polaris-context/pom.xml @@ -99,6 +99,11 @@ com.tencent.polaris loadbalancer-ringhash + + + com.tencent.polaris + polaris-assembly-factory + diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java index a0256ae12..0ae6f4124 100644 --- a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java @@ -27,6 +27,8 @@ import com.tencent.cloud.polaris.context.ServiceRuleManager; import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.api.core.ProviderAPI; import com.tencent.polaris.api.exception.PolarisException; +import com.tencent.polaris.assembly.api.AssemblyAPI; +import com.tencent.polaris.assembly.factory.AssemblyAPIFactory; import com.tencent.polaris.client.api.SDKContext; import com.tencent.polaris.factory.api.DiscoveryAPIFactory; import com.tencent.polaris.factory.api.RouterAPIFactory; @@ -73,6 +75,11 @@ public class PolarisContextAutoConfiguration { return RouterAPIFactory.createRouterAPIByContext(polarisContext); } + @Bean + public AssemblyAPI assemblyAPI(SDKContext polarisContext) throws PolarisException { + return AssemblyAPIFactory.createAssemblyAPIByContext(polarisContext); + } + @Bean @ConditionalOnMissingBean public ModifyAddress polarisConfigModifier(PolarisContextProperties properties) { diff --git a/spring-cloud-tencent-rpc-enhancement/pom.xml b/spring-cloud-tencent-rpc-enhancement/pom.xml index 5d7cf2d24..1dd931227 100644 --- a/spring-cloud-tencent-rpc-enhancement/pom.xml +++ b/spring-cloud-tencent-rpc-enhancement/pom.xml @@ -71,7 +71,7 @@ org.springframework.boot spring-boot-starter-web - test + true 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 aadd0b0ba..1c656675e 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 @@ -23,17 +23,27 @@ import java.util.List; import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled; import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration; import com.tencent.cloud.rpc.enhancement.feign.EnhancedFeignBeanPostProcessor; +import com.tencent.cloud.rpc.enhancement.feign.PolarisLoadBalancerFeignRequestTransformer; +import com.tencent.cloud.rpc.enhancement.filter.EnhancedReactiveFilter; +import com.tencent.cloud.rpc.enhancement.filter.EnhancedServletFilter; import com.tencent.cloud.rpc.enhancement.plugin.DefaultEnhancedPluginRunner; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner; +import com.tencent.cloud.rpc.enhancement.plugin.assembly.client.AssemblyClientExceptionHook; +import com.tencent.cloud.rpc.enhancement.plugin.assembly.client.AssemblyClientPostHook; +import com.tencent.cloud.rpc.enhancement.plugin.assembly.client.AssemblyClientPreHook; +import com.tencent.cloud.rpc.enhancement.plugin.assembly.server.AssemblyServerExceptionHook; +import com.tencent.cloud.rpc.enhancement.plugin.assembly.server.AssemblyServerPostHook; +import com.tencent.cloud.rpc.enhancement.plugin.assembly.server.AssemblyServerPreHook; import com.tencent.cloud.rpc.enhancement.plugin.reporter.ExceptionPolarisReporter; import com.tencent.cloud.rpc.enhancement.plugin.reporter.SuccessPolarisReporter; -import com.tencent.cloud.rpc.enhancement.resttemplate.BlockingLoadBalancerClientAspect; 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.webclient.EnhancedWebClientReporter; +import com.tencent.cloud.rpc.enhancement.webclient.EnhancedWebClientExchangeFilterFunction; import com.tencent.cloud.rpc.enhancement.webclient.PolarisLoadBalancerClientRequestTransformer; import com.tencent.polaris.api.core.ConsumerAPI; +import com.tencent.polaris.assembly.api.AssemblyAPI; import com.tencent.polaris.client.api.SDKContext; import org.springframework.beans.factory.SmartInitializingSingleton; @@ -44,15 +54,25 @@ import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Role; +import org.springframework.core.annotation.Order; import org.springframework.web.client.RestTemplate; import org.springframework.web.reactive.function.client.WebClient; +import static jakarta.servlet.DispatcherType.ASYNC; +import static jakarta.servlet.DispatcherType.ERROR; +import static jakarta.servlet.DispatcherType.FORWARD; +import static jakarta.servlet.DispatcherType.INCLUDE; +import static jakarta.servlet.DispatcherType.REQUEST; + /** * Auto Configuration for Polaris {@link feign.Feign} OR {@link RestTemplate} which can automatically bring in the call * results for reporting. @@ -67,23 +87,85 @@ import org.springframework.web.reactive.function.client.WebClient; public class RpcEnhancementAutoConfiguration { @Bean + @Lazy public EnhancedPluginRunner enhancedFeignPluginRunner( - @Autowired(required = false) List enhancedPlugins) { - return new DefaultEnhancedPluginRunner(enhancedPlugins); + @Autowired(required = false) List enhancedPlugins, + @Autowired(required = false) @Lazy Registration registration, + SDKContext sdkContext) { + return new DefaultEnhancedPluginRunner(enhancedPlugins, registration, sdkContext); } @Bean public SuccessPolarisReporter successPolarisReporter(RpcEnhancementReporterProperties properties, - SDKContext context, ConsumerAPI consumerAPI) { - return new SuccessPolarisReporter(properties, context, consumerAPI); + return new SuccessPolarisReporter(properties, consumerAPI); } @Bean public ExceptionPolarisReporter exceptionPolarisReporter(RpcEnhancementReporterProperties properties, - SDKContext context, ConsumerAPI consumerAPI) { - return new ExceptionPolarisReporter(properties, context, consumerAPI); + return new ExceptionPolarisReporter(properties, consumerAPI); + } + + @Bean + public AssemblyClientExceptionHook assemblyClientExceptionHook(AssemblyAPI assemblyAPI) { + return new AssemblyClientExceptionHook(assemblyAPI); + } + + @Bean + public AssemblyClientPostHook assemblyClientPostHook(AssemblyAPI assemblyAPI) { + return new AssemblyClientPostHook(assemblyAPI); + } + + @Bean + public AssemblyClientPreHook assemblyClientPreHook(AssemblyAPI assemblyAPI) { + return new AssemblyClientPreHook(assemblyAPI); + } + + @Bean + public AssemblyServerExceptionHook assemblyServerExceptionHook(AssemblyAPI assemblyAPI) { + return new AssemblyServerExceptionHook(assemblyAPI); + } + + @Bean + public AssemblyServerPostHook assemblyServerPostHook(AssemblyAPI assemblyAPI) { + return new AssemblyServerPostHook(assemblyAPI); + } + + @Bean + public AssemblyServerPreHook assemblyServerPreHook(AssemblyAPI assemblyAPI) { + return new AssemblyServerPreHook(assemblyAPI); + } + + @Configuration(proxyBeanMethods = false) + @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) + protected static class MetadataServletFilterConfig { + + @Bean + public FilterRegistrationBean metadataServletFilterRegistrationBean( + EnhancedServletFilter enhancedServletFilter) { + FilterRegistrationBean filterRegistrationBean = + new FilterRegistrationBean<>(enhancedServletFilter); + filterRegistrationBean.setDispatcherTypes(ASYNC, ERROR, FORWARD, INCLUDE, REQUEST); + filterRegistrationBean.setOrder(enhancedServletFilter.getClass().getAnnotation(Order.class).value()); + return filterRegistrationBean; + } + + @Bean + public EnhancedServletFilter enhancedServletFilter(@Lazy EnhancedPluginRunner pluginRunner) { + return new EnhancedServletFilter(pluginRunner); + } + + } + + @Configuration(proxyBeanMethods = false) + @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE) + protected static class MetadataReactiveFilterConfig { + + @Bean + public EnhancedReactiveFilter enhancedReactiveFilter(@Lazy EnhancedPluginRunner pluginRunner) { + return new EnhancedReactiveFilter(pluginRunner); + } } /** @@ -103,6 +185,13 @@ public class RpcEnhancementAutoConfiguration { return new EnhancedFeignBeanPostProcessor(pluginRunner); } + @Bean + @ConditionalOnMissingBean + @ConditionalOnClass(name = {"org.springframework.cloud.openfeign.loadbalancer.LoadBalancerFeignRequestTransformer"}) + public PolarisLoadBalancerFeignRequestTransformer polarisLoadBalancerFeignRequestTransformer() { + return new PolarisLoadBalancerFeignRequestTransformer(); + } + } /** @@ -135,9 +224,9 @@ public class RpcEnhancementAutoConfiguration { @Bean @ConditionalOnMissingBean - @ConditionalOnClass(name = {"org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient"}) - public BlockingLoadBalancerClientAspect blockingLoadBalancerClientAspect() { - return new BlockingLoadBalancerClientAspect(); + @ConditionalOnClass(name = {"org.springframework.cloud.client.loadbalancer.LoadBalancerRequestTransformer"}) + public PolarisLoadBalancerRequestTransformer polarisLoadBalancerRequestTransformer() { + return new PolarisLoadBalancerRequestTransformer(); } } @@ -155,12 +244,12 @@ public class RpcEnhancementAutoConfiguration { private List webClientBuilder = Collections.emptyList(); @Bean - public EnhancedWebClientReporter exchangeFilterFunction(@Lazy EnhancedPluginRunner pluginRunner) { - return new EnhancedWebClientReporter(pluginRunner); + public EnhancedWebClientExchangeFilterFunction exchangeFilterFunction(@Lazy EnhancedPluginRunner pluginRunner) { + return new EnhancedWebClientExchangeFilterFunction(pluginRunner); } @Bean - public SmartInitializingSingleton addEnhancedWebClientReporterForWebClient(EnhancedWebClientReporter reporter) { + public SmartInitializingSingleton addEnhancedWebClientReporterForWebClient(EnhancedWebClientExchangeFilterFunction reporter) { return () -> webClientBuilder.forEach(webClient -> { webClient.filter(reporter); }); diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignBeanPostProcessor.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignBeanPostProcessor.java index 1aa0abe24..99c5f6f2c 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignBeanPostProcessor.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignBeanPostProcessor.java @@ -27,6 +27,7 @@ import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient; import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; +import org.springframework.cloud.openfeign.loadbalancer.LoadBalancerFeignRequestTransformer; import org.springframework.cloud.openfeign.loadbalancer.RetryableFeignBlockingLoadBalancerClient; /** @@ -63,7 +64,9 @@ public class EnhancedFeignBeanPostProcessor implements BeanPostProcessor, BeanFa if (delegate != null) { return new EnhancedFeignBlockingLoadBalancerClient(createPolarisFeignClient(delegate), factory.getBean(BlockingLoadBalancerClient.class), - factory.getBean(LoadBalancerClientFactory.class)); + factory.getBean(LoadBalancerClientFactory.class), + factory.getBeanProvider(LoadBalancerFeignRequestTransformer.class).stream().toList() + ); } } return createPolarisFeignClient((Client) bean); diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignBlockingLoadBalancerClient.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignBlockingLoadBalancerClient.java index fa5457063..9040d0984 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignBlockingLoadBalancerClient.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignBlockingLoadBalancerClient.java @@ -17,11 +17,14 @@ package com.tencent.cloud.rpc.enhancement.feign; +import java.util.List; + import feign.Client; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; +import org.springframework.cloud.openfeign.loadbalancer.LoadBalancerFeignRequestTransformer; /** * Wrap for {@link FeignBlockingLoadBalancerClient}. @@ -31,7 +34,7 @@ import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalance public class EnhancedFeignBlockingLoadBalancerClient extends FeignBlockingLoadBalancerClient { public EnhancedFeignBlockingLoadBalancerClient(Client delegate, LoadBalancerClient loadBalancerClient, - LoadBalancerClientFactory loadBalancerClientFactory) { - super(delegate, loadBalancerClient, loadBalancerClientFactory); + LoadBalancerClientFactory loadBalancerClientFactory, List transformers) { + super(delegate, loadBalancerClient, loadBalancerClientFactory, transformers); } } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignClient.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignClient.java index e191edfde..1af26f5b6 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignClient.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignClient.java @@ -21,8 +21,10 @@ import java.io.IOException; import java.net.URI; import java.util.ArrayList; +import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedRequestContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedResponseContext; import feign.Client; @@ -30,14 +32,11 @@ import feign.Request; import feign.Request.Options; import feign.Response; -import org.springframework.cloud.client.DefaultServiceInstance; +import org.springframework.cloud.client.ServiceInstance; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; -import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.EXCEPTION; -import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.FINALLY; -import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.POST; -import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.PRE; +import static com.tencent.cloud.rpc.enhancement.resttemplate.PolarisLoadBalancerRequestTransformer.LOAD_BALANCER_SERVICE_INSTANCE; import static feign.Util.checkNotNull; /** @@ -66,13 +65,18 @@ public class EnhancedFeignClient implements Client { EnhancedRequestContext enhancedRequestContext = EnhancedRequestContext.builder() .httpHeaders(requestHeaders) - .httpMethod(HttpMethod.resolve(request.httpMethod().name())) + .httpMethod(HttpMethod.valueOf(request.httpMethod().name())) .url(url) .build(); enhancedPluginContext.setRequest(enhancedRequestContext); + enhancedPluginContext.setLocalServiceInstance(pluginRunner.getLocalServiceInstance()); + enhancedPluginContext.setTargetServiceInstance( + (ServiceInstance) MetadataContextHolder.get().getLoadbalancerMetadata().get(LOAD_BALANCER_SERVICE_INSTANCE)); + // Run pre enhanced plugins. - pluginRunner.run(PRE, enhancedPluginContext); + pluginRunner.run(EnhancedPluginType.Client.PRE, enhancedPluginContext); + long startMillis = System.currentTimeMillis(); try { Response response = delegate.execute(request, options); @@ -87,26 +91,20 @@ public class EnhancedFeignClient implements Client { .build(); enhancedPluginContext.setResponse(enhancedResponseContext); - DefaultServiceInstance serviceInstance = new DefaultServiceInstance(); - serviceInstance.setServiceId(request.requestTemplate().feignTarget().name()); - serviceInstance.setHost(url.getHost()); - serviceInstance.setPort(url.getPort()); - enhancedPluginContext.setServiceInstance(serviceInstance); - // Run post enhanced plugins. - pluginRunner.run(POST, enhancedPluginContext); + pluginRunner.run(EnhancedPluginType.Client.POST, enhancedPluginContext); return response; } catch (IOException origin) { enhancedPluginContext.setDelay(System.currentTimeMillis() - startMillis); enhancedPluginContext.setThrowable(origin); // Run exception enhanced feign plugins. - pluginRunner.run(EXCEPTION, enhancedPluginContext); + pluginRunner.run(EnhancedPluginType.Client.EXCEPTION, enhancedPluginContext); throw origin; } finally { // Run finally enhanced plugins. - pluginRunner.run(FINALLY, enhancedPluginContext); + pluginRunner.run(EnhancedPluginType.Client.FINALLY, enhancedPluginContext); } } } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/PolarisLoadBalancerFeignRequestTransformer.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/PolarisLoadBalancerFeignRequestTransformer.java new file mode 100644 index 000000000..65b16da8f --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/feign/PolarisLoadBalancerFeignRequestTransformer.java @@ -0,0 +1,49 @@ +/* + * 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.rpc.enhancement.feign; + +import com.tencent.cloud.common.metadata.MetadataContextHolder; +import feign.Request; + +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.openfeign.loadbalancer.LoadBalancerFeignRequestTransformer; + +import static com.tencent.cloud.rpc.enhancement.resttemplate.PolarisLoadBalancerRequestTransformer.LOAD_BALANCER_SERVICE_INSTANCE; + +/** + * PolarisLoadBalancerFeignRequestTransformer. + * + * @author sean yu + */ +public class PolarisLoadBalancerFeignRequestTransformer implements LoadBalancerFeignRequestTransformer { + + /** + * Transform Request, add Loadbalancer ServiceInstance to MetadataContext. + * @param request request + * @param instance instance + * @return HttpRequest + */ + @Override + public Request transformRequest(Request request, ServiceInstance instance) { + if (instance != null) { + MetadataContextHolder.get().setLoadbalancer(LOAD_BALANCER_SERVICE_INSTANCE, instance); + } + return request; + } + +} 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 new file mode 100644 index 000000000..0e7e972a3 --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/filter/EnhancedReactiveFilter.java @@ -0,0 +1,91 @@ +/* + * 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.rpc.enhancement.filter; + +import com.tencent.cloud.common.constant.MetadataConstant; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedRequestContext; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedResponseContext; +import reactor.core.publisher.Mono; + +import org.springframework.core.Ordered; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; + +/** + * EnhancedReactiveFilter. + * + * @author sean yu + */ +public class EnhancedReactiveFilter implements WebFilter, Ordered { + + private final EnhancedPluginRunner pluginRunner; + + public EnhancedReactiveFilter(EnhancedPluginRunner pluginRunner) { + this.pluginRunner = pluginRunner; + } + + @Override + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + EnhancedPluginContext enhancedPluginContext = new EnhancedPluginContext(); + + EnhancedRequestContext enhancedRequestContext = EnhancedRequestContext.builder() + .httpHeaders(exchange.getRequest().getHeaders()) + .httpMethod(exchange.getRequest().getMethod()) + .url(exchange.getRequest().getURI()) + .build(); + enhancedPluginContext.setRequest(enhancedRequestContext); + + // Run pre enhanced plugins. + pluginRunner.run(EnhancedPluginType.Server.PRE, enhancedPluginContext); + + long startMillis = System.currentTimeMillis(); + return chain.filter(exchange) + .doOnSuccess(v -> { + enhancedPluginContext.setDelay(System.currentTimeMillis() - startMillis); + + EnhancedResponseContext enhancedResponseContext = EnhancedResponseContext.builder() + .httpStatus(exchange.getResponse().getRawStatusCode()) + .httpHeaders(exchange.getResponse().getHeaders()) + .build(); + enhancedPluginContext.setResponse(enhancedResponseContext); + + // Run post enhanced plugins. + pluginRunner.run(EnhancedPluginType.Server.POST, enhancedPluginContext); + }) + .doOnError(e -> { + enhancedPluginContext.setDelay(System.currentTimeMillis() - startMillis); + enhancedPluginContext.setThrowable(e); + // Run exception enhanced plugins. + pluginRunner.run(EnhancedPluginType.Server.EXCEPTION, enhancedPluginContext); + }) + .doFinally(v -> { + // Run finally enhanced plugins. + pluginRunner.run(EnhancedPluginType.Server.FINALLY, enhancedPluginContext); + }); + } + + @Override + public int getOrder() { + return MetadataConstant.OrderConstant.WEB_FILTER_ORDER + 1; + } + +} 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 new file mode 100644 index 000000000..66359ad7e --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/filter/EnhancedServletFilter.java @@ -0,0 +1,113 @@ +/* + * 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.rpc.enhancement.filter; + +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; + +import com.tencent.cloud.common.constant.MetadataConstant; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedRequestContext; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedResponseContext; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.web.filter.OncePerRequestFilter; + +/** + * EnhancedServletFilter. + * + * @author sean yu + */ +@Order(MetadataConstant.OrderConstant.WEB_FILTER_ORDER + 1) +public class EnhancedServletFilter extends OncePerRequestFilter { + + private final EnhancedPluginRunner pluginRunner; + + public EnhancedServletFilter(EnhancedPluginRunner pluginRunner) { + this.pluginRunner = pluginRunner; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + EnhancedPluginContext enhancedPluginContext = new EnhancedPluginContext(); + + HttpHeaders requestHeaders = new HttpHeaders(); + Enumeration requestHeaderNames = request.getHeaderNames(); + if (requestHeaderNames != null) { + while (requestHeaderNames.hasMoreElements()) { + String requestHeaderName = requestHeaderNames.nextElement(); + requestHeaders.addAll(requestHeaderName, Collections.list(request.getHeaders(requestHeaderName))); + } + } + EnhancedRequestContext enhancedRequestContext = EnhancedRequestContext.builder() + .httpHeaders(requestHeaders) + .httpMethod(HttpMethod.valueOf(request.getMethod())) + .url(URI.create(request.getRequestURL().toString())) + .build(); + enhancedPluginContext.setRequest(enhancedRequestContext); + + // Run pre enhanced plugins. + pluginRunner.run(EnhancedPluginType.Server.PRE, enhancedPluginContext); + + long startMillis = System.currentTimeMillis(); + try { + filterChain.doFilter(request, response); + enhancedPluginContext.setDelay(System.currentTimeMillis() - startMillis); + + HttpHeaders responseHeaders = new HttpHeaders(); + Collection responseHeaderNames = response.getHeaderNames(); + if (responseHeaderNames != null) { + for (String responseHeaderName : responseHeaderNames) { + responseHeaders.addAll(responseHeaderName, new ArrayList<>(response.getHeaders(responseHeaderName))); + } + } + EnhancedResponseContext enhancedResponseContext = EnhancedResponseContext.builder() + .httpStatus(response.getStatus()) + .httpHeaders(responseHeaders) + .build(); + enhancedPluginContext.setResponse(enhancedResponseContext); + + // Run post enhanced plugins. + pluginRunner.run(EnhancedPluginType.Server.POST, enhancedPluginContext); + } + catch (ServletException | IOException e) { + enhancedPluginContext.setDelay(System.currentTimeMillis() - startMillis); + enhancedPluginContext.setThrowable(e); + // Run exception enhanced plugins. + pluginRunner.run(EnhancedPluginType.Server.EXCEPTION, enhancedPluginContext); + throw e; + } + finally { + // Run finally enhanced plugins. + pluginRunner.run(EnhancedPluginType.Server.FINALLY, enhancedPluginContext); + } + } + +} diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/DefaultEnhancedPluginRunner.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/DefaultEnhancedPluginRunner.java index ca34b2af1..fe88923f6 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/DefaultEnhancedPluginRunner.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/DefaultEnhancedPluginRunner.java @@ -23,7 +23,12 @@ import java.util.List; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; +import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.polaris.client.api.SDKContext; +import org.springframework.cloud.client.DefaultServiceInstance; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.util.CollectionUtils; /** @@ -33,13 +38,28 @@ import org.springframework.util.CollectionUtils; */ public class DefaultEnhancedPluginRunner implements EnhancedPluginRunner { - private final Multimap pluginMap = ArrayListMultimap.create(); + private final Multimap pluginMap = ArrayListMultimap.create(); - public DefaultEnhancedPluginRunner(List enhancedPlugins) { + private final ServiceInstance localServiceInstance; + + public DefaultEnhancedPluginRunner( + List enhancedPlugins, + Registration registration, + SDKContext sdkContext + ) { if (!CollectionUtils.isEmpty(enhancedPlugins)) { enhancedPlugins.stream() .sorted(Comparator.comparing(EnhancedPlugin::getOrder)) - .forEach(plugin -> pluginMap.put(plugin.getType().name(), plugin)); + .forEach(plugin -> pluginMap.put(plugin.getType(), plugin)); + } + if (registration != null) { + localServiceInstance = registration; + } + else { + DefaultServiceInstance defaultServiceInstance = new DefaultServiceInstance(); + defaultServiceInstance.setServiceId(MetadataContext.LOCAL_SERVICE); + defaultServiceInstance.setHost(sdkContext.getConfig().getGlobal().getAPI().getBindIP()); + localServiceInstance = defaultServiceInstance; } } @@ -51,7 +71,7 @@ public class DefaultEnhancedPluginRunner implements EnhancedPluginRunner { */ @Override public void run(EnhancedPluginType pluginType, EnhancedPluginContext context) { - for (EnhancedPlugin plugin : pluginMap.get(pluginType.name())) { + for (EnhancedPlugin plugin : pluginMap.get(pluginType)) { try { plugin.run(context); } @@ -60,4 +80,10 @@ public class DefaultEnhancedPluginRunner implements EnhancedPluginRunner { } } } + + @Override + public ServiceInstance getLocalServiceInstance() { + return this.localServiceInstance; + } + } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginContext.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginContext.java index fa4e891d0..4676c51ad 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginContext.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginContext.java @@ -35,7 +35,12 @@ public class EnhancedPluginContext { private long delay; - private ServiceInstance serviceInstance; + private ServiceInstance localServiceInstance; + + /** + * targetServiceInstance only exist in a client runner type. + */ + private ServiceInstance targetServiceInstance; public EnhancedRequestContext getRequest() { return request; @@ -69,12 +74,20 @@ public class EnhancedPluginContext { this.delay = delay; } - public ServiceInstance getServiceInstance() { - return serviceInstance; + public ServiceInstance getLocalServiceInstance() { + return localServiceInstance; + } + + public void setLocalServiceInstance(ServiceInstance localServiceInstance) { + this.localServiceInstance = localServiceInstance; } - public void setServiceInstance(ServiceInstance serviceInstance) { - this.serviceInstance = serviceInstance; + public ServiceInstance getTargetServiceInstance() { + return targetServiceInstance; + } + + public void setTargetServiceInstance(ServiceInstance targetServiceInstance) { + this.targetServiceInstance = targetServiceInstance; } @Override @@ -84,7 +97,9 @@ public class EnhancedPluginContext { ", response=" + response + ", throwable=" + throwable + ", delay=" + delay + - ", serviceInstance=" + serviceInstance + + ", localServiceInstance=" + localServiceInstance + + ", targetServiceInstance=" + targetServiceInstance + '}'; } + } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginRunner.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginRunner.java index e15af39e5..5ff7d1bf6 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginRunner.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginRunner.java @@ -18,6 +18,8 @@ package com.tencent.cloud.rpc.enhancement.plugin; +import org.springframework.cloud.client.ServiceInstance; + /** * Plugin runner. * @@ -32,4 +34,7 @@ public interface EnhancedPluginRunner { * @param context context in enhanced feign client. */ void run(EnhancedPluginType pluginType, EnhancedPluginContext context); + + ServiceInstance getLocalServiceInstance(); + } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginType.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginType.java index 64dc2ecb9..996af00bb 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginType.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginType.java @@ -22,25 +22,52 @@ package com.tencent.cloud.rpc.enhancement.plugin; * * @author Haotian Zhang */ -public enum EnhancedPluginType { - - /** - * Pre feign plugin. - */ - PRE, - - /** - * Post feign plugin. - */ - POST, - - /** - * Exception feign plugin. - */ - EXCEPTION, - - /** - * Finally feign plugin. - */ - FINALLY +public interface EnhancedPluginType { + + enum Client implements EnhancedPluginType { + /** + * Pre Client plugin. + */ + PRE, + + /** + * Post Client plugin. + */ + POST, + + /** + * Exception Client plugin. + */ + EXCEPTION, + + /** + * Finally Client plugin. + */ + FINALLY + + } + + enum Server implements EnhancedPluginType { + /** + * Pre Server plugin. + */ + PRE, + + /** + * Post Server plugin. + */ + POST, + + /** + * Exception Server plugin. + */ + EXCEPTION, + + /** + * Finally Server plugin. + */ + FINALLY + + } + } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/AbstractPolarisReporterAdapter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/PolarisEnhancedPluginUtils.java similarity index 87% rename from spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/AbstractPolarisReporterAdapter.java rename to spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/PolarisEnhancedPluginUtils.java index d177aad8b..f4af60583 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/AbstractPolarisReporterAdapter.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/PolarisEnhancedPluginUtils.java @@ -15,7 +15,7 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.rpc.enhancement; +package com.tencent.cloud.rpc.enhancement.plugin; import java.io.UnsupportedEncodingException; import java.net.SocketTimeoutException; @@ -30,6 +30,7 @@ import java.util.Objects; 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.common.util.RequestLabelUtils; import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; import com.tencent.polaris.api.plugin.circuitbreaker.ResourceStat; @@ -39,7 +40,6 @@ import com.tencent.polaris.api.pojo.RetStatus; import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.rpc.ServiceCallResult; import com.tencent.polaris.api.utils.CollectionUtils; -import com.tencent.polaris.client.api.SDKContext; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,30 +63,21 @@ import static org.springframework.http.HttpStatus.SERVICE_UNAVAILABLE; import static org.springframework.http.HttpStatus.VARIANT_ALSO_NEGOTIATES; /** - * Abstract Polaris Reporter Adapter . + * Abstract Polaris Plugin Adapter . * * @author Elve.Xu 2022-07-11 */ -public abstract class AbstractPolarisReporterAdapter { - private static final Logger LOG = LoggerFactory.getLogger(AbstractPolarisReporterAdapter.class); - private static final List HTTP_STATUSES = toList(NOT_IMPLEMENTED, BAD_GATEWAY, - SERVICE_UNAVAILABLE, GATEWAY_TIMEOUT, HTTP_VERSION_NOT_SUPPORTED, VARIANT_ALSO_NEGOTIATES, - INSUFFICIENT_STORAGE, LOOP_DETECTED, BANDWIDTH_LIMIT_EXCEEDED, NOT_EXTENDED, NETWORK_AUTHENTICATION_REQUIRED); - - protected final RpcEnhancementReporterProperties reportProperties; +public final class PolarisEnhancedPluginUtils { - protected final SDKContext context; + private PolarisEnhancedPluginUtils() { - /** - * Constructor With {@link RpcEnhancementReporterProperties} . - * - * @param reportProperties instance of {@link RpcEnhancementReporterProperties}. - */ - protected AbstractPolarisReporterAdapter(RpcEnhancementReporterProperties reportProperties, SDKContext context) { - this.reportProperties = reportProperties; - this.context = context; } + private static final Logger LOG = LoggerFactory.getLogger(PolarisEnhancedPluginUtils.class); + private static final List HTTP_STATUSES = toList(NOT_IMPLEMENTED, BAD_GATEWAY, + SERVICE_UNAVAILABLE, GATEWAY_TIMEOUT, HTTP_VERSION_NOT_SUPPORTED, VARIANT_ALSO_NEGOTIATES, + INSUFFICIENT_STORAGE, LOOP_DETECTED, BANDWIDTH_LIMIT_EXCEEDED, NOT_EXTENDED, NETWORK_AUTHENTICATION_REQUIRED); + /** * createServiceCallResult. * @param calleeServiceName will pick up url host when null @@ -100,7 +91,7 @@ public abstract class AbstractPolarisReporterAdapter { * @param exception exception * @return ServiceCallResult */ - public ServiceCallResult createServiceCallResult( + public static ServiceCallResult createServiceCallResult(String callerHost, @Nullable String calleeServiceName, @Nullable String calleeHost, @Nullable Integer calleePort, URI uri, HttpHeaders requestHeaders, @Nullable HttpHeaders responseHeaders, @Nullable Integer statusCode, long delay, @Nullable Throwable exception) { @@ -112,11 +103,11 @@ public abstract class AbstractPolarisReporterAdapter { resultRequest.setRetCode(statusCode == null ? -1 : statusCode); resultRequest.setDelay(delay); resultRequest.setCallerService(new ServiceKey(MetadataContext.LOCAL_NAMESPACE, MetadataContext.LOCAL_SERVICE)); - resultRequest.setCallerIp(this.context.getConfig().getGlobal().getAPI().getBindIP()); + resultRequest.setCallerIp(callerHost); resultRequest.setHost(StringUtils.isBlank(calleeHost) ? uri.getHost() : calleeHost); resultRequest.setPort(calleePort == null ? getPort(uri) : calleePort); resultRequest.setLabels(getLabels(requestHeaders)); - resultRequest.setRetStatus(getRetStatusFromRequest(responseHeaders, getDefaultRetStatus(statusCode, exception))); + resultRequest.setRetStatus(getRetStatusFromRequest(responseHeaders, statusCode, exception)); resultRequest.setRuleName(getActiveRuleNameFromRequest(responseHeaders)); return resultRequest; } @@ -132,7 +123,7 @@ public abstract class AbstractPolarisReporterAdapter { * @param exception exception * @return ResourceStat */ - public ResourceStat createInstanceResourceStat( + public static ResourceStat createInstanceResourceStat( @Nullable String calleeServiceName, @Nullable String calleeHost, @Nullable Integer calleePort, URI uri, @Nullable Integer statusCode, long delay, @Nullable Throwable exception) { ServiceKey calleeServiceKey = new ServiceKey(MetadataContext.LOCAL_NAMESPACE, StringUtils.isBlank(calleeServiceName) ? uri.getHost() : calleeServiceName); @@ -165,11 +156,12 @@ public abstract class AbstractPolarisReporterAdapter { * @param httpStatus request http status code * @return true , otherwise return false . */ - protected boolean apply(@Nullable HttpStatus httpStatus) { + static boolean apply(@Nullable HttpStatus httpStatus) { if (Objects.isNull(httpStatus)) { return false; } else { + RpcEnhancementReporterProperties reportProperties = ApplicationContextAwareUtils.getApplicationContext().getBean(RpcEnhancementReporterProperties.class); // statuses > series List status = reportProperties.getStatuses(); @@ -200,7 +192,11 @@ public abstract class AbstractPolarisReporterAdapter { return false; } - protected RetStatus getRetStatusFromRequest(HttpHeaders headers, RetStatus defaultVal) { + public static RetStatus getRetStatusFromRequest(HttpHeaders headers, Integer statusCode, Throwable exception) { + return getRetStatusFromRequest(headers, getDefaultRetStatus(statusCode, exception)); + } + + static RetStatus getRetStatusFromRequest(HttpHeaders headers, RetStatus defaultVal) { if (headers != null && headers.containsKey(HeaderConstant.INTERNAL_CALLEE_RET_STATUS)) { List values = headers.get(HeaderConstant.INTERNAL_CALLEE_RET_STATUS); if (CollectionUtils.isNotEmpty(values)) { @@ -216,7 +212,7 @@ public abstract class AbstractPolarisReporterAdapter { return defaultVal; } - protected String getActiveRuleNameFromRequest(HttpHeaders headers) { + static String getActiveRuleNameFromRequest(HttpHeaders headers) { if (headers != null && headers.containsKey(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME)) { Collection values = headers.get(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME); if (CollectionUtils.isNotEmpty(values)) { @@ -226,7 +222,7 @@ public abstract class AbstractPolarisReporterAdapter { return ""; } - private RetStatus getDefaultRetStatus(Integer statusCode, Throwable exception) { + private static RetStatus getDefaultRetStatus(Integer statusCode, Throwable exception) { RetStatus retStatus = RetStatus.RetSuccess; if (exception != null) { retStatus = RetStatus.RetFail; @@ -240,12 +236,12 @@ public abstract class AbstractPolarisReporterAdapter { return retStatus; } - private int getPort(URI uri) { + private static int getPort(URI uri) { // -1 means access directly by url, and use http default port number 80 return uri.getPort() == -1 ? 80 : uri.getPort(); } - private String getLabels(HttpHeaders headers) { + private static String getLabels(HttpHeaders headers) { if (headers != null) { Collection labels = headers.get(RouterConstant.ROUTER_LABEL_HEADER); if (CollectionUtils.isNotEmpty(labels) && labels.iterator().hasNext()) { diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyRequestContext.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyRequestContext.java new file mode 100644 index 000000000..235994b3a --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyRequestContext.java @@ -0,0 +1,103 @@ +/* + * 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.rpc.enhancement.plugin.assembly; + +import java.net.URI; +import java.util.Collection; + +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedRequestContext; +import com.tencent.polaris.api.pojo.ServiceKey; +import com.tencent.polaris.api.rpc.RequestContext; + +import org.springframework.http.HttpMethod; + +/** + * AssemblyRequestContext. + * + * @author sean yu + */ +public class AssemblyRequestContext implements RequestContext { + + private final EnhancedRequestContext requestContext; + + private final ServiceKey callerService; + + private final String callerIp; + + public AssemblyRequestContext(EnhancedRequestContext requestContext, ServiceKey callerService, String callerIp) { + this.requestContext = requestContext; + this.callerService = callerService; + this.callerIp = callerIp; + } + + @Override + public String getMethod() { + return requestContext.getHttpMethod().name(); + } + + @Override + public void setMethod(String method) { + requestContext.setHttpMethod(HttpMethod.valueOf(method)); + } + + @Override + public String getHeader(String key) { + return requestContext.getHttpHeaders().getFirst(key); + } + + @Override + public void setHeader(String key, String value) { + requestContext.getHttpHeaders().set(key, value); + } + + @Override + public Collection listHeaderKeys() { + return requestContext.getHttpHeaders().keySet(); + } + + @Override + public String getCookie(String key) { + return null; + } + + @Override + public void setCookie(String key, String value) { + + } + + @Override + public Collection listCookieKeys() { + return null; + } + + @Override + public String getCallerIp() { + return callerIp; + } + + @Override + public ServiceKey getCallerService() { + return callerService; + } + + @Override + public URI getURI() { + return requestContext.getUrl(); + } + +} diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyResponseContext.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyResponseContext.java new file mode 100644 index 000000000..6abf09d7f --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/AssemblyResponseContext.java @@ -0,0 +1,79 @@ +/* + * 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.rpc.enhancement.plugin.assembly; + +import java.util.Collection; + +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedResponseContext; +import com.tencent.polaris.api.pojo.RetStatus; +import com.tencent.polaris.api.rpc.ResponseContext; + +/** + * AssemblyResponseContext. + * + * @author sean yu + */ +public class AssemblyResponseContext implements ResponseContext { + + private EnhancedResponseContext responseContext; + + private Throwable throwable; + + private RetStatus retStatus; + + public AssemblyResponseContext() { + } + + public AssemblyResponseContext(EnhancedResponseContext responseContext) { + this.responseContext = responseContext; + } + + @Override + public Object getRetCode() { + return this.responseContext.getHttpStatus(); + } + + @Override + public String getHeader(String key) { + return this.responseContext.getHttpHeaders().getFirst(key); + } + + @Override + public Collection listHeaders() { + return this.responseContext.getHttpHeaders().keySet(); + } + + public void setThrowable(Throwable throwable) { + this.throwable = throwable; + } + + @Override + public Throwable getThrowable() { + return this.throwable; + } + + public void setRetStatus(RetStatus retStatus) { + this.retStatus = retStatus; + } + + @Override + public RetStatus getRetStatus() { + return this.retStatus; + } + +} 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 new file mode 100644 index 000000000..601742eaa --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientExceptionHook.java @@ -0,0 +1,74 @@ +/* + * 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.rpc.enhancement.plugin.assembly.client; + +import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils; +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.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 org.springframework.core.Ordered; + +/** + * AssemblyClientExceptionHook. + * + * @author sean yu + */ +public class AssemblyClientExceptionHook implements EnhancedPlugin { + + private final AssemblyAPI assemblyAPI; + + public AssemblyClientExceptionHook(AssemblyAPI assemblyAPI) { + this.assemblyAPI = assemblyAPI; + } + + @Override + public EnhancedPluginType getType() { + return EnhancedPluginType.Client.EXCEPTION; + } + + @Override + public void run(EnhancedPluginContext context) throws Throwable { + AfterRequest afterRequest = new AfterRequest(); + afterRequest.setTargetService(new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getTargetServiceInstance().getServiceId())); + RequestContext requestContext = new AssemblyRequestContext( + context.getRequest(), + new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()), + context.getLocalServiceInstance().getHost() + ); + afterRequest.setRequestContext(requestContext); + AssemblyResponseContext responseContext = new AssemblyResponseContext(); + responseContext.setThrowable(context.getThrowable()); + responseContext.setRetStatus(PolarisEnhancedPluginUtils.getRetStatusFromRequest(null, null, context.getThrowable())); + afterRequest.setResponseContext(responseContext); + + assemblyAPI.afterCallService(afterRequest); + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE + 3; + } +} 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 new file mode 100644 index 000000000..48835749f --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPostHook.java @@ -0,0 +1,74 @@ +/* + * 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.rpc.enhancement.plugin.assembly.client; + +import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils; +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.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 org.springframework.core.Ordered; + +/** + * AssemblyClientPostHook. + * + * @author sean yu + */ +public class AssemblyClientPostHook implements EnhancedPlugin { + + private final AssemblyAPI assemblyAPI; + + public AssemblyClientPostHook(AssemblyAPI assemblyAPI) { + this.assemblyAPI = assemblyAPI; + } + + @Override + public EnhancedPluginType getType() { + return EnhancedPluginType.Client.POST; + } + + @Override + public void run(EnhancedPluginContext context) throws Throwable { + AfterRequest afterRequest = new AfterRequest(); + afterRequest.setTargetService(new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getTargetServiceInstance().getServiceId())); + RequestContext requestContext = new AssemblyRequestContext( + context.getRequest(), + new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()), + context.getLocalServiceInstance().getHost() + ); + afterRequest.setRequestContext(requestContext); + AssemblyResponseContext responseContext = new AssemblyResponseContext(context.getResponse()); + responseContext.setRetStatus(PolarisEnhancedPluginUtils.getRetStatusFromRequest(context.getResponse().getHttpHeaders(), context.getResponse().getHttpStatus(), null)); + afterRequest.setResponseContext(responseContext); + + assemblyAPI.afterCallService(afterRequest); + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE + 3; + } + +} 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 new file mode 100644 index 000000000..489a98fda --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/client/AssemblyClientPreHook.java @@ -0,0 +1,68 @@ +/* + * 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.rpc.enhancement.plugin.assembly.client; + +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.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 org.springframework.core.Ordered; + +/** + * AssemblyClientPreHook. + * + * @author sean yu + */ +public class AssemblyClientPreHook implements EnhancedPlugin { + + private final AssemblyAPI assemblyAPI; + + public AssemblyClientPreHook(AssemblyAPI assemblyAPI) { + this.assemblyAPI = assemblyAPI; + } + + @Override + public EnhancedPluginType getType() { + return EnhancedPluginType.Client.PRE; + } + + @Override + public void run(EnhancedPluginContext context) throws Throwable { + BeforeRequest beforeRequest = new BeforeRequest(); + beforeRequest.setTargetService(new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getTargetServiceInstance().getServiceId())); + RequestContext requestContext = new AssemblyRequestContext( + context.getRequest(), + new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()), + context.getLocalServiceInstance().getHost() + ); + beforeRequest.setRequestContext(requestContext); + assemblyAPI.beforeCallService(beforeRequest); + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE + 3; + } + +} 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 new file mode 100644 index 000000000..76b0828d3 --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerExceptionHook.java @@ -0,0 +1,74 @@ +/* + * 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.rpc.enhancement.plugin.assembly.server; + +import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils; +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.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 org.springframework.core.Ordered; + +/** + * AssemblyServerExceptionHook. + * + * @author sean yu + */ +public class AssemblyServerExceptionHook implements EnhancedPlugin { + + private final AssemblyAPI assemblyAPI; + + public AssemblyServerExceptionHook(AssemblyAPI assemblyAPI) { + this.assemblyAPI = assemblyAPI; + } + + @Override + public EnhancedPluginType getType() { + return EnhancedPluginType.Server.POST; + } + + @Override + public void run(EnhancedPluginContext context) throws Throwable { + AfterRequest afterRequest = new AfterRequest(); + RequestContext requestContext = new AssemblyRequestContext( + context.getRequest(), + new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()), + context.getLocalServiceInstance().getHost() + ); + afterRequest.setRequestContext(requestContext); + AssemblyResponseContext responseContext = new AssemblyResponseContext(); + responseContext.setThrowable(context.getThrowable()); + responseContext.setRetStatus(PolarisEnhancedPluginUtils.getRetStatusFromRequest(null, null, context.getThrowable())); + afterRequest.setResponseContext(responseContext); + + assemblyAPI.afterProcess(afterRequest); + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE + 3; + } + +} 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 new file mode 100644 index 000000000..c91e2424f --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPostHook.java @@ -0,0 +1,73 @@ +/* + * 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.rpc.enhancement.plugin.assembly.server; + +import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils; +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.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 org.springframework.core.Ordered; + +/** + * AssemblyServerPostHook. + * + * @author sean yu + */ +public class AssemblyServerPostHook implements EnhancedPlugin { + + private final AssemblyAPI assemblyAPI; + + public AssemblyServerPostHook(AssemblyAPI assemblyAPI) { + this.assemblyAPI = assemblyAPI; + } + + @Override + public EnhancedPluginType getType() { + return EnhancedPluginType.Server.POST; + } + + @Override + public void run(EnhancedPluginContext context) throws Throwable { + AfterRequest afterRequest = new AfterRequest(); + RequestContext requestContext = new AssemblyRequestContext( + context.getRequest(), + new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()), + context.getLocalServiceInstance().getHost() + ); + afterRequest.setRequestContext(requestContext); + AssemblyResponseContext responseContext = new AssemblyResponseContext(context.getResponse()); + responseContext.setRetStatus(PolarisEnhancedPluginUtils.getRetStatusFromRequest(context.getResponse().getHttpHeaders(), context.getResponse().getHttpStatus(), null)); + afterRequest.setResponseContext(responseContext); + + assemblyAPI.afterProcess(afterRequest); + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE + 3; + } + +} 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 new file mode 100644 index 000000000..f40adbd84 --- /dev/null +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/assembly/server/AssemblyServerPreHook.java @@ -0,0 +1,67 @@ +/* + * 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.rpc.enhancement.plugin.assembly.server; + +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.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 org.springframework.core.Ordered; + +/** + * AssemblyServerPreHook. + * + * @author sean yu + */ +public class AssemblyServerPreHook implements EnhancedPlugin { + + private final AssemblyAPI assemblyAPI; + + public AssemblyServerPreHook(AssemblyAPI assemblyAPI) { + this.assemblyAPI = assemblyAPI; + } + + @Override + public EnhancedPluginType getType() { + return EnhancedPluginType.Server.PRE; + } + + @Override + public void run(EnhancedPluginContext context) throws Throwable { + BeforeRequest beforeRequest = new BeforeRequest(); + RequestContext requestContext = new AssemblyRequestContext( + context.getRequest(), + new ServiceKey(MetadataContext.LOCAL_NAMESPACE, context.getLocalServiceInstance().getServiceId()), + context.getLocalServiceInstance().getHost() + ); + beforeRequest.setRequestContext(requestContext); + assemblyAPI.beforeProcess(beforeRequest); + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE + 3; + } + +} diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/reporter/ExceptionPolarisReporter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/reporter/ExceptionPolarisReporter.java index 76c4250b3..22f0db3c1 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/reporter/ExceptionPolarisReporter.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/reporter/ExceptionPolarisReporter.java @@ -20,15 +20,14 @@ package com.tencent.cloud.rpc.enhancement.plugin.reporter; import java.util.Optional; -import com.tencent.cloud.rpc.enhancement.AbstractPolarisReporterAdapter; import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; +import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils; 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.EnhancedRequestContext; import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.api.rpc.ServiceCallResult; -import com.tencent.polaris.client.api.SDKContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,16 +40,17 @@ import org.springframework.core.Ordered; * * @author Haotian Zhang */ -public class ExceptionPolarisReporter extends AbstractPolarisReporterAdapter implements EnhancedPlugin { +public class ExceptionPolarisReporter implements EnhancedPlugin { private static final Logger LOG = LoggerFactory.getLogger(ExceptionPolarisReporter.class); private final ConsumerAPI consumerAPI; - public ExceptionPolarisReporter(RpcEnhancementReporterProperties reporterProperties, - SDKContext context, + private final RpcEnhancementReporterProperties reportProperties; + + public ExceptionPolarisReporter(RpcEnhancementReporterProperties reportProperties, ConsumerAPI consumerAPI) { - super(reporterProperties, context); + this.reportProperties = reportProperties; this.consumerAPI = consumerAPI; } @@ -61,22 +61,24 @@ public class ExceptionPolarisReporter extends AbstractPolarisReporterAdapter imp @Override public EnhancedPluginType getType() { - return EnhancedPluginType.EXCEPTION; + return EnhancedPluginType.Client.EXCEPTION; } @Override public void run(EnhancedPluginContext context) { - if (!super.reportProperties.isEnabled()) { + if (!this.reportProperties.isEnabled()) { return; } EnhancedRequestContext request = context.getRequest(); - ServiceInstance serviceInstance = Optional.ofNullable(context.getServiceInstance()).orElse(new DefaultServiceInstance()); - - ServiceCallResult resultRequest = createServiceCallResult( - serviceInstance.getServiceId(), - serviceInstance.getHost(), - serviceInstance.getPort(), + ServiceInstance callerServiceInstance = Optional.ofNullable(context.getLocalServiceInstance()).orElse(new DefaultServiceInstance()); + ServiceInstance calleeServiceInstance = Optional.ofNullable(context.getTargetServiceInstance()).orElse(new DefaultServiceInstance()); + + ServiceCallResult resultRequest = PolarisEnhancedPluginUtils.createServiceCallResult( + callerServiceInstance.getHost(), + calleeServiceInstance.getServiceId(), + calleeServiceInstance.getHost(), + calleeServiceInstance.getPort(), request.getUrl(), request.getHttpHeaders(), null, diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/reporter/SuccessPolarisReporter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/reporter/SuccessPolarisReporter.java index 4b35396da..3fb613fd3 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/reporter/SuccessPolarisReporter.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/plugin/reporter/SuccessPolarisReporter.java @@ -19,8 +19,8 @@ package com.tencent.cloud.rpc.enhancement.plugin.reporter; import java.util.Optional; -import com.tencent.cloud.rpc.enhancement.AbstractPolarisReporterAdapter; import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; +import com.tencent.cloud.rpc.enhancement.plugin.PolarisEnhancedPluginUtils; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; @@ -28,7 +28,6 @@ import com.tencent.cloud.rpc.enhancement.plugin.EnhancedRequestContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedResponseContext; import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.api.rpc.ServiceCallResult; -import com.tencent.polaris.client.api.SDKContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,16 +40,17 @@ import org.springframework.core.Ordered; * * @author Haotian Zhang */ -public class SuccessPolarisReporter extends AbstractPolarisReporterAdapter implements EnhancedPlugin { +public class SuccessPolarisReporter implements EnhancedPlugin { private static final Logger LOG = LoggerFactory.getLogger(SuccessPolarisReporter.class); private final ConsumerAPI consumerAPI; - public SuccessPolarisReporter(RpcEnhancementReporterProperties properties, - SDKContext context, + private final RpcEnhancementReporterProperties reportProperties; + + public SuccessPolarisReporter(RpcEnhancementReporterProperties reportProperties, ConsumerAPI consumerAPI) { - super(properties, context); + this.reportProperties = reportProperties; this.consumerAPI = consumerAPI; } @@ -61,23 +61,25 @@ public class SuccessPolarisReporter extends AbstractPolarisReporterAdapter imple @Override public EnhancedPluginType getType() { - return EnhancedPluginType.POST; + return EnhancedPluginType.Client.POST; } @Override public void run(EnhancedPluginContext context) { - if (!super.reportProperties.isEnabled()) { + if (!this.reportProperties.isEnabled()) { return; } EnhancedRequestContext request = context.getRequest(); EnhancedResponseContext response = context.getResponse(); - ServiceInstance serviceInstance = Optional.ofNullable(context.getServiceInstance()).orElse(new DefaultServiceInstance()); - - ServiceCallResult resultRequest = createServiceCallResult( - serviceInstance.getServiceId(), - serviceInstance.getHost(), - serviceInstance.getPort(), + ServiceInstance callerServiceInstance = Optional.ofNullable(context.getLocalServiceInstance()).orElse(new DefaultServiceInstance()); + ServiceInstance calleeServiceInstance = Optional.ofNullable(context.getTargetServiceInstance()).orElse(new DefaultServiceInstance()); + + ServiceCallResult resultRequest = PolarisEnhancedPluginUtils.createServiceCallResult( + callerServiceInstance.getHost(), + calleeServiceInstance.getServiceId(), + calleeServiceInstance.getHost(), + calleeServiceInstance.getPort(), request.getUrl(), request.getHttpHeaders(), response.getHttpHeaders(), diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/BlockingLoadBalancerClientAspect.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/BlockingLoadBalancerClientAspect.java deleted file mode 100644 index 418ce4846..000000000 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/BlockingLoadBalancerClientAspect.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.rpc.enhancement.resttemplate; - -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; - -/** - * Intercept for BlockingLoadBalancerClient, put host and port to thread local. - * - * @author lepdou 2022-09-05 - */ -@Aspect -public class BlockingLoadBalancerClientAspect { - - @Pointcut("execution(public * org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient.reconstructURI(..)) ") - public void pointcut() { - - } - - @Around("pointcut()") - public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable { - LoadBalancerClientAspectUtils.extractLoadBalancerResult(joinPoint); - return joinPoint.proceed(); - } -} diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateInterceptor.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateInterceptor.java index e67e241f2..2a4e0f6fc 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateInterceptor.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateInterceptor.java @@ -18,25 +18,21 @@ package com.tencent.cloud.rpc.enhancement.resttemplate; import java.io.IOException; -import java.util.Map; -import com.tencent.cloud.common.constant.HeaderConstant; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedRequestContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedResponseContext; -import org.springframework.cloud.client.DefaultServiceInstance; +import org.springframework.cloud.client.ServiceInstance; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; -import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.EXCEPTION; -import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.FINALLY; -import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.POST; -import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.PRE; +import static com.tencent.cloud.rpc.enhancement.resttemplate.PolarisLoadBalancerRequestTransformer.LOAD_BALANCER_SERVICE_INSTANCE; /** * EnhancedRestTemplateInterceptor. @@ -63,8 +59,13 @@ public class EnhancedRestTemplateInterceptor implements ClientHttpRequestInterce .build(); enhancedPluginContext.setRequest(enhancedRequestContext); + enhancedPluginContext.setLocalServiceInstance(pluginRunner.getLocalServiceInstance()); + enhancedPluginContext.setTargetServiceInstance( + (ServiceInstance) MetadataContextHolder.get().getLoadbalancerMetadata().get(LOAD_BALANCER_SERVICE_INSTANCE)); + // Run pre enhanced plugins. - pluginRunner.run(PRE, enhancedPluginContext); + pluginRunner.run(EnhancedPluginType.Client.PRE, enhancedPluginContext); + long startMillis = System.currentTimeMillis(); try { ClientHttpResponse response = execution.execute(request, body); @@ -76,29 +77,20 @@ public class EnhancedRestTemplateInterceptor implements ClientHttpRequestInterce .build(); enhancedPluginContext.setResponse(enhancedResponseContext); - Map loadBalancerContext = MetadataContextHolder.get().getLoadbalancerMetadata(); - DefaultServiceInstance serviceInstance = new DefaultServiceInstance(); - serviceInstance.setServiceId(request.getURI().getHost()); - serviceInstance.setHost(loadBalancerContext.get(HeaderConstant.INTERNAL_CALLEE_INSTANCE_HOST)); - if (loadBalancerContext.get(HeaderConstant.INTERNAL_CALLEE_INSTANCE_PORT) != null) { - serviceInstance.setPort(Integer.parseInt(loadBalancerContext.get(HeaderConstant.INTERNAL_CALLEE_INSTANCE_PORT))); - } - enhancedPluginContext.setServiceInstance(serviceInstance); - // Run post enhanced plugins. - pluginRunner.run(POST, enhancedPluginContext); + pluginRunner.run(EnhancedPluginType.Client.POST, enhancedPluginContext); return response; } catch (IOException e) { enhancedPluginContext.setDelay(System.currentTimeMillis() - startMillis); enhancedPluginContext.setThrowable(e); // Run exception enhanced plugins. - pluginRunner.run(EXCEPTION, enhancedPluginContext); + pluginRunner.run(EnhancedPluginType.Client.EXCEPTION, enhancedPluginContext); throw e; } finally { // Run finally enhanced plugins. - pluginRunner.run(FINALLY, enhancedPluginContext); + pluginRunner.run(EnhancedPluginType.Client.FINALLY, enhancedPluginContext); } } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/LoadBalancerClientAspectUtils.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/PolarisLoadBalancerRequestTransformer.java similarity index 55% rename from spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/LoadBalancerClientAspectUtils.java rename to spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/PolarisLoadBalancerRequestTransformer.java index 04ffac0cf..961633cfa 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/LoadBalancerClientAspectUtils.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/resttemplate/PolarisLoadBalancerRequestTransformer.java @@ -17,28 +17,36 @@ package com.tencent.cloud.rpc.enhancement.resttemplate; -import com.tencent.cloud.common.constant.HeaderConstant; import com.tencent.cloud.common.metadata.MetadataContextHolder; -import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; +import org.springframework.cloud.client.loadbalancer.LoadBalancerRequestTransformer; +import org.springframework.http.HttpRequest; /** - * Extract load balancer result from {@link LoadBalancerClient} and put to MetadataContext. - * @author lepdou 2022-09-06 + * PolarisLoadBalancerRequestTransformer. + * + * @author sean yu */ -public final class LoadBalancerClientAspectUtils { +public class PolarisLoadBalancerRequestTransformer implements LoadBalancerRequestTransformer { - private LoadBalancerClientAspectUtils() { - } + /** + * LOAD_BALANCER_SERVICE_INSTANCE MetadataContext key. + */ + public static final String LOAD_BALANCER_SERVICE_INSTANCE = "LOAD_BALANCER_SERVICE_INSTANCE"; - public static void extractLoadBalancerResult(ProceedingJoinPoint joinPoint) { - Object server = joinPoint.getArgs()[0]; - if (server instanceof ServiceInstance) { - ServiceInstance instance = (ServiceInstance) server; - MetadataContextHolder.get().setLoadbalancer(HeaderConstant.INTERNAL_CALLEE_INSTANCE_HOST, instance.getHost()); - MetadataContextHolder.get().setLoadbalancer(HeaderConstant.INTERNAL_CALLEE_INSTANCE_PORT, String.valueOf(instance.getPort())); + /** + * Transform Request, add Loadbalancer ServiceInstance to MetadataContext. + * @param request request + * @param instance instance + * @return HttpRequest + */ + @Override + public HttpRequest transformRequest(HttpRequest request, ServiceInstance instance) { + if (instance != null) { + MetadataContextHolder.get().setLoadbalancer(LOAD_BALANCER_SERVICE_INSTANCE, instance); } + return request; } + } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/scg/EnhancedGatewayGlobalFilter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/scg/EnhancedGatewayGlobalFilter.java index bfe816f32..39cd0a608 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/scg/EnhancedGatewayGlobalFilter.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/scg/EnhancedGatewayGlobalFilter.java @@ -19,6 +19,7 @@ package com.tencent.cloud.rpc.enhancement.scg; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedRequestContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedResponseContext; import reactor.core.publisher.Mono; @@ -30,10 +31,6 @@ import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.web.server.ServerWebExchange; -import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.EXCEPTION; -import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.FINALLY; -import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.POST; -import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.PRE; import static org.springframework.cloud.gateway.filter.ReactiveLoadBalancerClientFilter.LOAD_BALANCER_CLIENT_FILTER_ORDER; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_LOADBALANCER_RESPONSE_ATTR; @@ -61,18 +58,18 @@ public class EnhancedGatewayGlobalFilter implements GlobalFilter, Ordered { .build(); enhancedPluginContext.setRequest(enhancedRequestContext); + enhancedPluginContext.setLocalServiceInstance(pluginRunner.getLocalServiceInstance()); + Response serviceInstanceResponse = exchange.getAttribute(GATEWAY_LOADBALANCER_RESPONSE_ATTR); + if (serviceInstanceResponse != null && serviceInstanceResponse.hasServer()) { + ServiceInstance instance = serviceInstanceResponse.getServer(); + enhancedPluginContext.setTargetServiceInstance(instance); + } + // Run pre enhanced plugins. - pluginRunner.run(PRE, enhancedPluginContext); + pluginRunner.run(EnhancedPluginType.Client.PRE, enhancedPluginContext); long startTime = System.currentTimeMillis(); return chain.filter(exchange) - .doOnSubscribe(v -> { - Response serviceInstanceResponse = exchange.getAttribute(GATEWAY_LOADBALANCER_RESPONSE_ATTR); - if (serviceInstanceResponse != null && serviceInstanceResponse.hasServer()) { - ServiceInstance instance = serviceInstanceResponse.getServer(); - enhancedPluginContext.setServiceInstance(instance); - } - }) .doOnSuccess(v -> { enhancedPluginContext.setDelay(System.currentTimeMillis() - startTime); EnhancedResponseContext enhancedResponseContext = EnhancedResponseContext.builder() @@ -82,18 +79,18 @@ public class EnhancedGatewayGlobalFilter implements GlobalFilter, Ordered { enhancedPluginContext.setResponse(enhancedResponseContext); // Run post enhanced plugins. - pluginRunner.run(POST, enhancedPluginContext); + pluginRunner.run(EnhancedPluginType.Client.POST, enhancedPluginContext); }) .doOnError(t -> { enhancedPluginContext.setDelay(System.currentTimeMillis() - startTime); enhancedPluginContext.setThrowable(t); // Run exception enhanced plugins. - pluginRunner.run(EXCEPTION, enhancedPluginContext); + pluginRunner.run(EnhancedPluginType.Client.EXCEPTION, enhancedPluginContext); }) .doFinally(v -> { // Run finally enhanced plugins. - pluginRunner.run(FINALLY, enhancedPluginContext); + pluginRunner.run(EnhancedPluginType.Client.FINALLY, enhancedPluginContext); }); } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/webclient/EnhancedWebClientReporter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/webclient/EnhancedWebClientExchangeFilterFunction.java similarity index 68% rename from spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/webclient/EnhancedWebClientReporter.java rename to spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/webclient/EnhancedWebClientExchangeFilterFunction.java index 2b62fc5d0..2d5577fc2 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/webclient/EnhancedWebClientReporter.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/webclient/EnhancedWebClientExchangeFilterFunction.java @@ -17,35 +17,31 @@ package com.tencent.cloud.rpc.enhancement.webclient; -import java.util.Map; - -import com.tencent.cloud.common.constant.HeaderConstant; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner; +import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedRequestContext; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedResponseContext; import reactor.core.publisher.Mono; -import org.springframework.cloud.client.DefaultServiceInstance; +import org.springframework.cloud.client.ServiceInstance; import org.springframework.web.reactive.function.client.ClientRequest; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.reactive.function.client.ExchangeFilterFunction; import org.springframework.web.reactive.function.client.ExchangeFunction; -import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.EXCEPTION; -import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.FINALLY; -import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.POST; +import static com.tencent.cloud.rpc.enhancement.resttemplate.PolarisLoadBalancerRequestTransformer.LOAD_BALANCER_SERVICE_INSTANCE; /** - * EnhancedWebClientReporter. + * EnhancedWebClientExchangeFilterFunction. * * @author sean yu */ -public class EnhancedWebClientReporter implements ExchangeFilterFunction { +public class EnhancedWebClientExchangeFilterFunction implements ExchangeFilterFunction { private final EnhancedPluginRunner pluginRunner; - public EnhancedWebClientReporter(EnhancedPluginRunner pluginRunner) { + public EnhancedWebClientExchangeFilterFunction(EnhancedPluginRunner pluginRunner) { this.pluginRunner = pluginRunner; } @@ -60,38 +56,37 @@ public class EnhancedWebClientReporter implements ExchangeFilterFunction { .build(); enhancedPluginContext.setRequest(enhancedRequestContext); + enhancedPluginContext.setLocalServiceInstance(pluginRunner.getLocalServiceInstance()); + enhancedPluginContext.setTargetServiceInstance( + (ServiceInstance) MetadataContextHolder.get().getLoadbalancerMetadata().get(LOAD_BALANCER_SERVICE_INSTANCE)); + + // Run post enhanced plugins. + pluginRunner.run(EnhancedPluginType.Client.PRE, enhancedPluginContext); + long startTime = System.currentTimeMillis(); return next.exchange(request) - .doOnSubscribe(subscription -> { - Map loadBalancerContext = MetadataContextHolder.get().getLoadbalancerMetadata(); - DefaultServiceInstance serviceInstance = new DefaultServiceInstance(); - serviceInstance.setServiceId(loadBalancerContext.get(HeaderConstant.INTERNAL_CALLEE_SERVICE_ID)); - serviceInstance.setHost(request.url().getHost()); - serviceInstance.setPort(request.url().getPort()); - enhancedPluginContext.setServiceInstance(serviceInstance); - }) .doOnSuccess(response -> { enhancedPluginContext.setDelay(System.currentTimeMillis() - startTime); EnhancedResponseContext enhancedResponseContext = EnhancedResponseContext.builder() - .httpStatus(response.rawStatusCode()) + .httpStatus(response.statusCode().value()) .httpHeaders(response.headers().asHttpHeaders()) .build(); enhancedPluginContext.setResponse(enhancedResponseContext); // Run post enhanced plugins. - pluginRunner.run(POST, enhancedPluginContext); + pluginRunner.run(EnhancedPluginType.Client.POST, enhancedPluginContext); }) .doOnError(t -> { enhancedPluginContext.setDelay(System.currentTimeMillis() - startTime); enhancedPluginContext.setThrowable(t); // Run exception enhanced plugins. - pluginRunner.run(EXCEPTION, enhancedPluginContext); + pluginRunner.run(EnhancedPluginType.Client.EXCEPTION, enhancedPluginContext); }) .doFinally(v -> { // Run finally enhanced plugins. - pluginRunner.run(FINALLY, enhancedPluginContext); + pluginRunner.run(EnhancedPluginType.Client.FINALLY, enhancedPluginContext); }); } } diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/webclient/PolarisLoadBalancerClientRequestTransformer.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/webclient/PolarisLoadBalancerClientRequestTransformer.java index 4e6913164..be1807ff0 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/webclient/PolarisLoadBalancerClientRequestTransformer.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/webclient/PolarisLoadBalancerClientRequestTransformer.java @@ -17,13 +17,14 @@ package com.tencent.cloud.rpc.enhancement.webclient; -import com.tencent.cloud.common.constant.HeaderConstant; import com.tencent.cloud.common.metadata.MetadataContextHolder; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerClientRequestTransformer; import org.springframework.web.reactive.function.client.ClientRequest; +import static com.tencent.cloud.rpc.enhancement.resttemplate.PolarisLoadBalancerRequestTransformer.LOAD_BALANCER_SERVICE_INSTANCE; + /** * PolarisLoadBalancerClientRequestTransformer. * @@ -31,10 +32,16 @@ import org.springframework.web.reactive.function.client.ClientRequest; */ public class PolarisLoadBalancerClientRequestTransformer implements LoadBalancerClientRequestTransformer { + /** + * Transform Request, add Loadbalancer ServiceInstance to MetadataContext. + * @param request request + * @param instance instance + * @return HttpRequest + */ @Override public ClientRequest transformRequest(ClientRequest request, ServiceInstance instance) { if (instance != null) { - MetadataContextHolder.get().setLoadbalancer(HeaderConstant.INTERNAL_CALLEE_SERVICE_ID, instance.getServiceId()); + MetadataContextHolder.get().setLoadbalancer(LOAD_BALANCER_SERVICE_INSTANCE, instance); } return request; } diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignBlockingLoadBalancerClientTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignBlockingLoadBalancerClientTest.java index bcca3df89..d22e255ba 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignBlockingLoadBalancerClientTest.java +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignBlockingLoadBalancerClientTest.java @@ -30,6 +30,6 @@ public class EnhancedFeignBlockingLoadBalancerClientTest { @Test public void testConstructor() { - assertThatCode(() -> new EnhancedFeignBlockingLoadBalancerClient(null, null, null)).doesNotThrowAnyException(); + assertThatCode(() -> new EnhancedFeignBlockingLoadBalancerClient(null, null, null, null)).doesNotThrowAnyException(); } } diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignClientTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignClientTest.java index 2ff9ff909..67ffd2ddd 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignClientTest.java +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/feign/EnhancedFeignClientTest.java @@ -26,6 +26,7 @@ import com.tencent.cloud.rpc.enhancement.plugin.DefaultEnhancedPluginRunner; 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.polaris.client.api.SDKContext; import feign.Client; import feign.Request; import feign.RequestTemplate; @@ -34,8 +35,10 @@ import feign.Target; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.test.context.junit.jupiter.SpringExtension; import static org.assertj.core.api.Assertions.assertThat; @@ -55,6 +58,9 @@ import static org.mockito.Mockito.mock; properties = {"spring.cloud.polaris.namespace=Test", "spring.cloud.polaris.service=TestApp", "spring.cloud.gateway.enabled=false"}) public class EnhancedFeignClientTest { + @Autowired + private SDKContext sdkContext; + @Test public void testConstructor() { try { @@ -75,7 +81,7 @@ public class EnhancedFeignClientTest { List enhancedPlugins = getMockEnhancedFeignPlugins(); try { - new EnhancedFeignClient(mock(Client.class), new DefaultEnhancedPluginRunner(enhancedPlugins)); + new EnhancedFeignClient(mock(Client.class), new DefaultEnhancedPluginRunner(enhancedPlugins, null, sdkContext)); } catch (Throwable e) { fail("Exception encountered.", e); @@ -104,7 +110,7 @@ public class EnhancedFeignClientTest { RequestTemplate requestTemplate = new RequestTemplate(); requestTemplate.feignTarget(target); - EnhancedFeignClient polarisFeignClient = new EnhancedFeignClient(delegate, new DefaultEnhancedPluginRunner(getMockEnhancedFeignPlugins())); + EnhancedFeignClient polarisFeignClient = new EnhancedFeignClient(delegate, new DefaultEnhancedPluginRunner(getMockEnhancedFeignPlugins(), null, sdkContext)); // 200 Response response = polarisFeignClient.execute(Request.create(Request.HttpMethod.GET, "http://localhost:8080/test", @@ -134,7 +140,7 @@ public class EnhancedFeignClientTest { enhancedPlugins.add(new EnhancedPlugin() { @Override public EnhancedPluginType getType() { - return EnhancedPluginType.PRE; + return EnhancedPluginType.Client.PRE; } @Override @@ -156,7 +162,7 @@ public class EnhancedFeignClientTest { enhancedPlugins.add(new EnhancedPlugin() { @Override public EnhancedPluginType getType() { - return EnhancedPluginType.POST; + return EnhancedPluginType.Client.POST; } @Override @@ -178,7 +184,7 @@ public class EnhancedFeignClientTest { enhancedPlugins.add(new EnhancedPlugin() { @Override public EnhancedPluginType getType() { - return EnhancedPluginType.EXCEPTION; + return EnhancedPluginType.Client.EXCEPTION; } @Override @@ -200,7 +206,7 @@ public class EnhancedFeignClientTest { enhancedPlugins.add(new EnhancedPlugin() { @Override public EnhancedPluginType getType() { - return EnhancedPluginType.FINALLY; + return EnhancedPluginType.Client.FINALLY; } @Override diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginContextTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginContextTest.java index a516483f1..84ca2525c 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginContextTest.java +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/EnhancedPluginContextTest.java @@ -111,24 +111,24 @@ public class EnhancedPluginContextTest { EnhancedPluginContext enhancedPluginContext = new EnhancedPluginContext(); enhancedPluginContext.setRequest(requestContext); enhancedPluginContext.setResponse(responseContext); - enhancedPluginContext.setServiceInstance(new DefaultServiceInstance()); + enhancedPluginContext.setTargetServiceInstance(new DefaultServiceInstance()); enhancedPluginContext.setThrowable(mock(Exception.class)); enhancedPluginContext.setDelay(0); assertThat(enhancedPluginContext.getRequest()).isNotNull(); assertThat(enhancedPluginContext.getResponse()).isNotNull(); - assertThat(enhancedPluginContext.getServiceInstance()).isNotNull(); + assertThat(enhancedPluginContext.getTargetServiceInstance()).isNotNull(); assertThat(enhancedPluginContext.getThrowable()).isNotNull(); assertThat(enhancedPluginContext.getDelay()).isNotNull(); - EnhancedPlugin enhancedPlugin = new SuccessPolarisReporter(reporterProperties, sdkContext, consumerAPI); - EnhancedPlugin enhancedPlugin1 = new ExceptionPolarisReporter(reporterProperties, sdkContext, consumerAPI); - EnhancedPluginRunner enhancedPluginRunner = new DefaultEnhancedPluginRunner(Arrays.asList(enhancedPlugin, enhancedPlugin1)); - enhancedPluginRunner.run(EnhancedPluginType.POST, enhancedPluginContext); + EnhancedPlugin enhancedPlugin = new SuccessPolarisReporter(reporterProperties, consumerAPI); + EnhancedPlugin enhancedPlugin1 = new ExceptionPolarisReporter(reporterProperties, consumerAPI); + EnhancedPluginRunner enhancedPluginRunner = new DefaultEnhancedPluginRunner(Arrays.asList(enhancedPlugin, enhancedPlugin1), null, sdkContext); + enhancedPluginRunner.run(EnhancedPluginType.Client.POST, enhancedPluginContext); EnhancedPlugin enhancedPlugin2 = mock(EnhancedPlugin.class); doThrow(new RuntimeException()).when(enhancedPlugin2).run(any()); - doReturn(EnhancedPluginType.POST).when(enhancedPlugin2).getType(); - enhancedPluginRunner = new DefaultEnhancedPluginRunner(Arrays.asList(enhancedPlugin2)); - enhancedPluginRunner.run(EnhancedPluginType.POST, enhancedPluginContext); + doReturn(EnhancedPluginType.Client.POST).when(enhancedPlugin2).getType(); + enhancedPluginRunner = new DefaultEnhancedPluginRunner(Arrays.asList(enhancedPlugin2), null, sdkContext); + enhancedPluginRunner.run(EnhancedPluginType.Client.POST, enhancedPluginContext); } } diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/ExceptionPolarisReporterTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/ExceptionPolarisReporterTest.java index 21c61ef92..7e1fcde61 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/ExceptionPolarisReporterTest.java +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/ExceptionPolarisReporterTest.java @@ -95,7 +95,7 @@ public class ExceptionPolarisReporterTest { @Test public void testType() { - assertThat(exceptionPolarisReporter.getType()).isEqualTo(EnhancedPluginType.EXCEPTION); + assertThat(exceptionPolarisReporter.getType()).isEqualTo(EnhancedPluginType.Client.EXCEPTION); } @Test @@ -132,7 +132,7 @@ public class ExceptionPolarisReporterTest { pluginContext.setRequest(request); pluginContext.setResponse(response); - pluginContext.setServiceInstance(serviceInstance); + pluginContext.setTargetServiceInstance(serviceInstance); pluginContext.setThrowable(new RuntimeException()); exceptionPolarisReporter.run(pluginContext); diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/AbstractPolarisReporterAdapterTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/PolarisEnhancedPluginUtilsTest.java similarity index 71% rename from spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/AbstractPolarisReporterAdapterTest.java rename to spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/PolarisEnhancedPluginUtilsTest.java index 825da246f..46a6556b5 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/AbstractPolarisReporterAdapterTest.java +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/PolarisEnhancedPluginUtilsTest.java @@ -15,7 +15,7 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.rpc.enhancement; +package com.tencent.cloud.rpc.enhancement.plugin; import java.net.SocketTimeoutException; import java.net.URI; @@ -54,12 +54,12 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; /** - * Test For {@link AbstractPolarisReporterAdapter}. + * Test For {@link PolarisEnhancedPluginUtils}. * * @author Elve.Xu 2022/7/11 */ @ExtendWith(MockitoExtension.class) -public class AbstractPolarisReporterAdapterTest { +public class PolarisEnhancedPluginUtilsTest { private static MockedStatic mockedApplicationContextAwareUtils; private final RpcEnhancementReporterProperties reporterProperties = new RpcEnhancementReporterProperties(); @@ -97,14 +97,13 @@ public class AbstractPolarisReporterAdapterTest { doReturn(configuration).when(sdkContext).getConfig(); - SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(reporterProperties, sdkContext); - ServiceCallResult serviceCallResult; HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.add(RouterConstant.ROUTER_LABEL_HEADER, "{\"k1\":\"v1\"}"); - serviceCallResult = adapter.createServiceCallResult( + serviceCallResult = PolarisEnhancedPluginUtils.createServiceCallResult( + "0.0.0.0", "test", null, null, @@ -117,7 +116,8 @@ public class AbstractPolarisReporterAdapterTest { ); assertThat(serviceCallResult.getRetStatus()).isEqualTo(RetStatus.RetSuccess); - serviceCallResult = adapter.createServiceCallResult( + serviceCallResult = PolarisEnhancedPluginUtils.createServiceCallResult( + "0.0.0.0", "test", null, null, @@ -130,7 +130,8 @@ public class AbstractPolarisReporterAdapterTest { ); assertThat(serviceCallResult.getRetStatus()).isEqualTo(RetStatus.RetFail); - serviceCallResult = adapter.createServiceCallResult( + serviceCallResult = PolarisEnhancedPluginUtils.createServiceCallResult( + "0.0.0.0", "test", null, null, @@ -143,7 +144,8 @@ public class AbstractPolarisReporterAdapterTest { ); assertThat(serviceCallResult.getRetStatus()).isEqualTo(RetStatus.RetTimeout); - serviceCallResult = adapter.createServiceCallResult( + serviceCallResult = PolarisEnhancedPluginUtils.createServiceCallResult( + "0.0.0.0", "test", "0.0.0.0", 8080, @@ -162,11 +164,9 @@ public class AbstractPolarisReporterAdapterTest { @Test public void testResourceStat() throws URISyntaxException { - SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(reporterProperties, sdkContext); - ResourceStat resourceStat; - resourceStat = adapter.createInstanceResourceStat("test", + resourceStat = PolarisEnhancedPluginUtils.createInstanceResourceStat("test", null, null, new URI("http://0.0.0.0/"), @@ -176,7 +176,7 @@ public class AbstractPolarisReporterAdapterTest { ); assertThat(resourceStat.getRetStatus()).isEqualTo(RetStatus.RetSuccess); - resourceStat = adapter.createInstanceResourceStat("test", + resourceStat = PolarisEnhancedPluginUtils.createInstanceResourceStat("test", null, null, new URI("http://0.0.0.0/"), @@ -186,7 +186,7 @@ public class AbstractPolarisReporterAdapterTest { ); assertThat(resourceStat.getRetStatus()).isEqualTo(RetStatus.RetTimeout); - resourceStat = adapter.createInstanceResourceStat("test", + resourceStat = PolarisEnhancedPluginUtils.createInstanceResourceStat("test", null, null, new URI("http://0.0.0.0/"), @@ -200,13 +200,11 @@ public class AbstractPolarisReporterAdapterTest { @Test public void testApplyWithDefaultConfig() { RpcEnhancementReporterProperties properties = new RpcEnhancementReporterProperties(); - // Mock Condition - SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties, sdkContext); // Assert - assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); - assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); - assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.OK)).isEqualTo(false); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); } @Test @@ -216,12 +214,10 @@ public class AbstractPolarisReporterAdapterTest { properties.getStatuses().clear(); properties.setIgnoreInternalServerError(false); - SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties, sdkContext); - // Assert - assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); - assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(true); - assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.OK)).isEqualTo(false); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(true); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); } @Test @@ -231,12 +227,10 @@ public class AbstractPolarisReporterAdapterTest { properties.getStatuses().clear(); properties.setIgnoreInternalServerError(true); - SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties, sdkContext); - // Assert - assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); - assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); - assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.OK)).isEqualTo(false); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); } @Test @@ -246,12 +240,10 @@ public class AbstractPolarisReporterAdapterTest { properties.getStatuses().clear(); properties.getSeries().clear(); - SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties, sdkContext); - // Assert - assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); - assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); - assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.OK)).isEqualTo(false); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); } @Test @@ -262,13 +254,11 @@ public class AbstractPolarisReporterAdapterTest { properties.getSeries().clear(); properties.getSeries().add(HttpStatus.Series.CLIENT_ERROR); - SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties, sdkContext); - // Assert - assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); - assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); - assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(false); - assertThat(adapter.apply(HttpStatus.FORBIDDEN)).isEqualTo(true); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.OK)).isEqualTo(false); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(false); + assertThat(PolarisEnhancedPluginUtils.apply(HttpStatus.FORBIDDEN)).isEqualTo(true); } @@ -280,18 +270,16 @@ public class AbstractPolarisReporterAdapterTest { properties.getSeries().clear(); properties.getSeries().add(HttpStatus.Series.CLIENT_ERROR); - SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties, sdkContext); - HttpHeaders headers = new HttpHeaders(); - RetStatus ret = adapter.getRetStatusFromRequest(headers, RetStatus.RetFail); + RetStatus ret = PolarisEnhancedPluginUtils.getRetStatusFromRequest(headers, RetStatus.RetFail); assertThat(ret).isEqualTo(RetStatus.RetFail); headers.set(HeaderConstant.INTERNAL_CALLEE_RET_STATUS, RetStatus.RetFlowControl.getDesc()); - ret = adapter.getRetStatusFromRequest(headers, RetStatus.RetFail); + ret = PolarisEnhancedPluginUtils.getRetStatusFromRequest(headers, RetStatus.RetFail); assertThat(ret).isEqualTo(RetStatus.RetFlowControl); headers.set(HeaderConstant.INTERNAL_CALLEE_RET_STATUS, RetStatus.RetReject.getDesc()); - ret = adapter.getRetStatusFromRequest(headers, RetStatus.RetFail); + ret = PolarisEnhancedPluginUtils.getRetStatusFromRequest(headers, RetStatus.RetFail); assertThat(ret).isEqualTo(RetStatus.RetReject); } @@ -303,24 +291,13 @@ public class AbstractPolarisReporterAdapterTest { properties.getSeries().clear(); properties.getSeries().add(HttpStatus.Series.CLIENT_ERROR); - SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties, sdkContext); - HttpHeaders headers = new HttpHeaders(); - String ruleName = adapter.getActiveRuleNameFromRequest(headers); + String ruleName = PolarisEnhancedPluginUtils.getActiveRuleNameFromRequest(headers); assertThat(ruleName).isEqualTo(""); headers.set(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME, "mock_rule"); - ruleName = adapter.getActiveRuleNameFromRequest(headers); + ruleName = PolarisEnhancedPluginUtils.getActiveRuleNameFromRequest(headers); assertThat(ruleName).isEqualTo("mock_rule"); } - /** - * Simple Polaris CircuitBreak Adapter Implements . - */ - public static class SimplePolarisReporterAdapter extends AbstractPolarisReporterAdapter { - - protected SimplePolarisReporterAdapter(RpcEnhancementReporterProperties reportProperties, SDKContext context) { - super(reportProperties, context); - } - } } diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/SuccessPolarisReporterTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/SuccessPolarisReporterTest.java index 9af4ca019..aaa27df41 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/SuccessPolarisReporterTest.java +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/plugin/SuccessPolarisReporterTest.java @@ -93,7 +93,7 @@ public class SuccessPolarisReporterTest { @Test public void testType() { - assertThat(successPolarisReporter.getType()).isEqualTo(EnhancedPluginType.POST); + assertThat(successPolarisReporter.getType()).isEqualTo(EnhancedPluginType.Client.POST); } @Test @@ -129,7 +129,7 @@ public class SuccessPolarisReporterTest { pluginContext.setRequest(request); pluginContext.setResponse(response); - pluginContext.setServiceInstance(serviceInstance); + pluginContext.setTargetServiceInstance(serviceInstance); successPolarisReporter.run(pluginContext); successPolarisReporter.getOrder(); diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/BlockingLoadBalancerClientAspectTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/BlockingLoadBalancerClientAspectTest.java deleted file mode 100644 index 82bf173ba..000000000 --- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/BlockingLoadBalancerClientAspectTest.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * 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.rpc.enhancement.resttemplate; - -import com.tencent.cloud.common.constant.HeaderConstant; -import com.tencent.cloud.common.metadata.MetadataContext; -import com.tencent.cloud.common.metadata.MetadataContextHolder; -import com.tencent.cloud.common.metadata.StaticMetadataManager; -import com.tencent.cloud.common.metadata.config.MetadataLocalProperties; -import com.tencent.cloud.common.util.ApplicationContextAwareUtils; -import org.aspectj.lang.ProceedingJoinPoint; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.MockedStatic; -import org.mockito.Mockito; -import org.mockito.junit.jupiter.MockitoExtension; - -import org.springframework.cloud.client.ServiceInstance; -import org.springframework.context.ApplicationContext; - -import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST; -import static com.tencent.polaris.test.common.Consts.SERVICE_PROVIDER; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; - -@ExtendWith(MockitoExtension.class) -public class BlockingLoadBalancerClientAspectTest { - - private static MockedStatic mockedApplicationContextAwareUtils; - @Mock - private ProceedingJoinPoint proceedingJoinPoint; - - private BlockingLoadBalancerClientAspect aspect = new BlockingLoadBalancerClientAspect(); - - @BeforeAll - static void beforeAll() { - mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class); - mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString())) - .thenReturn("unit-test"); - ApplicationContext applicationContext = mock(ApplicationContext.class); - MetadataLocalProperties metadataLocalProperties = mock(MetadataLocalProperties.class); - StaticMetadataManager staticMetadataManager = mock(StaticMetadataManager.class); - doReturn(metadataLocalProperties).when(applicationContext).getBean(MetadataLocalProperties.class); - doReturn(staticMetadataManager).when(applicationContext).getBean(StaticMetadataManager.class); - mockedApplicationContextAwareUtils.when(ApplicationContextAwareUtils::getApplicationContext).thenReturn(applicationContext); - } - - @AfterAll - static void afterAll() { - mockedApplicationContextAwareUtils.close(); - } - - @BeforeEach - void setUp() { - MetadataContext.LOCAL_NAMESPACE = NAMESPACE_TEST; - MetadataContext.LOCAL_SERVICE = SERVICE_PROVIDER; - } - - @Test - public void test() throws Throwable { - ServiceInstance serviceInstance = mock(ServiceInstance.class); - doReturn("0.0.0.0").when(serviceInstance).getHost(); - doReturn(80).when(serviceInstance).getPort(); - doReturn(new Object[]{ serviceInstance }).when(proceedingJoinPoint).getArgs(); - aspect.invoke(proceedingJoinPoint); - aspect.pointcut(); - assertThat(MetadataContextHolder.get().getLoadbalancerMetadata().get(HeaderConstant.INTERNAL_CALLEE_INSTANCE_HOST)).isEqualTo("0.0.0.0"); - assertThat(MetadataContextHolder.get().getLoadbalancerMetadata().get(HeaderConstant.INTERNAL_CALLEE_INSTANCE_PORT)).isEqualTo("80"); - } - -} diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateInterceptorTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateInterceptorTest.java index 6b256f014..de29a5bc4 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateInterceptorTest.java +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/resttemplate/EnhancedRestTemplateInterceptorTest.java @@ -40,6 +40,7 @@ import org.mockito.MockedStatic; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.context.ApplicationContext; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -109,7 +110,7 @@ public class EnhancedRestTemplateInterceptorTest { doReturn(mockHttpHeaders).when(mockHttpRequest).getHeaders(); doReturn(mockClientHttpResponse).when(mockClientHttpRequestExecution).execute(mockHttpRequest, inputBody); - EnhancedRestTemplateInterceptor reporter = new EnhancedRestTemplateInterceptor(new DefaultEnhancedPluginRunner(new ArrayList<>())); + EnhancedRestTemplateInterceptor reporter = new EnhancedRestTemplateInterceptor(new DefaultEnhancedPluginRunner(new ArrayList<>(), null, sdkContext)); actualResult = reporter.intercept(mockHttpRequest, inputBody, mockClientHttpRequestExecution); assertThat(actualResult).isEqualTo(mockClientHttpResponse); diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/scg/EnhancedGatewayGlobalFilterTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/scg/EnhancedGatewayGlobalFilterTest.java index 6d5e8816d..06f599557 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/scg/EnhancedGatewayGlobalFilterTest.java +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/scg/EnhancedGatewayGlobalFilterTest.java @@ -39,6 +39,7 @@ import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import reactor.core.publisher.Mono; +import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.Response; import org.springframework.cloud.gateway.filter.GatewayFilterChain; @@ -123,7 +124,7 @@ public class EnhancedGatewayGlobalFilterTest { doReturn(request).when(exchange).getRequest(); doReturn(response).when(exchange).getResponse(); - EnhancedGatewayGlobalFilter reporter = new EnhancedGatewayGlobalFilter(new DefaultEnhancedPluginRunner(new ArrayList<>())); + EnhancedGatewayGlobalFilter reporter = new EnhancedGatewayGlobalFilter(new DefaultEnhancedPluginRunner(new ArrayList<>(), null, sdkContext)); reporter.getOrder(); reporter.filter(exchange, chain).block(); diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/webclient/EnhancedWebClientReporterTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/webclient/EnhancedWebClientExchangeFilterFunctionTest.java similarity index 94% rename from spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/webclient/EnhancedWebClientReporterTest.java rename to spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/webclient/EnhancedWebClientExchangeFilterFunctionTest.java index f8a4a673a..903455dca 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/webclient/EnhancedWebClientReporterTest.java +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/webclient/EnhancedWebClientExchangeFilterFunctionTest.java @@ -39,6 +39,7 @@ import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import reactor.core.publisher.Mono; +import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.context.ApplicationContext; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -56,7 +57,7 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @ExtendWith(MockitoExtension.class) -public class EnhancedWebClientReporterTest { +public class EnhancedWebClientExchangeFilterFunctionTest { private static MockedStatic mockedApplicationContextAwareUtils; @Mock @@ -103,7 +104,7 @@ public class EnhancedWebClientReporterTest { doReturn(headers).when(clientResponse).headers(); doReturn(Mono.just(clientResponse)).when(exchangeFunction).exchange(any()); - EnhancedWebClientReporter reporter = new EnhancedWebClientReporter(new DefaultEnhancedPluginRunner(new ArrayList<>())); + EnhancedWebClientExchangeFilterFunction reporter = new EnhancedWebClientExchangeFilterFunction(new DefaultEnhancedPluginRunner(new ArrayList<>(), null, sdkContext)); ClientResponse clientResponse1 = reporter.filter(clientRequest, exchangeFunction).block(); assertThat(clientResponse1).isEqualTo(clientResponse);