各注册中心consul eureka 以及nacos的服务发现原理

springcloud的注册中心都会跟ribbon进行整合进行负载均衡,既然要进行负载均衡,那么就需要进行服务列表的发现,而ribbon为了让每个注册中心进行整合,提供了一个抽象类:AbstractServerList

可以参考我的ribbon源码分析:Ribbon源码分析(二)-- 服务列表的获取和负载均衡算法分析 - yangxiaohui227 - 博客园 (cnblogs.com)

 ribbon源码中,通过servers = serverListImpl.getUpdatedListOfServers(); 方法获取服务列表,而serverListImpl就是 ServerList<T>的实现类

下面debug举例说明consul注册中心是如何实现该方法的:

 

 

 

 

 

 如果我们自己定义一个注册中心应该怎么做呢,其实只要继承AbstractServerList这个类,然后往容器中注入即可

 

 看效果,调用到第三方服务时,就会通过该实现类查询服务列表,由于我的是空实现,所以会打印上面的日志

 其他注册中心服务发现同理,另外,服务列表的更新如何实现呢?在riibbon源码有说,感兴趣的可以看,本质是弄个定时调度任务,然后不断调用上面的实现类



原文地址:https://www.cnblogs.com/yangxiaohui227/p/15104030.html