⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 https://www.jianshu.com/p/e1e3ecedc8b3 「黄云斌」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

注册一个服务

如果这个服务之前没有,第一次注册,构建这个服务信息

如果服务有了,就增加这个服务的实例ip

这个步骤就是和增加实例ip的接口是一样的逻辑了


增加实例ip的接口

这个真的是有点绕啊,终于来到真正处理的onAddIP4Dom了

这里的重点就newIPs了,就是更新后的ip列表

ipAddressMap.values() 其实就是旧的ip加上newIPs

public static final String IPADDRESS_DATA_ID_PRE = "com.alibaba.nacos.naming.iplist.";

这个就是存ip列表的key了,后面就是我之前说过的raft的东西了。

我们再回头看看newIPs是怎么来的

其实是最开始请求参数中的ipList来的。

我们也可以回想起注册服务的时候就出现过的


获取一个服务的所有ip

srvedIPs = domObj.srvIPs(clientIP, Arrays.asList(StringUtils.split(clusters, ",")));

如果没传clusters参数,就找到所有的cluster

从每个cluster拿出ip列表,组合就得到所有的ip列表了

那么问题来了,我们注册ip的时候,我们只是改了raft的对应的key的值,cluster的数据怎么保持一致的呢?

VirtualClusterDomain 在构造方法中注册了一个RaftListener

public static final String IPADDRESS_DATA_ID_PRE = "com.alibaba.nacos.naming.iplist.";

关注的这个key就是ip列表的key了。

raft存的ip列表变化的时候,就会触发:

文章目录
  1. 1. 注册一个服务
    1. 1.0.1. 如果这个服务之前没有,第一次注册,构建这个服务信息
    2. 1.0.2. 如果服务有了,就增加这个服务的实例ip
    3. 1.0.3. 这个步骤就是和增加实例ip的接口是一样的逻辑了
  2. 1.1. 增加实例ip的接口
    1. 1.1.1. 这个真的是有点绕啊,终于来到真正处理的onAddIP4Dom了
      1. 1.1.1.1. 这里的重点就newIPs了,就是更新后的ip列表
    2. 1.1.2. ipAddressMap.values() 其实就是旧的ip加上newIPs
    3. 1.1.3. 这个就是存ip列表的key了,后面就是我之前说过的raft的东西了。
    4. 1.1.4. 其实是最开始请求参数中的ipList来的。
  • 2. 获取一个服务的所有ip
    1. 2.0.1. 如果没传clusters参数,就找到所有的cluster
    2. 2.0.2. 从每个cluster拿出ip列表,组合就得到所有的ip列表了
  • 2.1. 那么问题来了,我们注册ip的时候,我们只是改了raft的对应的key的值,cluster的数据怎么保持一致的呢?
    1. 2.1.0.1. VirtualClusterDomain 在构造方法中注册了一个RaftListener
  • 2.1.1. 关注的这个key就是ip列表的key了。
  • 2.1.2. raft存的ip列表变化的时候,就会触发: