fix 双注册双发现场景

pull/1471/head
shedfreewu 10 months ago
parent ef7473e170
commit 5471423ff6

@ -70,7 +70,7 @@ public class CircuitBreakerPlugin implements EnhancedPlugin {
EnhancedRequestContext request = context.getRequest();
EnhancedResponseContext response = context.getResponse();
String governanceNamespace = MetadataContextHolder.get().getDisposableMetadata().get(ContextConstant.POLARIS_GOVERNANCE_TARGET_NAMESPACE);
String governanceNamespace = MetadataContextHolder.get().getDisposableMetadata().get(ContextConstant.POLARIS_GOVERNANCE_NAMESPACE);
if (StringUtils.isEmpty(governanceNamespace)) {
governanceNamespace = MetadataContext.LOCAL_NAMESPACE;
}

@ -82,7 +82,7 @@ public class ExceptionCircuitBreakerReporter implements EnhancedPlugin {
.orElse(new DefaultServiceInstance());
if (LOG.isDebugEnabled()) {
String governanceNamespace = MetadataContextHolder.get().getDisposableMetadata().get(ContextConstant.POLARIS_GOVERNANCE_TARGET_NAMESPACE);
String governanceNamespace = MetadataContextHolder.get().getDisposableMetadata().get(ContextConstant.POLARIS_GOVERNANCE_NAMESPACE);
LOG.debug("governanceNamespace={}, serviceInstance:{}", governanceNamespace, serviceInstance);
}
ResourceStat resourceStat = PolarisEnhancedPluginUtils.createInstanceResourceStat(

@ -84,7 +84,7 @@ public class PolarisServiceDiscovery {
return Collections.emptyList();
}
return polarisDiscoveryHandler.getServices().getServices().stream()
.map(ServiceInfo::getService).collect(Collectors.toList());
.map(ServiceInfo::getService).distinct().collect(Collectors.toList());
}
}

@ -195,6 +195,8 @@ public class PolarisLoadBalancerCompositeRule extends AbstractLoadBalancerRule {
filteredInstances.add(new PolarisServer(serviceInstances, instance));
}
filteredInstances.addAll(LoadBalancerUtils.filterNonPolarisServers(allServers));
return filteredInstances;
}

@ -33,6 +33,7 @@ import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.Ordered;
import org.springframework.lang.NonNull;
/**
@ -40,7 +41,12 @@ import org.springframework.lang.NonNull;
*
* @author derekyi 2022-08-01
*/
public class PolarisLoadBalancerCompositeRuleBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware {
public class PolarisLoadBalancerCompositeRuleBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware, Ordered {
/**
* The order of the bean post processor. if user want to wrap it(CustomRule -> PolarisLoadBalancerCompositeRule), CustomRuleBeanPostProcessor's order should be bigger than ${@link POLARIS_LOAD_BALANCER_COMPOSITE_RULE_POST_PROCESSOR_ORDER}.
*/
public static final int POLARIS_LOAD_BALANCER_COMPOSITE_RULE_POST_PROCESSOR_ORDER = 0;
private BeanFactory beanFactory;
@ -64,4 +70,9 @@ public class PolarisLoadBalancerCompositeRuleBeanPostProcessor implements BeanPo
public void setBeanFactory(@NonNull BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
@Override
public int getOrder() {
return POLARIS_LOAD_BALANCER_COMPOSITE_RULE_POST_PROCESSOR_ORDER;
}
}

@ -19,6 +19,7 @@ package com.tencent.cloud.polaris.router.beanprocessor;
import com.tencent.cloud.polaris.router.resttemplate.PolarisRetryLoadBalancerInterceptor;
import com.tencent.cloud.polaris.router.resttemplate.RouterContextFactory;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
@ -29,6 +30,7 @@ import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerRequestFactory;
import org.springframework.cloud.client.loadbalancer.LoadBalancerRetryProperties;
import org.springframework.cloud.client.loadbalancer.RetryLoadBalancerInterceptor;
import org.springframework.core.Ordered;
import org.springframework.lang.NonNull;
/**
@ -37,7 +39,11 @@ import org.springframework.lang.NonNull;
*
* @author lepdou 2022-10-09
*/
public class RetryLoadBalancerInterceptorBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware {
public class RetryLoadBalancerInterceptorBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware, Ordered {
/**
* The order of the bean post processor. if user want to wrap it(CustomLoadBalancerInterceptor -> PolarisRetryLoadBalancerInterceptor), CustomLoadBalancerInterceptorBeanPostProcessor's order should be bigger than ${@link POLARIS_RETRY_LOAD_BALANCER_INTERCEPTOR_POST_PROCESSOR_ORDER}.
*/
public static final int POLARIS_RETRY_LOAD_BALANCER_INTERCEPTOR_POST_PROCESSOR_ORDER = 0;
private BeanFactory factory;
@ -58,10 +64,16 @@ public class RetryLoadBalancerInterceptorBeanPostProcessor implements BeanPostPr
LoadBalancerRequestFactory requestFactory = this.factory.getBean(LoadBalancerRequestFactory.class);
LoadBalancedRetryFactory lbRetryFactory = this.factory.getBean(LoadBalancedRetryFactory.class);
RouterContextFactory routerContextFactory = this.factory.getBean(RouterContextFactory.class);
EnhancedPluginRunner pluginRunner = this.factory.getBean(EnhancedPluginRunner.class);
return new PolarisRetryLoadBalancerInterceptor(loadBalancerClient, lbProperties, requestFactory, lbRetryFactory,
routerContextFactory);
routerContextFactory, pluginRunner);
}
return bean;
}
@Override
public int getOrder() {
return POLARIS_RETRY_LOAD_BALANCER_INTERCEPTOR_POST_PROCESSOR_ORDER;
}
}

