作為一個註冊中心,和eureka類似,核心的功能點:
1.服務註冊:nacos客戶端攜帶自身資訊向nacos服務端進行註冊。
2.服務心跳:客戶端定時向服務端傳送心跳,告知服務端自己處於可用狀態
3.服務健康檢查:服務端定時檢查客戶端是否有傳送心跳,如果超過15s沒有收到心跳,那麼就會將該客戶端例項設定為不健康狀態,如果超過30s沒有收到心跳則會剔除該客戶端例項
4.服務同步:服務端為了高可用,通常都是叢集模式,那麼叢集之間需要進行資料的同步。
5.服務發現:客戶端向服務端查詢所有註冊的服務列表。客戶端獲取到之後會放入自己的本地快取,需要使用的時候,先從本地快取拿,沒有再去服務獲取。同時還有定時任務,去服務端拉取註冊列表,更新本地快取,如果失敗拉取的間隔時間會根據失敗次數增加。
原始碼分析:
從客戶端開始入手,切入點當然是spring-cloud-starter-alibaba-nacos-discovery包的spring.factories檔案中的自動配置類
1.最為關鍵的就是NacosDiscoveryAutoConfiguration 和 NacosServiceRegistryAutoConfiguration 這兩個配置類了,eureka是通過SmartLifecycle整合進spring的,從配置類中建立的NacosAutoServiceRegistration這個類,追溯一下可以看到這個是實現了ApplicationListener介面,所以nacos是通過這個介面整合進spring的
2.nacos原始碼中很多地方都是初始化的時候就設定好了定時任務,或者執行緒池,後續的任務都是直接扔進去執行就是了。
3.nacos提供了AP和CP 兩種模式。非持久化例項註冊,資料放在記憶體中,和eureka類似,叢集節點之間都是點對點的。如果是持久化例項,則是CP模式,叢集節點會有leader和follower,客戶端註冊的資料會寫入磁碟,節點重啟時會從磁碟上把資料讀取出來。
4.和eureka不同的是,nacos還有主動推送功能,eureka的註冊列表發生改變的時候,eureka是失效讀寫快取,等待下一次只讀快取(如果使用了)來更新時,重建讀寫快取,或者客戶端拉取資料時重建讀寫快取。nacos並沒有使用多級快取。當註冊列表發生改變時,會傳送ServiceChangeEvent事件,然後主動向客戶端推送資訊
原始碼關鍵流程圖:基於1.4.0