五分鐘技術趣談 | 淺析Nacos注冊中心
Part 01
單體架構到微服務
在web程序發展的早期,功能模塊都是被打包成單體應用,在一個web容器中運行,這個應用通常包含后端的所有模塊和前端,后端所有功能模塊訪問同一個數據庫。這樣的好處是開發效率高、易部署、易測試等。
圖1 單體架構
但隨著大規模的復雜應用出現,單體應用展現出了很多不足,包括:可維護性變差、版本迭代速度變慢、可擴展能力差等。
微服務架構的出現,解決了上述問題,微服務架構與單體應用的區別是,微服務架構是將一個龐大復雜的應用分解為多個小的互相鏈接的微服務,一個微服務一般只完成一類相關功能,比如:商品、訂單,每個服務可能有自己獨立的數據庫。
圖2 微服務架構
Part 02
注冊中心的演變
在微服務架構中,不同服務間免不了要相互通信,這就需要對這些服務信息進行管理,主要包括:服務的生產方、服務的消費方,服務方的物理位置等。如果微服務是部署在固定的機器上的,直接通過代碼就可以進行服務間調用,但實際情況是微服務可能部署在云環境,服務實例的網絡位置是動態分配的;此外根據實際負載情況部署節點也會動態調整,基于以上問題就需要一個服務管理工具,幫助我們實現服務的動態管理。
對于小體量的微服務,早期Nginx 就可以滿足服務管理的需求,具體是通過Nginx維護服務列表(upStream)實現。但隨著微服務數量的增多,吞吐量下降會很嚴重,Nginx配置文件維護起來也更加困難。
這時出現了注冊中心,微服務先注冊到注冊中心,如果服務1想調用服務2,需要先到服務中心去獲取相應接口,然后再去調用服務2,這樣就解決了上邊動態網絡位置的問題,最簡單的Nacos注冊中心如下所示:
圖3 Nacos注冊中心
Part 03
Nacos的服務發現
那么Nacos協調服務之間的調用細節是怎樣的呢?首先服務需要注冊,注冊的目的就是將服務ip、端口等信息上報給Nacos注冊中心;然后是服務訂閱,訂閱和退訂的目的是方便動態管理需要相互通信的服務,實現高效交互;最后是服務調用,至此完成了一個具體功能,具體實現過程如下:
1、每個服務啟動后會向Nacos注冊中心上報自己的網絡地址,服務和Nacos間通過grpc協議進行通信,Nacos通過域名解析出服務端ip列表,這個ip列表就是服務網絡地址的數據庫,Nacos會選擇其中一個ip創建 grpc 連接,并定時檢查連接狀態,當連接斷開,則自動選擇服務端ip列表中的下一個ip進行重連。
2、當客戶端發起訂閱時,注冊中心除了會同步返回最新的服務實例列表,還會異步的通過grpc推送給該訂閱者最新的服務實例列表,這樣做的目的是為了異步更新客戶端本地緩存的服務數據,一旦訂閱的服務有上下線變更,該服務所有的訂閱者會立刻收到最新的服務列表,并且將服務最新的實例數據更新到內存。
3、當客戶端進行服務調用的時候,訂閱者可以通過本地維護的服務列表獲取實例,或者直接從注冊中心獲取進行調用。
圖4 Nacos服務發現
Part 04
Nacos的核心功能
圖5 Nacos核心功能
除了上文提到的服務注冊和服務發現功能,Nacos的核心功能還包括心跳機制、服務同步和健康檢查。
1、心跳機制
服務注冊后,Nacos會為該服務分配一個心跳間隔,客戶端需要在該時間間隔內發送心跳包,證明服務健康狀態,如果客戶端在規定時間內沒有發送心跳包,Nacos認為該服務已下線,會從服務列表中將該服務移除,從而保障系統穩定性。
2、服務同步
Nacos Server集群之間會互相同步已注冊的服務,用來保證服務列表的一致性。Nacos自己實現了一個一致性協議名為Distro,服務注冊的時候會觸發Distro一次同步,每個Nacos節點之間會定時互相發送Distro數據,以此保證數據最終一致。
3、服務健康檢查
Nacos Server會開啟一個定時任務用來檢查注冊服務實例的健康情況,對于超過15秒沒有收到客戶端心跳的服務實例,會將它的healthy屬性置為false,客戶端無法調用healthy為false的服務,如果超過30秒沒有收到心跳,Nacos會直接將此服務剔除。
Part 05
Nacos的其他情況
常見的注冊中心組件有:Zookeeper、Eureka、Nacos、Consul等,下表為目前幾個主流注冊中心的情況對比:
圖片
Nacos支持注冊中心和配置中心,但對于小型項目來說,使用 Nacos 可能會過于復雜,不太適合初學者使用;Zookeeper用的最多的地方就是和Dubbo一起使用,不支持負載均衡策略,但可以通過其它組件實現,從性能上來講,zookeeper 也無法滿足注冊中心大規模且頻繁注冊寫的場景;Eureka通過去中心化的集群支持保證了注冊中心的整體可用性,因為停更的緣故,不支持一些新技術,同時Eureka屬于應用內的注冊方式,對應用的侵入性太強,且只支持Java應用。
Part 06
總結
Nacos自從阿里集團內配置中心 Diamond 孵化而來,發展至今,憑借其架構與性能優勢,已愈來愈受到眾廠商的青睞。依托其完善的社區環境,Nacos構建了龐大而成熟的生態,已成為服務發現解決方案領域中至關重要的一員。