圖解Nacos,注冊中心演變 + Nacos核心功能
大家好,我是哪吒。
一、什么是Nacos?
一個更易于構建云原生應用的動態服務發現、服務配置和服務管理平臺。
Nacos的關鍵特性:
Nacos的關鍵特性
二、注冊中心演變及其設計思想
1、RestTemplate調用遠程服務
如果此時,服務端接口接口名或參數或請求方式更改了,那么就得同步修改此restTemplate方法,感覺很麻煩。
RestTemplate調用遠程服務
2、通過Nginx維護服務列表(upStream)
通過Nginx維護服務列表(upStream),如果服務較多的話,在Nginx通過upStream的方式去配置的話,Nginx配置文件會變得非常的難以維護。
3、通過Nacos實現注冊中心
Nacos注冊中心
這種是最簡單的Nacos注冊中心,有若干個服務,都注冊到Nacos注冊中心,調用之前,先到Nacos獲取對應接口,然后進行實際的調用。
但是,思考一個問題,如果Nacos宕機了,怎么辦?如果從Nacos獲取到接口后,調用服務2時,服務2宕機了,怎么辦?
4、心跳版Nacos
心跳版Nacos
心跳版Nacos,服務1和服務2和Nacos之間維護一個心跳關系,每5秒跳一次,頻率不能太快或者太慢,否者會嗝屁的。
如果Nacos在5秒內沒有收到心跳,則表示服務掛了,Nacos會下線此服務。
對于超過15秒沒有收到客戶端心跳的服務實例,會將它的healthy屬性置為false,客戶端無法調用healthy為false的服務。
如果超過30秒沒有收到心跳,Nacos會直接將此服務剔除。
也可以通過服務端主動注銷的方式,停止注冊。
服務1調用服務2時,服務1會通過定時任務到Nacos中獲取在線的服務,保證所調用的服務一直都是健康在線的狀態。
獲取到之后,用緩存將其保存起來,然后通過負載均衡器調用服務2,此時,將不再使用服務端的負載均衡Nginx了。
三、Nacos Discovery
SpringBoot中引入Nacos Discovery,實現與Nacos的無縫連接,Nacos Discovery可以將服務自動注冊到Nacos服務端,并且能夠動態感知此服務,并刷新服務列表。并將服務的host、port、URL等信息注冊到Nacos。
Nacos 的配置項信息:
四、Nacos核心功能
Nacos核心功能
1、服務注冊
Nacos Client會通過發送REST請求向Nacos Server注冊自己的服務,提供自身的元數據,比如host、port、url等信息,Nacos Server在收到注冊請求后,會將這些數據信息存儲在一個雙層的內存map中。
2、服務心跳
服務注冊后,服務消費者和Nacos Server之間會維護一個心跳,定時通知server,此服務還活著,防止被剔除掉。
3、服務同步
Nacos Server集群之間會互相同步已注冊的服務,用來保證服務列表的一致性。
4、服務發現
服務消費者在調用服務提供者的服務時,會發送一個REST請求到Nacos Server,獲取健康的服務列表,然后將其緩存到本地,同時開啟一個定時任務,定時訪問Nacos Server,然后更新本地緩存。
5、服務健康檢查
Nacos Server會開啟一個定時任務用來檢查注冊服務實例的健康情況,對于超過15秒沒有收到客戶端心跳的服務實例,會將它的healthy屬性置為false,客戶端無法調用healthy為false的服務,如果超過30秒沒有收到心跳,Nacos會直接將此服務剔除。
五、作為注冊中心
1、Nacos目前功能最全,用的也最多;
2、Eureka,因為挺更的緣故,比較新的技術都不支持了,目前很多公司都將Eureka換成Nacos了,不推薦使用;
3、Zookeeper,用的最多的地方就是和Dubbo一起使用,不支持負載均衡策略,但可以通過其它組件實現;
4、Consul支持的也很多;
CAP,C一致性,A可用性,P分區容錯性
Nacos | Eureka | Zookeeper | Consul | |
一致性協議 | CP + AP | CP | AP | CP |
訪問協議 | HTTP/DNS | HTTP | TCP | HTTP/DNS |
健康檢查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | Keep Live | TCP/HTT[/gRPC/Cmd |
負載均衡策略 | 權重/metadata/Seletor | Ribbon | - | Fabio |
雪崩保護 | 有 | 有 | 無 | 無 |
自動注銷 | 支持 | 支持 | 支持 | 支持 |
監聽 | 支持 | 支持 | 支持 | 支持 |
多數據中心 | 支持 | 支持 | 支持 | 不支持 |
跨注冊中心同步 | 支持 | 不支持 | 不支持 | 支持 |
Spring Cloud集成 | 支持 | 支持 | 支持 | 支持 |
Dubbo集成 | 支持 | 不支持 | 支持 | 支持 |
K8S集成 | 支持 | 不支持 | 支持 | 不支持 |
六、作為配置中心
1、SpringBoot集成Nacos
Nacos使用key/value形式存儲配置信息,為分布式系統中的外部化配置提供服務支持。
(1)maven文件
(2)配置文件
(3)主方法啟動類
2、支持配置的動態更新
一秒刷新一次。
3、可支持profile粒度的配置
4、支持自定義 namespace 的配置
開發測試環境和生產環境的資源(如配置、服務)隔離等,比如dev和prod。
5、支持自定義 Group 的配置
在沒有明確指定 ${spring.cloud.nacos.config.group}配置的情況下, 默認使用的是 DEFAULT_GROUP 。如果需要自定義自己的 Group,可以通過以下配置來實現:
6、配置優先級
profile > 默認配置文件 > extension-configs(下標越大優先級越高) > shared-configs(下標越大優先級越高)。
7、@RefreshScope
一般都是通過@Value的形式讀取配置文件中的信息,但是無法感知修改后的值,需要利用@RefreshScope動態刷新。
8、Spring Cloud Config 橫向對比Nacos
(1) Spring Cloud Config需要結合Git使用,動態變更需要配合Bus 消息總線來通知所有的客戶端變化。
(2)Spring Cloud Config沒有可視化界面。
(3)Nacos使用長輪詢更新配置,速度上秒殺Spring Cloud Config。
本文轉載自微信公眾號「哪吒編程」,可以通過以下二維碼關注。轉載本文請聯系哪吒編程公眾號。