|
|
@ -8,9 +8,8 @@ import com.alibaba.nacos.api.naming.listener.EventListener; |
|
|
|
import com.alibaba.nacos.api.naming.listener.NamingEvent; |
|
|
|
import com.alibaba.nacos.api.naming.pojo.ListView; |
|
|
|
import com.epmet.commons.tools.exception.ExceptionUtils; |
|
|
|
import com.netflix.client.config.IClientConfig; |
|
|
|
import com.netflix.loadbalancer.DynamicServerListLoadBalancer; |
|
|
|
import com.netflix.loadbalancer.ILoadBalancer; |
|
|
|
import com.netflix.loadbalancer.ZoneAwareLoadBalancer; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
|
|
@ -18,8 +17,6 @@ import org.springframework.cloud.netflix.ribbon.SpringClientFactory; |
|
|
|
import org.springframework.context.annotation.Configuration; |
|
|
|
|
|
|
|
import javax.annotation.PostConstruct; |
|
|
|
import java.lang.reflect.InvocationTargetException; |
|
|
|
import java.lang.reflect.Method; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.List; |
|
|
|
import java.util.concurrent.*; |
|
|
@ -136,18 +133,27 @@ public class NacosServiceListListenerRegisterer { |
|
|
|
* @date 2021.09.22 09:29:16 |
|
|
|
*/ |
|
|
|
private void doRefreshServerList(String serviceName) { |
|
|
|
// 刷新方式1:反射调用DynamicServerListLoadBalancer中的restOfInit()方法。该方法原来只执行一次,此处不推荐用
|
|
|
|
//ILoadBalancer loadBalancer = springClientFactory.getLoadBalancer(serviceName);
|
|
|
|
//if (loadBalancer instanceof ZoneAwareLoadBalancer) {
|
|
|
|
// ZoneAwareLoadBalancer zaLoadBalancer = (ZoneAwareLoadBalancer) loadBalancer;
|
|
|
|
// IClientConfig clientConfig = springClientFactory.getClientConfig(serviceName);
|
|
|
|
// try {
|
|
|
|
// Method restOfInitMethod = zaLoadBalancer.getClass().getSuperclass().getDeclaredMethod(REFRESH_SERVER_LIST_METHOD_NAME, IClientConfig.class);
|
|
|
|
// restOfInitMethod.setAccessible(true);
|
|
|
|
// restOfInitMethod.invoke(zaLoadBalancer, clientConfig);
|
|
|
|
// } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
|
|
|
|
// String errorStackTrace = ExceptionUtils.getErrorStackTrace(e);
|
|
|
|
// log.error("【LoadBalancer刷新服务列表】失败:{}", errorStackTrace);
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
|
|
|
|
// 刷新方式2:DynamicServerListLoadBalancer#updateListOfServers()该方法为ribbon定时刷新服务列表的时候真正调用的方法,但是加了@VisibleForTesting
|
|
|
|
// 暂且 1 try
|
|
|
|
ILoadBalancer loadBalancer = springClientFactory.getLoadBalancer(serviceName); |
|
|
|
if (loadBalancer instanceof ZoneAwareLoadBalancer) { |
|
|
|
ZoneAwareLoadBalancer zaLoadBalancer = (ZoneAwareLoadBalancer) loadBalancer; |
|
|
|
IClientConfig clientConfig = springClientFactory.getClientConfig(serviceName); |
|
|
|
try { |
|
|
|
Method restOfInitMethod = zaLoadBalancer.getClass().getSuperclass().getDeclaredMethod(REFRESH_SERVER_LIST_METHOD_NAME, IClientConfig.class); |
|
|
|
restOfInitMethod.setAccessible(true); |
|
|
|
restOfInitMethod.invoke(zaLoadBalancer, clientConfig); |
|
|
|
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { |
|
|
|
String errorStackTrace = ExceptionUtils.getErrorStackTrace(e); |
|
|
|
log.error("【LoadBalancer刷新服务列表】失败:{}", errorStackTrace); |
|
|
|
} |
|
|
|
if (loadBalancer instanceof DynamicServerListLoadBalancer) { |
|
|
|
DynamicServerListLoadBalancer dslb = (DynamicServerListLoadBalancer) loadBalancer; |
|
|
|
dslb.updateListOfServers(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|