@ -21,6 +21,8 @@ import java.io.IOException;
import java.net.URI;
import com.tencent.cloud.polaris.router.PolarisRouterContext;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner;
import com.tencent.cloud.rpc.enhancement.resttemplate.EnhancedRestTemplateWrapInterceptor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -34,6 +36,7 @@ import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerRequestFactory;
import org.springframework.cloud.client.loadbalancer.LoadBalancerRetryProperties;
import org.springframework.cloud.client.loadbalancer.RetryLoadBalancerInterceptor;
import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpResponse;
@ -64,14 +67,18 @@ public class PolarisRetryLoadBalancerInterceptor extends RetryLoadBalancerInterc
private final RouterContextFactory routerContextFactory;
private final EnhancedPluginRunner enhancedPluginRunner;
public PolarisRetryLoadBalancerInterceptor(LoadBalancerClient loadBalancer, LoadBalancerRetryProperties lbProperties,
LoadBalancerRequestFactory requestFactory, LoadBalancedRetryFactory lbRetryFactory, RouterContextFactory routerContextFactory) {
LoadBalancerRequestFactory requestFactory, LoadBalancedRetryFactory lbRetryFactory,
RouterContextFactory routerContextFactory, EnhancedPluginRunner enhancedPluginRunner) {
super(loadBalancer, lbProperties, requestFactory, lbRetryFactory);
this.loadBalancer = loadBalancer;
this.lbProperties = lbProperties;
this.requestFactory = requestFactory;
this.lbRetryFactory = lbRetryFactory;
this.routerContextFactory = routerContextFactory;
this.enhancedPluginRunner = enhancedPluginRunner;
}
@Override
@ -111,8 +118,17 @@ public class PolarisRetryLoadBalancerInterceptor extends RetryLoadBalancerInterc
}
//3. execute request
ClientHttpResponse response = loadBalancer.execute(serviceName, serviceInstance,
requestFactory.createRequest(request, body, execution));
ClientHttpResponse response;
if (enhancedPluginRunner != null) {
EnhancedRestTemplateWrapInterceptor enhancedRestTemplatePluginRunnerInterceptor =
new EnhancedRestTemplateWrapInterceptor(enhancedPluginRunner, (RibbonLoadBalancerClient) loadBalancer);
response = enhancedRestTemplatePluginRunnerInterceptor.intercept(
request, serviceName, this.requestFactory.createRequest(request, body, execution), routerContext);
}
else {
response = loadBalancer.execute(serviceName, serviceInstance,
requestFactory.createRequest(request, body, execution));
}
//4. set router context to response
RouterContextHelper.setRouterContextToResponse(routerContext, response);

