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