diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/eager/instrument/feign/FeignEagerLoadContextInitializer.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/eager/instrument/feign/FeignEagerLoadContextInitializer.java index ad8f03333..1fa8d7d97 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/eager/instrument/feign/FeignEagerLoadContextInitializer.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/eager/instrument/feign/FeignEagerLoadContextInitializer.java @@ -49,11 +49,11 @@ public class FeignEagerLoadContextInitializer implements ApplicationListener getHardCodedTarget(Object proxy) { + try { + int count = 0; + Object invocationHandler = proxy; + // Avoid infinite loop + while (count++ < 100) { + invocationHandler = Proxy.getInvocationHandler(invocationHandler); + if (invocationHandler instanceof AopProxy) { + invocationHandler = JdkDynamicAopProxyUtils.getTarget(invocationHandler); + continue; + } + break; + } + + for (Field field : invocationHandler.getClass().getDeclaredFields()) { + field.setAccessible(true); + Object fieldValue = field.get(invocationHandler); + if (fieldValue instanceof Target.HardCodedTarget) { + return (Target.HardCodedTarget) fieldValue; + } + } + } + catch (Exception e) { + if (LOG.isDebugEnabled()) { + LOG.debug("proxy:{}, getTarget failed.", proxy, e); + } + } + return null; + } + @Override public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) { LOG.info("feign eager-load start"); - + // Get services that are already warmed by LoadBalancerEagerContextInitializer Set skipServices = getLoadBalancerEagerLoadServices(); - + // Set to track already warmed services Set warmedServices = new HashSet<>(); - + // Warm up FeignClient services for (Object bean : applicationContext.getBeansWithAnnotation(FeignClient.class).values()) { try { @@ -95,7 +125,7 @@ public class FeignEagerLoadContextInitializer implements ApplicationListener getLoadBalancerEagerLoadServices() { Set services = new HashSet<>(); - if (loadBalancerEagerLoadProperties != null + if (loadBalancerEagerLoadProperties != null && loadBalancerEagerLoadProperties.isEnabled() && loadBalancerEagerLoadProperties.getClients() != null) { services.addAll(loadBalancerEagerLoadProperties.getClients()); } return services; } - - public static Target.HardCodedTarget getHardCodedTarget(Object proxy) { - try { - int count = 0; - Object invocationHandler = proxy; - // Avoid infinite loop - while (count++ < 100) { - invocationHandler = Proxy.getInvocationHandler(invocationHandler); - if (invocationHandler instanceof AopProxy) { - invocationHandler = JdkDynamicAopProxyUtils.getTarget(invocationHandler); - continue; - } - break; - } - - for (Field field : invocationHandler.getClass().getDeclaredFields()) { - field.setAccessible(true); - Object fieldValue = field.get(invocationHandler); - if (fieldValue instanceof Target.HardCodedTarget) { - return (Target.HardCodedTarget) fieldValue; - } - } - } - catch (Exception e) { - if (LOG.isDebugEnabled()) { - LOG.debug("proxy:{}, getTarget failed.", proxy, e); - } - } - return null; - } } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/eager/instrument/loadbalancer/LoadBalancerEagerContextInitializer.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/eager/instrument/loadbalancer/LoadBalancerEagerContextInitializer.java index f9d0e5dfc..641a413f8 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/eager/instrument/loadbalancer/LoadBalancerEagerContextInitializer.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/eager/instrument/loadbalancer/LoadBalancerEagerContextInitializer.java @@ -17,32 +17,33 @@ import org.springframework.context.ApplicationListener; public class LoadBalancerEagerContextInitializer implements ApplicationListener { - private static final Logger LOG = LoggerFactory.getLogger(LoadBalancerEagerContextInitializer.class); - - private final LoadBalancerClientFactory factory; - - private final List serviceNames; - - public LoadBalancerEagerContextInitializer(LoadBalancerClientFactory factory, List serviceNames) { - this.factory = factory; - this.serviceNames = serviceNames; - } - - @Override - public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) { - - LOG.info("spring cloud eager-load start"); - try { - if (!CollectionUtils.isEmpty(serviceNames)) { - for (String serviceName : serviceNames) { - LoadBalancerWarmUpUtils.warmUp(factory, serviceName); - } - } - LOG.info("spring cloud eager-load end"); - } catch (Exception e) { - if (LOG.isDebugEnabled()) { - LOG.debug("spring cloud eager-load failed.", e); - } - } - } + private static final Logger LOG = LoggerFactory.getLogger(LoadBalancerEagerContextInitializer.class); + + private final LoadBalancerClientFactory factory; + + private final List serviceNames; + + public LoadBalancerEagerContextInitializer(LoadBalancerClientFactory factory, List serviceNames) { + this.factory = factory; + this.serviceNames = serviceNames; + } + + @Override + public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) { + + LOG.info("spring cloud eager-load start"); + try { + if (!CollectionUtils.isEmpty(serviceNames)) { + for (String serviceName : serviceNames) { + LoadBalancerWarmUpUtils.warmUp(factory, serviceName); + } + } + LOG.info("spring cloud eager-load end"); + } + catch (Exception e) { + if (LOG.isDebugEnabled()) { + LOG.debug("spring cloud eager-load failed.", e); + } + } + } } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/eager/instrument/loadbalancer/LoadBalancerEagerLoadProperties.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/eager/instrument/loadbalancer/LoadBalancerEagerLoadProperties.java index 3ddaa2084..6068ba337 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/eager/instrument/loadbalancer/LoadBalancerEagerLoadProperties.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/eager/instrument/loadbalancer/LoadBalancerEagerLoadProperties.java @@ -7,24 +7,24 @@ import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties("spring.cloud.loadbalancer.eager-load") public class LoadBalancerEagerLoadProperties { - private List clients; + private List clients; - private boolean enabled = true; + private boolean enabled = true; - public boolean isEnabled() { - return enabled; - } + public boolean isEnabled() { + return enabled; + } - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } - public List getClients() { - return clients; - } + public List getClients() { + return clients; + } - public void setClients(List clients) { - this.clients = clients; - } + public void setClients(List clients) { + this.clients = clients; + } } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/org/springframework/aop/framework/JdkDynamicAopProxyUtils.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/org/springframework/aop/framework/JdkDynamicAopProxyUtils.java index b67a769e9..380d84f38 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/org/springframework/aop/framework/JdkDynamicAopProxyUtils.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/org/springframework/aop/framework/JdkDynamicAopProxyUtils.java @@ -22,7 +22,7 @@ import java.lang.reflect.Field; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class JdkDynamicAopProxyUtils { +public final class JdkDynamicAopProxyUtils { private static final Logger LOGGER = LoggerFactory.getLogger(JdkDynamicAopProxyUtils.class);