@ -33,7 +33,7 @@ public final class ContextConstant {
/**
* Metadata key for target governance namespace.
*/
public static final String POLARIS_GOVERNANCE_TARGET_NAMESPACE = "POLARIS_GOVERNANCE_TARGET_NAMESPACE";
public static final String POLARIS_GOVERNANCE_NAMESPACE = "POLARIS_GOVERNANCE_NAMESPACE";
/**
* SCT Default Charset .

@ -17,6 +17,8 @@
package com.tencent.cloud.plugin.lossless.config;
import java.util.List;
import com.tencent.cloud.plugin.lossless.LosslessRegistryAspect;
import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled;
import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
@ -43,11 +45,37 @@ public class LosslessAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public LosslessRegistryAspect losslessRegistryAspect(
ServiceRegistry serviceRegistry, Registration registration, PolarisContextProperties properties,
LosslessProperties losslessProperties, PolarisSDKContextManager polarisSDKContextManager,
RegistrationTransformer registrationTransformer) {
return new LosslessRegistryAspect(serviceRegistry, registration, properties, losslessProperties,
polarisSDKContextManager, registrationTransformer);
List<ServiceRegistry> serviceRegistryList, List<Registration> registrationList, List<RegistrationTransformer> registrationTransformerList,
PolarisContextProperties properties, LosslessProperties losslessProperties, PolarisSDKContextManager polarisSDKContextManager) {
// if contains multiple service registry, we need to find the polaris service registry
ServiceRegistry targetServiceRegistry = null;
Registration targetRegistration = null;
RegistrationTransformer targetRegistrationTransformer = null;
if (serviceRegistryList.size() == 1 && registrationList.size() == 1 && registrationTransformerList.size() == 1) {
targetServiceRegistry = serviceRegistryList.get(0);
targetRegistration = registrationList.get(0);
targetRegistrationTransformer = registrationTransformerList.get(0);
}
else {
for (ServiceRegistry serviceRegistry : serviceRegistryList) {
if (serviceRegistry.getClass().getSimpleName().contains("Polaris")) {
targetServiceRegistry = serviceRegistry;
}
}
for (Registration registration : registrationList) {
if (registration.getClass().getSimpleName().contains("Polaris")) {
targetRegistration = registration;
}
}
for (RegistrationTransformer registrationTransformer : registrationTransformerList) {
if (registrationTransformer.getClass().getSimpleName().contains("Polaris")) {
targetRegistrationTransformer = registrationTransformer;
}
}
}
return new LosslessRegistryAspect(targetServiceRegistry, targetRegistration, properties, losslessProperties,
polarisSDKContextManager, targetRegistrationTransformer);
}
}

@ -57,4 +57,14 @@ public final class LoadBalancerUtils {
return new DefaultServiceInstances(serviceKey, instances);
}
public static List<Server> filterNonPolarisServers(List<Server> servers) {
List<Server> result = new ArrayList<>(servers.size());
for (Server server : servers) {
if (!(server instanceof PolarisServer)) {
result.add(server);
}
}
return result;
}
}

@ -23,6 +23,7 @@ import java.util.LinkedList;
import java.util.List;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.ConfigurationBasedServerList;
import com.netflix.loadbalancer.DynamicServerListLoadBalancer;
import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.IRule;
@ -59,6 +60,8 @@ public class PolarisLoadBalancer extends DynamicServerListLoadBalancer<Server> {
private final PolarisLoadBalancerProperties polarisLoadBalancerProperties;
private final InstanceTransformer instanceTransformer;
// when configuring by user, use origin getReachableServers and getAllServers to get instances.
private final boolean isPolarisDefaultServerList;
public PolarisLoadBalancer(IClientConfig config, IRule rule, IPing ping, ServerList<Server> serverList,
ConsumerAPI consumerAPI, PolarisLoadBalancerProperties properties, InstanceTransformer instanceTransformer) {
@ -66,6 +69,8 @@ public class PolarisLoadBalancer extends DynamicServerListLoadBalancer<Server> {
this.consumerAPI = consumerAPI;
this.polarisLoadBalancerProperties = properties;
this.instanceTransformer = instanceTransformer;
// PolarisDiscoveryRibbonAutoConfiguration will not load, so default server list is ConfigurationBasedServerList.
this.isPolarisDefaultServerList = serverList instanceof ConfigurationBasedServerList;
}
@Override
@ -79,10 +84,18 @@ public class PolarisLoadBalancer extends DynamicServerListLoadBalancer<Server> {
if (THREAD_CACHE_SERVERS.get() != null) {
return THREAD_CACHE_SERVERS.get();
}
return getReachableServersWithoutCache();
if (isPolarisDefaultServerList) {
return getReachableServersWithoutCache();
}
else {
return super.getReachableServers();
}
}
public List<Server> getReachableServersWithoutCache() {
if (!isPolarisDefaultServerList) {
return super.getReachableServers();
}
ServiceInstances serviceInstances;
if (polarisLoadBalancerProperties.getDiscoveryType().equals(ContextConstant.POLARIS)) {
serviceInstances = getPolarisDiscoveryServiceInstances();
@ -142,7 +155,12 @@ public class PolarisLoadBalancer extends DynamicServerListLoadBalancer<Server> {
@Override
public List<Server> getAllServers() {
return getReachableServers();
if (isPolarisDefaultServerList) {
return getReachableServers();
}
else {
return super.getAllServers();
}
}
/**

@ -104,9 +104,9 @@ public class RpcEnhancementAutoConfiguration {
@Lazy
public EnhancedPluginRunner enhancedFeignPluginRunner(
@Autowired(required = false) List<EnhancedPlugin> enhancedPlugins,
@Autowired(required = false) Registration registration,
@Autowired(required = false) List<Registration> registrations,
PolarisSDKContextManager polarisSDKContextManager) {
return new DefaultEnhancedPluginRunner(enhancedPlugins, registration, polarisSDKContextManager.getSDKContext());
return new DefaultEnhancedPluginRunner(enhancedPlugins, registrations, polarisSDKContextManager.getSDKContext());
}
@Bean

@ -42,6 +42,16 @@ public class DefaultEnhancedPluginRunner implements EnhancedPluginRunner {
private final ServiceInstance localServiceInstance;
public DefaultEnhancedPluginRunner(
List<EnhancedPlugin> enhancedPlugins,
List<Registration> registration,
SDKContext sdkContext
) {
this(enhancedPlugins,
getPolarisRegistration(registration),
sdkContext);
}
public DefaultEnhancedPluginRunner(
List<EnhancedPlugin> enhancedPlugins,
Registration registration,
@ -89,4 +99,17 @@ public class DefaultEnhancedPluginRunner implements EnhancedPluginRunner {
return this.localServiceInstance;
}
private static Registration getPolarisRegistration(List<Registration> registration) {
if (CollectionUtils.isEmpty(registration)) {
return null;
}
for (Registration reg : registration) {
if (reg.getClass().getCanonicalName().equals("com.tencent.cloud.polaris.registry.PolarisRegistration")) {
return reg;
}
}
return registration.get(0);
}
}

@ -136,7 +136,7 @@ public final class PolarisEnhancedPluginUtils {
@Nullable String calleeServiceName, @Nullable String calleeHost, @Nullable Integer calleePort,
URI uri, @Nullable Integer statusCode, long delay, @Nullable Throwable exception) {
String governanceNamespace = MetadataContextHolder.get().getDisposableMetadata().get(ContextConstant.POLARIS_GOVERNANCE_TARGET_NAMESPACE);
String governanceNamespace = MetadataContextHolder.get().getDisposableMetadata().get(ContextConstant.POLARIS_GOVERNANCE_NAMESPACE);
if (StringUtils.isBlank(governanceNamespace)) {
governanceNamespace = MetadataContext.LOCAL_NAMESPACE;
}

Loading…
Cancel
Save