temp commit

pull/964/head
seanyu 2 years ago
parent 629c7441a4
commit 1a3408661e

@ -18,10 +18,6 @@
package com.tencent.cloud.polaris.loadbalancer;
import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled;
import com.tencent.cloud.polaris.loadbalancer.reactive.PolarisLoadBalancerClientRequestTransformer;
import com.tencent.polaris.api.core.ConsumerAPI;
import com.tencent.polaris.client.api.SDKContext;
import com.tencent.polaris.factory.api.DiscoveryAPIFactory;
import com.tencent.polaris.router.api.core.RouterAPI;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
@ -33,7 +29,6 @@ import org.springframework.cloud.client.ConditionalOnReactiveDiscoveryEnabled;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerClientRequestTransformer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
@ -70,13 +65,6 @@ public class PolarisLoadBalancerClientConfiguration {
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), routerAPI);
}
// @Bean
// @ConditionalOnMissingBean
// public LoadBalancerClientRequestTransformer polarisLoadBalancerClientRequestTransformer(SDKContext sdkContext) {
// ConsumerAPI consumerAPI = DiscoveryAPIFactory.createConsumerAPIByContext(sdkContext);
// return new PolarisLoadBalancerClientRequestTransformer(consumerAPI);
// }
@Configuration(proxyBeanMethods = false)
@ConditionalOnReactiveDiscoveryEnabled
@Order(REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER)

