注冊一個服務

image.png

image.png
如果這個服務之前沒有,第一次注冊,構建這個服務信息

image.png
如果服務有了,就增加這個服務的實例ip

image.png
這個步驟就是和增加實例ip的接口是一樣的邏輯了
增加實例ip的接口

image.png

image.png

image.png
這個真的是有點繞啊,終于來到真正處理的onAddIP4Dom了
這里的重點就newIPs了,就是更新后的ip列表

image.png

image.png
ipAddressMap.values() 其實就是舊的ip加上newIPs

image.png
public static final String IPADDRESS_DATA_ID_PRE = "com.alibaba.nacos.naming.iplist.";
這個就是存ip列表的key了,后面就是我之前說過的raft的東西了。
我們再回頭看看newIPs是怎么來的

image.png
其實是最開始請求參數(shù)中的ipList來的。
我們也可以回想起注冊服務的時候就出現(xiàn)過的

image.png
獲取一個服務的所有ip

image.png
srvedIPs = domObj.srvIPs(clientIP, Arrays.asList(StringUtils.split(clusters, ",")));
如果沒傳clusters參數(shù),就找到所有的cluster

image.png
從每個cluster拿出ip列表,組合就得到所有的ip列表了

image.png
那么問題來了,我們注冊ip的時候,我們只是改了raft的對應的key的值,cluster的數(shù)據(jù)怎么保持一致的呢?
VirtualClusterDomain 在構造方法中注冊了一個RaftListener

image.png

image.png
public static final String IPADDRESS_DATA_ID_PRE = "com.alibaba.nacos.naming.iplist.";
關注的這個key就是ip列表的key了。
raft存的ip列表變化的時候,就會觸發(fā):

image.png