refactor scg and webclient

pull/962/head
seanyu 2 years ago
parent 02f04d7d0a
commit 4416b9a290

@ -29,7 +29,7 @@ import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner;
import com.tencent.cloud.rpc.enhancement.plugin.reporter.ExceptionPolarisReporter; import com.tencent.cloud.rpc.enhancement.plugin.reporter.ExceptionPolarisReporter;
import com.tencent.cloud.rpc.enhancement.plugin.reporter.SuccessPolarisReporter; import com.tencent.cloud.rpc.enhancement.plugin.reporter.SuccessPolarisReporter;
import com.tencent.cloud.rpc.enhancement.resttemplate.BlockingLoadBalancerClientAspect; import com.tencent.cloud.rpc.enhancement.resttemplate.BlockingLoadBalancerClientAspect;
import com.tencent.cloud.rpc.enhancement.resttemplate.EnhancedRestTemplate; import com.tencent.cloud.rpc.enhancement.resttemplate.EnhancedRestTemplateInterceptor;
import com.tencent.cloud.rpc.enhancement.scg.EnhancedGatewayGlobalFilter; import com.tencent.cloud.rpc.enhancement.scg.EnhancedGatewayGlobalFilter;
import com.tencent.cloud.rpc.enhancement.webclient.EnhancedWebClientReporter; import com.tencent.cloud.rpc.enhancement.webclient.EnhancedWebClientReporter;
import com.tencent.cloud.rpc.enhancement.webclient.PolarisLoadBalancerClientRequestTransformer; import com.tencent.cloud.rpc.enhancement.webclient.PolarisLoadBalancerClientRequestTransformer;
@ -120,12 +120,12 @@ public class RpcEnhancementAutoConfiguration {
private List<RestTemplate> restTemplates = Collections.emptyList(); private List<RestTemplate> restTemplates = Collections.emptyList();
@Bean @Bean
public EnhancedRestTemplate enhancedPolarisRestTemplateReporter(@Lazy EnhancedPluginRunner pluginRunner) { public EnhancedRestTemplateInterceptor enhancedPolarisRestTemplateReporter(@Lazy EnhancedPluginRunner pluginRunner) {
return new EnhancedRestTemplate(pluginRunner); return new EnhancedRestTemplateInterceptor(pluginRunner);
} }
@Bean @Bean
public SmartInitializingSingleton setPolarisReporterForRestTemplate(EnhancedRestTemplate reporter) { public SmartInitializingSingleton setPolarisReporterForRestTemplate(EnhancedRestTemplateInterceptor reporter) {
return () -> { return () -> {
for (RestTemplate restTemplate : restTemplates) { for (RestTemplate restTemplate : restTemplates) {
restTemplate.getInterceptors().add(reporter); restTemplate.getInterceptors().add(reporter);

@ -39,15 +39,15 @@ 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.plugin.EnhancedPluginType.PRE;
/** /**
* EnhancedRestTemplate. * EnhancedRestTemplateInterceptor.
* *
* @author sean yu * @author sean yu
*/ */
public class EnhancedRestTemplate implements ClientHttpRequestInterceptor { public class EnhancedRestTemplateInterceptor implements ClientHttpRequestInterceptor {
private final EnhancedPluginRunner pluginRunner; private final EnhancedPluginRunner pluginRunner;
public EnhancedRestTemplate(EnhancedPluginRunner pluginRunner) { public EnhancedRestTemplateInterceptor(EnhancedPluginRunner pluginRunner) {
this.pluginRunner = pluginRunner; this.pluginRunner = pluginRunner;
} }

@ -34,7 +34,7 @@ import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.EXCEPT
import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.FINALLY; 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.POST;
import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.PRE; import static com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType.PRE;
import static org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter.ROUTE_TO_URL_FILTER_ORDER; 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; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_LOADBALANCER_RESPONSE_ATTR;
/** /**
@ -66,35 +66,28 @@ public class EnhancedGatewayGlobalFilter implements GlobalFilter, Ordered {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
return chain.filter(exchange) return chain.filter(exchange)
.doOnSubscribe(v -> {
Response<ServiceInstance> serviceInstanceResponse = exchange.getAttribute(GATEWAY_LOADBALANCER_RESPONSE_ATTR);
if (serviceInstanceResponse != null && serviceInstanceResponse.hasServer()) {
ServiceInstance instance = serviceInstanceResponse.getServer();
enhancedPluginContext.setServiceInstance(instance);
}
})
.doOnSuccess(v -> { .doOnSuccess(v -> {
enhancedPluginContext.setDelay(System.currentTimeMillis() - startTime); enhancedPluginContext.setDelay(System.currentTimeMillis() - startTime);
EnhancedResponseContext enhancedResponseContext = EnhancedResponseContext.builder() EnhancedResponseContext enhancedResponseContext = EnhancedResponseContext.builder()
.httpStatus(exchange.getResponse().getRawStatusCode()) .httpStatus(exchange.getResponse().getRawStatusCode())
.httpHeaders(exchange.getResponse().getHeaders()) .httpHeaders(exchange.getResponse().getHeaders())
.build(); .build();
enhancedPluginContext.setResponse(enhancedResponseContext); enhancedPluginContext.setResponse(enhancedResponseContext);
Response<ServiceInstance> serviceInstanceResponse = exchange.getAttribute(GATEWAY_LOADBALANCER_RESPONSE_ATTR);
if (serviceInstanceResponse != null && serviceInstanceResponse.hasServer()) {
ServiceInstance instance = serviceInstanceResponse.getServer();
enhancedPluginContext.setServiceInstance(instance);
}
// Run post enhanced plugins. // Run post enhanced plugins.
pluginRunner.run(POST, enhancedPluginContext); pluginRunner.run(POST, enhancedPluginContext);
}) })
.doOnError(t -> { .doOnError(t -> {
enhancedPluginContext.setDelay(System.currentTimeMillis() - startTime); enhancedPluginContext.setDelay(System.currentTimeMillis() - startTime);
enhancedPluginContext.setThrowable(t); enhancedPluginContext.setThrowable(t);
Response<ServiceInstance> serviceInstanceResponse = exchange.getAttribute(GATEWAY_LOADBALANCER_RESPONSE_ATTR);
if (serviceInstanceResponse != null && serviceInstanceResponse.hasServer()) {
ServiceInstance instance = serviceInstanceResponse.getServer();
enhancedPluginContext.setServiceInstance(instance);
}
// Run exception enhanced plugins. // Run exception enhanced plugins.
pluginRunner.run(EXCEPTION, enhancedPluginContext); pluginRunner.run(EXCEPTION, enhancedPluginContext);
}) })
@ -106,6 +99,6 @@ public class EnhancedGatewayGlobalFilter implements GlobalFilter, Ordered {
@Override @Override
public int getOrder() { public int getOrder() {
return ROUTE_TO_URL_FILTER_ORDER + 1; return LOAD_BALANCER_CLIENT_FILTER_ORDER + 1;
} }
} }

@ -62,6 +62,14 @@ public class EnhancedWebClientReporter implements ExchangeFilterFunction {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
return next.exchange(request) return next.exchange(request)
.doOnSubscribe(subscription -> {
Map<String, String> 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 -> { .doOnSuccess(response -> {
enhancedPluginContext.setDelay(System.currentTimeMillis() - startTime); enhancedPluginContext.setDelay(System.currentTimeMillis() - startTime);
@ -71,28 +79,13 @@ public class EnhancedWebClientReporter implements ExchangeFilterFunction {
.build(); .build();
enhancedPluginContext.setResponse(enhancedResponseContext); enhancedPluginContext.setResponse(enhancedResponseContext);
Map<String, String> 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);
// Run post enhanced plugins. // Run post enhanced plugins.
pluginRunner.run(POST, enhancedPluginContext); pluginRunner.run(POST, enhancedPluginContext);
}) })
.doOnError(t -> { .doOnError(t -> {
enhancedPluginContext.setDelay(System.currentTimeMillis() - startTime); enhancedPluginContext.setDelay(System.currentTimeMillis() - startTime);
enhancedPluginContext.setThrowable(t); enhancedPluginContext.setThrowable(t);
Map<String, String> 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);
// Run exception enhanced plugins. // Run exception enhanced plugins.
pluginRunner.run(EXCEPTION, enhancedPluginContext); pluginRunner.run(EXCEPTION, enhancedPluginContext);
}) })

@ -22,7 +22,7 @@ import com.tencent.cloud.rpc.enhancement.feign.EnhancedFeignBeanPostProcessor;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner; import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner;
import com.tencent.cloud.rpc.enhancement.plugin.reporter.ExceptionPolarisReporter; import com.tencent.cloud.rpc.enhancement.plugin.reporter.ExceptionPolarisReporter;
import com.tencent.cloud.rpc.enhancement.plugin.reporter.SuccessPolarisReporter; import com.tencent.cloud.rpc.enhancement.plugin.reporter.SuccessPolarisReporter;
import com.tencent.cloud.rpc.enhancement.resttemplate.EnhancedRestTemplate; import com.tencent.cloud.rpc.enhancement.resttemplate.EnhancedRestTemplateInterceptor;
import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.api.core.ConsumerAPI;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -60,7 +60,7 @@ public class RpcEnhancementAutoConfigurationTest {
assertThat(context).hasSingleBean(EnhancedFeignBeanPostProcessor.class); assertThat(context).hasSingleBean(EnhancedFeignBeanPostProcessor.class);
assertThat(context).hasSingleBean(SuccessPolarisReporter.class); assertThat(context).hasSingleBean(SuccessPolarisReporter.class);
assertThat(context).hasSingleBean(ExceptionPolarisReporter.class); assertThat(context).hasSingleBean(ExceptionPolarisReporter.class);
assertThat(context).hasSingleBean(EnhancedRestTemplate.class); assertThat(context).hasSingleBean(EnhancedRestTemplateInterceptor.class);
assertThat(context).hasSingleBean(RestTemplate.class); assertThat(context).hasSingleBean(RestTemplate.class);
}); });
} }

@ -57,7 +57,7 @@ import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
@ExtendWith(MockitoExtension.class) @ExtendWith(MockitoExtension.class)
public class EnhancedRestTemplateTest { public class EnhancedRestTemplateInterceptorTest {
private static MockedStatic<ApplicationContextAwareUtils> mockedApplicationContextAwareUtils; private static MockedStatic<ApplicationContextAwareUtils> mockedApplicationContextAwareUtils;
@Mock @Mock
@ -109,7 +109,7 @@ public class EnhancedRestTemplateTest {
doReturn(mockHttpHeaders).when(mockHttpRequest).getHeaders(); doReturn(mockHttpHeaders).when(mockHttpRequest).getHeaders();
doReturn(mockClientHttpResponse).when(mockClientHttpRequestExecution).execute(mockHttpRequest, inputBody); doReturn(mockClientHttpResponse).when(mockClientHttpRequestExecution).execute(mockHttpRequest, inputBody);
EnhancedRestTemplate reporter = new EnhancedRestTemplate(new DefaultEnhancedPluginRunner(new ArrayList<>())); EnhancedRestTemplateInterceptor reporter = new EnhancedRestTemplateInterceptor(new DefaultEnhancedPluginRunner(new ArrayList<>()));
actualResult = reporter.intercept(mockHttpRequest, inputBody, mockClientHttpRequestExecution); actualResult = reporter.intercept(mockHttpRequest, inputBody, mockClientHttpRequestExecution);
assertThat(actualResult).isEqualTo(mockClientHttpResponse); assertThat(actualResult).isEqualTo(mockClientHttpResponse);
Loading…
Cancel
Save