@ -1,44 +1,44 @@
/*
* 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.polaris.loadbalancer.reactive;
import com.tencent.cloud.common.constant.HeaderConstant;
import com.tencent.polaris.api.core.ConsumerAPI;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerClientRequestTransformer;
import org.springframework.http.HttpHeaders;
import org.springframework.web.reactive.function.client.ClientRequest;
public class PolarisLoadBalancerClientRequestTransformer implements LoadBalancerClientRequestTransformer {
private final ConsumerAPI consumerAPI;
public PolarisLoadBalancerClientRequestTransformer(ConsumerAPI consumerAPI) {
this.consumerAPI = consumerAPI;
}
@Override
public ClientRequest transformRequest(ClientRequest request, ServiceInstance instance) {
if (instance != null) {
HttpHeaders headers = request.headers();
headers.add(HeaderConstant.INTERNAL_CALLEE_SERVICE_ID, instance.getServiceId());
}
return request;
}
}
///*
// * 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.polaris.loadbalancer.reactive;
//
//import com.tencent.cloud.common.constant.HeaderConstant;
//import com.tencent.polaris.api.core.ConsumerAPI;
//
//import org.springframework.cloud.client.ServiceInstance;
//import org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerClientRequestTransformer;
//import org.springframework.http.HttpHeaders;
//import org.springframework.web.reactive.function.client.ClientRequest;
//
//public class PolarisLoadBalancerClientRequestTransformer implements LoadBalancerClientRequestTransformer {
//
// private final ConsumerAPI consumerAPI;
//
// public PolarisLoadBalancerClientRequestTransformer(ConsumerAPI consumerAPI) {
// this.consumerAPI = consumerAPI;
// }
//
// @Override
// public ClientRequest transformRequest(ClientRequest request, ServiceInstance instance) {
// if (instance != null) {
// HttpHeaders headers = request.headers();
// headers.add(HeaderConstant.INTERNAL_CALLEE_SERVICE_ID, instance.getServiceId());
// }
// return request;
// }
//}

@ -54,6 +54,6 @@ logging:
level:
root: info
com.tencent.polaris.discovery.client.flow.RegisterFlow: off
com.tencent.polaris.plugins.registry.memory.CacheObject: off
com.tencent.cloud.polaris.circuitbreaker: debug
com.tencent.polaris.plugins.registry: off
com.tencent.cloud: debug

@ -92,6 +92,13 @@ public abstract class AbstractPolarisReporterAdapter {
this.context = context;
}
public ServiceCallResult createServiceCallResult(
@Nullable String calleeServiceName, URI uri, HttpHeaders requestHeaders, @Nullable HttpHeaders responseHeaders,
@Nullable Integer statusCode, long delay, @Nullable Throwable exception) {
return createServiceCallResult(
calleeServiceName, uri.getHost(), uri.getPort(), uri, requestHeaders, responseHeaders, statusCode, delay, exception);
}
/**
* createServiceCallResult
* @param calleeServiceName will pick up url host when null
@ -127,6 +134,13 @@ public abstract class AbstractPolarisReporterAdapter {
return resultRequest;
}
public ResourceStat createInstanceResourceStat(
@Nullable String calleeServiceName, URI uri,
@Nullable Integer statusCode, long delay, @Nullable Throwable exception) {
return createInstanceResourceStat(
calleeServiceName, uri.getHost(), uri.getPort(), uri, statusCode, delay, exception);
}
/**
* createInstanceResourceStat
* @param calleeServiceName will pick up url host when null

@ -29,9 +29,9 @@ import com.tencent.cloud.rpc.enhancement.feign.plugin.EnhancedFeignPlugin;
import com.tencent.cloud.rpc.enhancement.feign.plugin.reporter.ExceptionPolarisReporter;
import com.tencent.cloud.rpc.enhancement.feign.plugin.reporter.SuccessPolarisReporter;
import com.tencent.cloud.rpc.enhancement.resttemplate.BlockingLoadBalancerClientAspect;
import com.tencent.cloud.rpc.enhancement.webclient.PolarisLoadBalancerClientRequestTransformer;
import com.tencent.cloud.rpc.enhancement.scg.PolarisGatewayReporter;
import com.tencent.cloud.rpc.enhancement.resttemplate.PolarisRestTemplateReporter;
import com.tencent.cloud.rpc.enhancement.scg.EnhancedPolarisHttpHeadersFilter;
import com.tencent.cloud.rpc.enhancement.webclient.EnhancedWebClientReporter;
import com.tencent.polaris.api.core.ConsumerAPI;
import com.tencent.polaris.circuitbreak.api.CircuitBreakAPI;
@ -48,13 +48,11 @@ 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.loadbalancer.LoadBalanced;
import org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter;
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.web.client.RestTemplate;
import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
import org.springframework.web.reactive.function.client.WebClient;
/**
@ -168,6 +166,13 @@ public class RpcEnhancementAutoConfiguration {
@ConditionalOnClass(name = "org.springframework.web.reactive.function.client.WebClient")
protected static class PolarisWebClientAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnClass(name = "org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerClientRequestTransformer")
public PolarisLoadBalancerClientRequestTransformer polarisLoadBalancerClientRequestTransformer() {
return new PolarisLoadBalancerClientRequestTransformer();
}
@Autowired(required = false)
private List<WebClient.Builder> webClientBuilder = Collections.emptyList();
@ -180,7 +185,7 @@ public class RpcEnhancementAutoConfiguration {
}
@Bean
public SmartInitializingSingleton addEncodeTransferMetadataFilterForWebClient(EnhancedWebClientReporter reporter) {
public SmartInitializingSingleton addEnhancedWebClientReporterForWebClient(EnhancedWebClientReporter reporter) {
return () -> webClientBuilder.forEach(webClient -> {
webClient.filter(reporter);
});
@ -196,12 +201,6 @@ public class RpcEnhancementAutoConfiguration {
@Role(RootBeanDefinition.ROLE_INFRASTRUCTURE)
protected static class PolarisGatewayAutoConfiguration {
@Bean
@ConditionalOnClass(name = {"org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter"})
public HttpHeadersFilter enhancedPolarisHttpHeadersFilter() {
return new EnhancedPolarisHttpHeadersFilter();
}
@Bean
@ConditionalOnClass(name = "org.springframework.cloud.gateway.filter.GlobalFilter")
public PolarisGatewayReporter polarisGatewayReporter(RpcEnhancementReporterProperties properties,

@ -96,8 +96,6 @@ public class ExceptionPolarisReporter extends AbstractPolarisReporterAdapter imp
ServiceCallResult resultRequest = createServiceCallResult(
request.requestTemplate().feignTarget().name(),
null,
null,
URI.create(request.url()),
requestHeaders,
responseHeaders,
@ -111,8 +109,6 @@ public class ExceptionPolarisReporter extends AbstractPolarisReporterAdapter imp
ResourceStat resourceStat = createInstanceResourceStat(
request.requestTemplate().feignTarget().name(),
null,
null,
URI.create(request.url()),
status,
delay,

@ -93,8 +93,6 @@ public class SuccessPolarisReporter extends AbstractPolarisReporterAdapter imple
ServiceCallResult resultRequest = createServiceCallResult(
request.requestTemplate().feignTarget().name(),
null,
null,
URI.create(request.url()),
requestHeaders,
responseHeaders,
@ -108,8 +106,6 @@ public class SuccessPolarisReporter extends AbstractPolarisReporterAdapter imple
ResourceStat resourceStat = createInstanceResourceStat(
request.requestTemplate().feignTarget().name(),
null,
null,
URI.create(request.url()),
status,
delay,

@ -39,7 +39,6 @@ public final class LoadBalancerClientAspectUtils {
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()));
MetadataContextHolder.get().setLoadbalancer(HeaderConstant.INTERNAL_CALL_START_TIME, String.valueOf(System.currentTimeMillis()));
}
}
}

@ -1,29 +1,29 @@
/*
* 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.springframework.web.client.ResponseErrorHandler;
/**
* Polaris Response Error Handler Definition Of {@link ResponseErrorHandler}.
*
* @author wh 2022/6/21
*/
public interface PolarisResponseErrorHandler extends ResponseErrorHandler {
}
///*
// * 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.springframework.web.client.ResponseErrorHandler;
//
///**
// * Polaris Response Error Handler Definition Of {@link ResponseErrorHandler}.
// *
// * @author wh 2022/6/21
// */
//public interface PolarisResponseErrorHandler extends ResponseErrorHandler {
//
//}

