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(); EnhancedRequestContext request = context.getRequest();
EnhancedResponseContext response = context.getResponse(); 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)) { if (StringUtils.isEmpty(governanceNamespace)) {
governanceNamespace = MetadataContext.LOCAL_NAMESPACE; governanceNamespace = MetadataContext.LOCAL_NAMESPACE;
} }

@ -82,7 +82,7 @@ public class ExceptionCircuitBreakerReporter implements EnhancedPlugin {
.orElse(new DefaultServiceInstance()); .orElse(new DefaultServiceInstance());
if (LOG.isDebugEnabled()) { 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); LOG.debug("governanceNamespace={}, serviceInstance:{}", governanceNamespace, serviceInstance);
} }
ResourceStat resourceStat = PolarisEnhancedPluginUtils.createInstanceResourceStat( ResourceStat resourceStat = PolarisEnhancedPluginUtils.createInstanceResourceStat(

@ -84,7 +84,7 @@ public class PolarisServiceDiscovery {
return Collections.emptyList(); return Collections.emptyList();
} }
return polarisDiscoveryHandler.getServices().getServices().stream() 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.add(new PolarisServer(serviceInstances, instance));
} }
filteredInstances.addAll(LoadBalancerUtils.filterNonPolarisServers(allServers));
return filteredInstances; return filteredInstances;
} }