@ -69,6 +69,7 @@ public class PolarisRestTemplateReporter extends AbstractPolarisReporterAdapter
return execution.execute(request, body);
}
long startTime = System.currentTimeMillis();
ClientHttpResponse response = null;
IOException ex = null;
try {
@ -87,7 +88,7 @@ public class PolarisRestTemplateReporter extends AbstractPolarisReporterAdapter
Map<String, String> loadBalancerContext = MetadataContextHolder.get().getLoadbalancerMetadata();
String targetHost = loadBalancerContext.get(HeaderConstant.INTERNAL_CALLEE_INSTANCE_HOST);
Integer targetPort = Integer.valueOf(loadBalancerContext.get(HeaderConstant.INTERNAL_CALLEE_INSTANCE_PORT));
long delay = System.currentTimeMillis() - Long.parseLong(loadBalancerContext.get(HeaderConstant.INTERNAL_CALL_START_TIME));
long delay = System.currentTimeMillis() - startTime;
ServiceCallResult resultRequest = createServiceCallResult(
request.getURI().getHost(),

@ -15,12 +15,16 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import reactor.core.publisher.Mono;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.Response;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_LOADBALANCER_RESPONSE_ATTR;
public class PolarisGatewayReporter extends AbstractPolarisReporterAdapter implements GlobalFilter {
private static final Logger LOG = LoggerFactory.getLogger(PolarisGatewayReporter.class);
@ -48,37 +52,29 @@ public class PolarisGatewayReporter extends AbstractPolarisReporterAdapter imple
if (!reportProperties.isEnabled()) {
return chain.filter(exchange);
}
MetadataContextHolder.get().setLoadbalancer(
HeaderConstant.INTERNAL_CALLEE_SERVICE_ID,
exchange.getRequest().getHeaders().getFirst(HeaderConstant.INTERNAL_CALLEE_SERVICE_ID)
);
MetadataContextHolder.get().setLoadbalancer(
HeaderConstant.INTERNAL_CALLEE_INSTANCE_HOST,
exchange.getRequest().getHeaders().getFirst(HeaderConstant.INTERNAL_CALLEE_INSTANCE_HOST)
);
MetadataContextHolder.get().setLoadbalancer(
HeaderConstant.INTERNAL_CALLEE_INSTANCE_PORT,
exchange.getRequest().getHeaders().getFirst(HeaderConstant.INTERNAL_CALLEE_INSTANCE_PORT)
);
MetadataContextHolder.get().setLoadbalancer(
HeaderConstant.INTERNAL_CALL_START_TIME,
String.valueOf(System.currentTimeMillis())
);
long startTime = System.currentTimeMillis();
return chain.filter(exchange)
.doOnSuccess(v -> instrumentResponse(exchange, null))
.doOnError(t -> instrumentResponse(exchange, t));
.doOnSuccess(v -> instrumentResponse(exchange, null, startTime))
.doOnError(t -> instrumentResponse(exchange, t, startTime));
}
private void instrumentResponse(ServerWebExchange exchange, Throwable t) {
Map<String, String> loadBalancerContext = MetadataContextHolder.get().getLoadbalancerMetadata();
String serviceId = loadBalancerContext.get(HeaderConstant.INTERNAL_CALLEE_SERVICE_ID);
String targetHost = loadBalancerContext.get(HeaderConstant.INTERNAL_CALLEE_INSTANCE_HOST);
Integer targetPort = Integer.valueOf(loadBalancerContext.get(HeaderConstant.INTERNAL_CALLEE_INSTANCE_PORT));
long delay = System.currentTimeMillis() - Long.parseLong(loadBalancerContext.get(HeaderConstant.INTERNAL_CALL_START_TIME));
private void instrumentResponse(ServerWebExchange exchange, Throwable t, long startTime) {
ServerHttpResponse response = exchange.getResponse();
ServerHttpRequest request = exchange.getRequest();
long delay = System.currentTimeMillis() - startTime;
String serviceId = null;
String targetHost = null;
Integer targetPort = null;
Response<ServiceInstance> serviceInstanceResponse = exchange.getAttribute(GATEWAY_LOADBALANCER_RESPONSE_ATTR);
if (serviceInstanceResponse != null && serviceInstanceResponse.hasServer()) {
ServiceInstance instance = serviceInstanceResponse.getServer();
serviceId = instance.getServiceId();
targetHost = instance.getHost();
targetPort = instance.getPort();
}
ServiceCallResult resultRequest = createServiceCallResult(
serviceId,
targetHost,

@ -17,35 +17,20 @@
package com.tencent.cloud.rpc.enhancement.webclient;
import java.io.UnsupportedEncodingException;
import java.net.SocketTimeoutException;
import java.net.URI;
import java.net.URLDecoder;
import java.util.Collection;
import java.util.Map;
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.metadata.MetadataContextHolder;
import com.tencent.cloud.common.util.RequestLabelUtils;
import com.tencent.cloud.rpc.enhancement.AbstractPolarisReporterAdapter;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
import com.tencent.polaris.api.core.ConsumerAPI;
import com.tencent.polaris.api.plugin.circuitbreaker.ResourceStat;
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.circuitbreak.api.CircuitBreakAPI;
import com.tencent.polaris.client.api.SDKContext;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import reactor.core.publisher.Mono;
import reactor.util.context.Context;
import reactor.util.context.ContextView;
import org.springframework.http.HttpHeaders;
import org.springframework.web.reactive.function.client.ClientRequest;
@ -53,7 +38,6 @@ 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.common.constant.ContextConstant.UTF_8;
public class EnhancedWebClientReporter extends AbstractPolarisReporterAdapter implements ExchangeFilterFunction {
private static final Logger LOG = LoggerFactory.getLogger(EnhancedWebClientReporter.class);
@ -75,24 +59,16 @@ public class EnhancedWebClientReporter extends AbstractPolarisReporterAdapter im
if (!reportProperties.isEnabled()) {
return next.exchange(request);
}
MetadataContextHolder.get().setLoadbalancer(
HeaderConstant.INTERNAL_CALLEE_SERVICE_ID,
request.headers().getFirst(HeaderConstant.INTERNAL_CALLEE_SERVICE_ID)
);
MetadataContextHolder.get().setLoadbalancer(
HeaderConstant.INTERNAL_CALL_START_TIME,
String.valueOf(System.currentTimeMillis())
);
long startTime = System.currentTimeMillis();
return next.exchange(request)
.doOnSuccess(response -> instrumentResponse(request, response, null))
.doOnError(t -> instrumentResponse(request, null, t));
.doOnSuccess(response -> instrumentResponse(request, response, null, startTime))
.doOnError(t -> instrumentResponse(request, null, t, startTime));
}
private void instrumentResponse(ClientRequest request, ClientResponse response, Throwable t) {
private void instrumentResponse(ClientRequest request, ClientResponse response, Throwable t, long startTime) {
Map<String, String> loadBalancerContext = MetadataContextHolder.get().getLoadbalancerMetadata();
String serviceId = loadBalancerContext.get(HeaderConstant.INTERNAL_CALLEE_SERVICE_ID);
long delay = System.currentTimeMillis() - Long.parseLong(loadBalancerContext.get(HeaderConstant.INTERNAL_CALL_START_TIME));
long delay = System.currentTimeMillis() - startTime;
HttpHeaders requestHeaders = request.headers();
HttpHeaders responseHeaders = null;
@ -104,8 +80,6 @@ public class EnhancedWebClientReporter extends AbstractPolarisReporterAdapter im
ServiceCallResult resultRequest = createServiceCallResult(
serviceId,
null,
null,
request.url(),
requestHeaders,
responseHeaders,
@ -119,8 +93,6 @@ public class EnhancedWebClientReporter extends AbstractPolarisReporterAdapter im
ResourceStat resourceStat = createInstanceResourceStat(
serviceId,
null,
null,
request.url(),
status,
delay,

@ -0,0 +1,20 @@
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;
public class PolarisLoadBalancerClientRequestTransformer implements LoadBalancerClientRequestTransformer {
@Override
public ClientRequest transformRequest(ClientRequest request, ServiceInstance instance) {
if (instance != null) {
MetadataContextHolder.get().setLoadbalancer(HeaderConstant.INTERNAL_CALLEE_SERVICE_ID, instance.getServiceId());
}
return request;
}
}
Loading…
Cancel
Save