@ -33,6 +33,7 @@ import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.Ordered;
import org.springframework.lang.NonNull; import org.springframework.lang.NonNull;
/** /**
@ -40,7 +41,12 @@ import org.springframework.lang.NonNull;
* *
* @author derekyi 2022-08-01 * @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; private BeanFactory beanFactory;
@ -64,4 +70,9 @@ public class PolarisLoadBalancerCompositeRuleBeanPostProcessor implements BeanPo
public void setBeanFactory(@NonNull BeanFactory beanFactory) throws BeansException { public void setBeanFactory(@NonNull BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory; 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.PolarisRetryLoadBalancerInterceptor;
import com.tencent.cloud.polaris.router.resttemplate.RouterContextFactory; 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.BeansException;
import org.springframework.beans.factory.BeanFactory; 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.LoadBalancerRequestFactory;
import org.springframework.cloud.client.loadbalancer.LoadBalancerRetryProperties; import org.springframework.cloud.client.loadbalancer.LoadBalancerRetryProperties;
import org.springframework.cloud.client.loadbalancer.RetryLoadBalancerInterceptor; import org.springframework.cloud.client.loadbalancer.RetryLoadBalancerInterceptor;
import org.springframework.core.Ordered;
import org.springframework.lang.NonNull; import org.springframework.lang.NonNull;
/** /**
@ -37,7 +39,11 @@ import org.springframework.lang.NonNull;
* *
* @author lepdou 2022-10-09 * @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; private BeanFactory factory;
@ -58,10 +64,16 @@ public class RetryLoadBalancerInterceptorBeanPostProcessor implements BeanPostPr
LoadBalancerRequestFactory requestFactory = this.factory.getBean(LoadBalancerRequestFactory.class); LoadBalancerRequestFactory requestFactory = this.factory.getBean(LoadBalancerRequestFactory.class);
LoadBalancedRetryFactory lbRetryFactory = this.factory.getBean(LoadBalancedRetryFactory.class); LoadBalancedRetryFactory lbRetryFactory = this.factory.getBean(LoadBalancedRetryFactory.class);
RouterContextFactory routerContextFactory = this.factory.getBean(RouterContextFactory.class); RouterContextFactory routerContextFactory = this.factory.getBean(RouterContextFactory.class);
EnhancedPluginRunner pluginRunner = this.factory.getBean(EnhancedPluginRunner.class);
return new PolarisRetryLoadBalancerInterceptor(loadBalancerClient, lbProperties, requestFactory, lbRetryFactory, return new PolarisRetryLoadBalancerInterceptor(loadBalancerClient, lbProperties, requestFactory, lbRetryFactory,
routerContextFactory); routerContextFactory, pluginRunner);
} }
return bean; 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 java.net.URI;
import com.tencent.cloud.polaris.router.PolarisRouterContext; 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.Log;
import org.apache.commons.logging.LogFactory; 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.LoadBalancerRequestFactory;
import org.springframework.cloud.client.loadbalancer.LoadBalancerRetryProperties; import org.springframework.cloud.client.loadbalancer.LoadBalancerRetryProperties;
import org.springframework.cloud.client.loadbalancer.RetryLoadBalancerInterceptor; import org.springframework.cloud.client.loadbalancer.RetryLoadBalancerInterceptor;
import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient;
import org.springframework.http.HttpRequest; import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.ClientHttpResponse;
@ -64,14 +67,18 @@ public class PolarisRetryLoadBalancerInterceptor extends RetryLoadBalancerInterc
private final RouterContextFactory routerContextFactory; private final RouterContextFactory routerContextFactory;
private final EnhancedPluginRunner enhancedPluginRunner;
public PolarisRetryLoadBalancerInterceptor(LoadBalancerClient loadBalancer, LoadBalancerRetryProperties lbProperties, 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); super(loadBalancer, lbProperties, requestFactory, lbRetryFactory);
this.loadBalancer = loadBalancer; this.loadBalancer = loadBalancer;
this.lbProperties = lbProperties; this.lbProperties = lbProperties;
this.requestFactory = requestFactory; this.requestFactory = requestFactory;
this.lbRetryFactory = lbRetryFactory; this.lbRetryFactory = lbRetryFactory;
this.routerContextFactory = routerContextFactory; this.routerContextFactory = routerContextFactory;
this.enhancedPluginRunner = enhancedPluginRunner;
} }
@Override @Override
@ -111,8 +118,17 @@ public class PolarisRetryLoadBalancerInterceptor extends RetryLoadBalancerInterc
} }
//3. execute request //3. execute request
ClientHttpResponse response = loadBalancer.execute(serviceName, serviceInstance, ClientHttpResponse response;
requestFactory.createRequest(request, body, execution)); 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 //4. set router context to response
RouterContextHelper.setRouterContextToResponse(routerContext, response); RouterContextHelper.setRouterContextToResponse(routerContext, response);

@ -33,7 +33,7 @@ public final class ContextConstant {
/** /**
* Metadata key for target governance namespace. * 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 . * SCT Default Charset .

@ -17,6 +17,8 @@
package com.tencent.cloud.plugin.lossless.config; package com.tencent.cloud.plugin.lossless.config;
import java.util.List;
import com.tencent.cloud.plugin.lossless.LosslessRegistryAspect; import com.tencent.cloud.plugin.lossless.LosslessRegistryAspect;
import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled; import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled;
import com.tencent.cloud.polaris.context.PolarisSDKContextManager; import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
@ -43,11 +45,37 @@ public class LosslessAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public LosslessRegistryAspect losslessRegistryAspect( public LosslessRegistryAspect losslessRegistryAspect(
ServiceRegistry serviceRegistry, Registration registration, PolarisContextProperties properties, List<ServiceRegistry> serviceRegistryList, List<Registration> registrationList, List<RegistrationTransformer> registrationTransformerList,
LosslessProperties losslessProperties, PolarisSDKContextManager polarisSDKContextManager, PolarisContextProperties properties, LosslessProperties losslessProperties, PolarisSDKContextManager polarisSDKContextManager) {
RegistrationTransformer registrationTransformer) { // if contains multiple service registry, we need to find the polaris service registry
return new LosslessRegistryAspect(serviceRegistry, registration, properties, losslessProperties, ServiceRegistry targetServiceRegistry = null;
polarisSDKContextManager, registrationTransformer); 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); 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 java.util.List;
import com.netflix.client.config.IClientConfig; import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.ConfigurationBasedServerList;
import com.netflix.loadbalancer.DynamicServerListLoadBalancer; import com.netflix.loadbalancer.DynamicServerListLoadBalancer;
import com.netflix.loadbalancer.IPing; import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.IRule;
@ -59,6 +60,8 @@ public class PolarisLoadBalancer extends DynamicServerListLoadBalancer<Server> {
private final PolarisLoadBalancerProperties polarisLoadBalancerProperties; private final PolarisLoadBalancerProperties polarisLoadBalancerProperties;
private final InstanceTransformer instanceTransformer; 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, public PolarisLoadBalancer(IClientConfig config, IRule rule, IPing ping, ServerList<Server> serverList,
ConsumerAPI consumerAPI, PolarisLoadBalancerProperties properties, InstanceTransformer instanceTransformer) { ConsumerAPI consumerAPI, PolarisLoadBalancerProperties properties, InstanceTransformer instanceTransformer) {
@ -66,6 +69,8 @@ public class PolarisLoadBalancer extends DynamicServerListLoadBalancer<Server> {
this.consumerAPI = consumerAPI; this.consumerAPI = consumerAPI;
this.polarisLoadBalancerProperties = properties; this.polarisLoadBalancerProperties = properties;
this.instanceTransformer = instanceTransformer; this.instanceTransformer = instanceTransformer;
// PolarisDiscoveryRibbonAutoConfiguration will not load, so default server list is ConfigurationBasedServerList.
this.isPolarisDefaultServerList = serverList instanceof ConfigurationBasedServerList;
} }
@Override @Override
@ -79,10 +84,18 @@ public class PolarisLoadBalancer extends DynamicServerListLoadBalancer<Server> {
if (THREAD_CACHE_SERVERS.get() != null) { if (THREAD_CACHE_SERVERS.get() != null) {
return THREAD_CACHE_SERVERS.get(); return THREAD_CACHE_SERVERS.get();
} }
return getReachableServersWithoutCache(); if (isPolarisDefaultServerList) {
return getReachableServersWithoutCache();
}
else {
return super.getReachableServers();
}
} }
public List<Server> getReachableServersWithoutCache() { public List<Server> getReachableServersWithoutCache() {
if (!isPolarisDefaultServerList) {
return super.getReachableServers();
}
ServiceInstances serviceInstances; ServiceInstances serviceInstances;
if (polarisLoadBalancerProperties.getDiscoveryType().equals(ContextConstant.POLARIS)) { if (polarisLoadBalancerProperties.getDiscoveryType().equals(ContextConstant.POLARIS)) {
serviceInstances = getPolarisDiscoveryServiceInstances(); serviceInstances = getPolarisDiscoveryServiceInstances();
@ -142,7 +155,12 @@ public class PolarisLoadBalancer extends DynamicServerListLoadBalancer<Server> {
@Override @Override
public List<Server> getAllServers() { public List<Server> getAllServers() {
return getReachableServers(); if (isPolarisDefaultServerList) {
return getReachableServers();
}
else {
return super.getAllServers();
}
} }
/** /**

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

@ -42,6 +42,16 @@ public class DefaultEnhancedPluginRunner implements EnhancedPluginRunner {
private final ServiceInstance localServiceInstance; private final ServiceInstance localServiceInstance;
public DefaultEnhancedPluginRunner(
List<EnhancedPlugin> enhancedPlugins,
List<Registration> registration,
SDKContext sdkContext
) {
this(enhancedPlugins,
getPolarisRegistration(registration),
sdkContext);
}
public DefaultEnhancedPluginRunner( public DefaultEnhancedPluginRunner(
List<EnhancedPlugin> enhancedPlugins, List<EnhancedPlugin> enhancedPlugins,
Registration registration, Registration registration,
@ -89,4 +99,17 @@ public class DefaultEnhancedPluginRunner implements EnhancedPluginRunner {
return this.localServiceInstance; 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, @Nullable String calleeServiceName, @Nullable String calleeHost, @Nullable Integer calleePort,
URI uri, @Nullable Integer statusCode, long delay, @Nullable Throwable exception) { 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)) { if (StringUtils.isBlank(governanceNamespace)) {
governanceNamespace = MetadataContext.LOCAL_NAMESPACE; governanceNamespace = MetadataContext.LOCAL_NAMESPACE;
} }

Loading…
Cancel
Save