Nacos 集群部署模式最佳實(shí)踐

作者 |?kiritomoe
1 前言
Nacos 支持兩種部署模式:單機(jī)模式和集群模式。在實(shí)踐中,我們往往習(xí)慣用單機(jī)模式快速構(gòu)建一個(gè) Nacos 開發(fā)/測試環(huán)境,而在生產(chǎn)中,出于高可用的考慮,一定需要使用 Nacos 集群部署模式。我的上一篇文章《一文詳解 Nacos 高可用特性》提到了 Nacos 為高可用做了非常多的特性支持,而這些高可用特性大多數(shù)都依賴于集群部署模式。這篇模式文章便是給大家介紹一下,在實(shí)踐中可以被采用的幾種集群部署模式,無論你是希望自行搭建 Nacos,還是希望對 MSE 商業(yè)版 Nacos 有一個(gè)更加深刻的理解,我都很樂意跟你分享下面的內(nèi)容。
由于篇幅限制,本文不會介紹如何將一個(gè)多節(jié)點(diǎn)的 Nacos 集群啟動起來,主要介紹的是一個(gè)多節(jié)點(diǎn)的 Nacos 集群啟動之后,我們的應(yīng)用如何很好地連接到 Nacos 集群,即客戶端視角。這中間我們會引入一些其他組件以解決一些問題,本文標(biāo)題也可以叫做《Nacos 接入點(diǎn)最佳實(shí)踐》。我將會介紹以下三種方案:直連模式、 VIP 模式和地址服務(wù)器模式,并對它們進(jìn)行對比。
2 直連模式
直連模式是部署上最簡單,也是最容易理解的一種模式

采用直連模式后,典型的開發(fā)場景配置如下:
nacos-client 配置
Properties?properties?=?new?Properties();
properties.setProperty(PropertyKeyConst.SERVER_ADDR,?"192.168.0.1:8848,192.168.0.2:8848,192.168.0.3:8848");
NamingService?namingService?=?NacosFactory.createNamingService(properties);
注意這里的 PropertyKeyConst.SERVER_ADDR 的字面量是:serverAddr
Dubbo 配置
dubbo.registry.address=192.168.0.1:8848,192.168.0.2:8848,192.168.0.3:8848
dubbo.registry.protocol=nacos
如果有一天,Nacos 的 IP 變了,例如擴(kuò)縮容,機(jī)器置換,集群遷移等場景,所有的應(yīng)用都需要修改,這樣的方式并不靈活。所以這種模式并不是生產(chǎn)推薦的模式。
模式分析
高可用性。集群本身的擴(kuò)縮容必須要改動業(yè)務(wù)代碼才能被感知到,出現(xiàn)節(jié)點(diǎn)故障需要緊急下線、緊急擴(kuò)容等場景,讓業(yè)務(wù)修改代碼是不現(xiàn)實(shí)的,不符合高可用的原則。 可伸縮性。同上,可伸縮性不友好。 架構(gòu)簡單,用戶理解成本低 沒有引入額外的組件,沒有新增組件的運(yùn)維成本
3 VIP 模式
VIP(Virtual IP) 模式可以很好的解決直連模式 IP 變化所帶來的應(yīng)用批量修改的問題。什么是 VIP 呢?

Real Server:處理實(shí)際請求的后端服務(wù)器節(jié)點(diǎn)。 Director Server:指的是負(fù)載均衡器節(jié)點(diǎn),負(fù)責(zé)接收客戶端請求,并轉(zhuǎn)發(fā)給 RS。 VIP:Virtual IP,DS 用于和客戶端通信的 IP 地址,作為客戶端請求的目標(biāo) IP 地址。 DIP:Directors IP,DS 用于和內(nèi)部 RS 通信的 IP 地址。 RIP:Real IP,后端服務(wù)器的 IP 地址。 CIP:Client IP,客戶端的 IP 地址。
我這里介紹時(shí)并沒有用【負(fù)載均衡模式】,而是用了【VIP 模式】,主要是為了跟 Nacos 官方文檔保持一致。事實(shí)上,VIP 的叫法在阿里內(nèi)部比較流行,所以在開源 Nacos 時(shí)也被習(xí)慣性的帶了出去。

知乎砍出正義一刀,PDD祭出終極防御:“供應(yīng)商員工”!輕松化解攻勢!
VIP 幫助 Nacos Client 屏蔽了后端 RIP,相對于 RIP 而言,VIP 很少會發(fā)生變化。以擴(kuò)容場景為例,只需要讓 VIP 感知到即可,Nacos Client 只需要關(guān)注 VIP,避免了擴(kuò)容引起的代碼改造。
只要是具備負(fù)載均衡能力的組件,均可以實(shí)現(xiàn) VIP 模式,例如開源的 Nginx 以及阿里云負(fù)載均衡 SLB。
采用 VIP 模式后,代碼不需要感知 RIP,典型的開發(fā)場景配置如下:
nacos-client 配置
Properties?properties?=?new?Properties();
properties.setProperty(PropertyKeyConst.SERVER_ADDR,?"{VIP}:8848");
NamingService?namingService?=?NacosFactory.createNamingService(properties);
Dubbo 配置
dubbo.registry.address={VIP}:8848
dubbo.registry.protocol=nacos
域名配置
VIP 模式和直連模式都不具備可讀性,所以在實(shí)際生產(chǎn)中,往往還會給 VIP 掛載一個(gè)域名。
域名背后甚至可以掛載 2 個(gè) VIP 用作高可用,路由到相同的 rs;同時(shí)域名的存在也讓 VIP 的置換變得更加靈活,當(dāng)其中一臺出現(xiàn)問題后,域名的 DNS 解析只會路由到另外一個(gè)正常的 VIP 上,為平滑置換預(yù)留了足夠的余地。
tips:一個(gè)域名可以綁定多個(gè) A 記錄,一個(gè) A 記錄對應(yīng)一個(gè) IPv4 類型的 VIP,DNS 域名服務(wù)器了對多個(gè) A 記錄會有負(fù)載均衡策略和健康檢查機(jī)制
VIP 模式的最終生產(chǎn)高可用版架構(gòu)便產(chǎn)生了:

典型的開發(fā)場景配置只需要將 VIP 替換為域名即可
nacos-client 配置
Properties?properties?=?new?Properties();
properties.setProperty(PropertyKeyConst.SERVER_ADDR,?"mse-abc123qwe-nacos.mse.aliyuncs.com:8848");
NamingService?namingService?=?NacosFactory.createNamingService(properties);
Dubbo 配置
dubbo.registry.address=mse-abc123qwe-nacos.mse.aliyuncs.com:8848
dubbo.registry.protocol=nacos
模式分析
高可用性。域名的可用性需要由 DNS 域名服務(wù)器負(fù)責(zé),可用性保障較高;VIP 需要由高可用的負(fù)責(zé)均衡組件支持,且流量經(jīng)過負(fù)載均衡轉(zhuǎn)發(fā),對 VIP 的實(shí)現(xiàn)有較高可用性的要求。 可伸縮性。水平擴(kuò)縮容時(shí),只需要讓 VIP 感知即可,可伸縮性好。 依賴了域名解析系統(tǒng)和負(fù)載均衡系統(tǒng),生產(chǎn)部署時(shí),需要有配套設(shè)施的支持。
4 地址服務(wù)器模式
地址服務(wù)器介紹
說起地址服務(wù)器,可能大家對這個(gè)詞會感到陌生,因?yàn)榈刂贩?wù)器的概念主要在阿里內(nèi)部比較普及,也是阿里中間件使用的最廣的一種地址尋址模式。但是在開源領(lǐng)域,鮮有人會提及,但對于 Nacos 部署模式而言,地址服務(wù)器模式是除了 VIP 模式之外,另外一個(gè)生產(chǎn)可用的推薦部署方式。
地址服務(wù)器是什么?顧名思義,是用來尋址地址的服務(wù)器,發(fā)送一個(gè)請求,返回一串地址列表。盡管在阿里內(nèi)部使用的真實(shí)地址服務(wù)器比這復(fù)雜一些,但下圖這個(gè)簡單交互邏輯,幾乎涵蓋了地址服務(wù)器 90% 的內(nèi)容。

實(shí)現(xiàn)一個(gè)簡易版本的地址服務(wù)器并不困難,推薦使用 nginx 搭建一個(gè)靜態(tài)文件服務(wù)器管理地址, 當(dāng)然你可以使用 Java!
@Controller
public?class?AddressServerController?{
????@RequestMapping("/nacos/serverlist")
????public?ResponseEntity?serverlist()? {
????????return?ResponseEntity.ok().
????????????header("Content-Type",?"text/plain").
????????????body("192.168.0.1:8848\r\n"?+
????????????????????"192.168.0.2:8848\r\n"?+
????????????????????"192.168.0.3:8848\r\n"
????????????);
????}
}
使用地址服務(wù)器可以完成集群地址和客戶端配置的解耦,解決直連模式中無法動態(tài)感知集群節(jié)點(diǎn)變化的問題??蛻舳烁鶕?jù)地址服務(wù)器返回的列表,隨后采取直連模式連接;并且在客戶端啟動后,會啟動一個(gè)定時(shí)器,輪詢感知 AddressServer 的變化,進(jìn)而及時(shí)更新地址列表。
并且地址服務(wù)器建議配置域名,增加可讀性。所以最后的部署交互架構(gòu)是這樣的:

熟悉 RPC 的朋友看到這里應(yīng)該能夠很好地對 VIP 模式和地址服務(wù)器模式做一個(gè)類比。
VIP 模式是 DNS 類的服務(wù)端負(fù)載均衡技術(shù) 地址服務(wù)器是類似服務(wù)發(fā)現(xiàn)機(jī)制的客戶端負(fù)載均衡技術(shù)
nacos-client 的源碼專門適配了地址服務(wù)器模式,我們只需要配置好 addressServer 的 endpoint 即可
nacos-client 配置
Properties?properties?=?new?Properties();
properties.setProperty(PropertyKeyConst.ENDPOINT,?"{addressServerDomain}");
properties.setProperty(PropertyKeyConst.ENDPOINT_PORT,?"8080");
NamingService?namingService?=?NacosFactory.createNamingService(properties);
注意,這里 PropertyKeyConst.ENDPOINT 的字面量是:endpoint?,配置的是地址服務(wù)器的地址。
Dubbo 配置
dubbo.registry.address=0.0.0.0?endpoint=127.0.0.1&endpointPort=8080
dubbo.registry.protocol=nacos
dubbo.registry.address 的 url 可以任意填寫,因?yàn)楫?dāng) serverAddr 和 endpoint 同時(shí)存在時(shí),默認(rèn)是優(yōu)先從地址服務(wù)器去選址的。
此時(shí),只需要把真實(shí)的 Nacos Server IP 配置到地址服務(wù)器中即可。
Dubbo 通過 url 的 kv 屬性將值透傳給 Nacos 創(chuàng)建 Nacos-Client。Dubbo + Nacos 使用地址服務(wù)器模式時(shí),建議 Dubbo 版本 >= 2.7.4,nacos-client 版本 >= 1.0.1
模式分析
高可用性。域名的可用性需要由 DNS 域名服務(wù)器負(fù)責(zé),可用性保障較高;地址服務(wù)器的職責(zé)單一,有較高的可用性;運(yùn)行時(shí) Client 直連 Nacos Server 節(jié)點(diǎn),可用性靠 nacos-sdk 保障。 可伸縮性。水平擴(kuò)縮容時(shí),只需要讓地址服務(wù)器感知即可,可伸縮性好。 依賴了域名解析系統(tǒng)和地址服務(wù)器,生產(chǎn)部署時(shí),需要有配套設(shè)施的支持。
5 部署模式對比
| 直連模式 | VIP 模式 | 地址服務(wù)器模式 | |
|---|---|---|---|
| 轉(zhuǎn)發(fā)模式 | 直連 | 代理(網(wǎng)絡(luò)多一跳) | 直連 |
| 高可用 | 弱,代碼配置不靈活,節(jié)點(diǎn)故障時(shí)無法批量變更 | 強(qiáng) | 強(qiáng) |
| 可伸縮性 | 弱 | 強(qiáng) | 強(qiáng) |
| 部署成本 | 無 | 負(fù)載均衡組件運(yùn)維成本高 | 地址服務(wù)器運(yùn)維成本低 |
| 負(fù)載均衡模式 | nacos-sdk 客戶端負(fù)載均衡 | 負(fù)載均衡組件提供負(fù)載均衡能力 | nacos-sdk 客戶端負(fù)載均衡 |
| 開源接受度 | 高 | 高 | 低,地址服務(wù)器模式在開源領(lǐng)域不太普遍 |
| 企業(yè)級能力 | 不方便 | 靈活 | 靈活 |
| 跨網(wǎng)絡(luò) | 內(nèi)網(wǎng)環(huán)境,平坦網(wǎng)絡(luò) | VIP 模式靈活地支持反向代理、安全組、ACL 等特性,可以很好的工作在內(nèi)/外網(wǎng)環(huán)境中,使得應(yīng)用服務(wù)器和 Nacos Server 可以部署在不同的網(wǎng)絡(luò)環(huán)境中,借助 VIP 打通 | 內(nèi)網(wǎng)環(huán)境,平坦網(wǎng)絡(luò) |
| 推薦使用環(huán)境 | 開發(fā)測試環(huán)境 | 生產(chǎn)環(huán)境,云環(huán)境 | 生產(chǎn)環(huán)境 |
Nacos 這款開源產(chǎn)品很好地支持了地址服務(wù)器這種模式,所以無論是大、中、小型公司在自建 Nacos 時(shí),都可以選擇地址服務(wù)器模式去構(gòu)建生產(chǎn)高可用的 Nacos 集群,地址服務(wù)器組件相對而言維護(hù)簡單,Nginx,Java 構(gòu)建的 Web 服務(wù)器均可以輕松實(shí)現(xiàn)一個(gè)地址服務(wù)器。使用地址服務(wù)器后,nacos-client 與 nacos-server 之間仍然是直連訪問,所以可以很好的運(yùn)作在平坦網(wǎng)絡(luò)下。
VIP 模式同樣推薦在自建場景使用,但運(yùn)維成本相對地址服務(wù)器還是要高一些,可以根據(jù)自己公司的運(yùn)維體系評估。經(jīng)過了 VIP 的轉(zhuǎn)發(fā),有利有弊。弊端比較明顯,網(wǎng)絡(luò)多了一跳,對于內(nèi)網(wǎng)環(huán)境這樣的平坦網(wǎng)絡(luò)而言,是不必要的;優(yōu)勢也同樣明顯,大公司往往環(huán)境比較復(fù)雜,數(shù)據(jù)中心之間有網(wǎng)絡(luò)隔離,應(yīng)用和中間件可能部署在不同的網(wǎng)絡(luò)環(huán)境中,借助于 VIP 可以很好地做網(wǎng)絡(luò)打通,并且基于 VIP 可以很好實(shí)現(xiàn)安全組、ACL 等特性,更符合企業(yè)級訴求。
當(dāng)然,組合使用地址服務(wù)器 + VIP 也是可以的,可以充分的融合兩者的優(yōu)勢:

6 MSE Nacos 的實(shí)踐
上述場景主要介紹了三種模式的具體部署方案,以及自建 Nacos 場景如何做到高可用,最后要介紹的是阿里云環(huán)境 MSE 是如何部署的。
MSE(微服務(wù)引擎)提供了 Nacos 注冊中心中心的全托管能力,除了要做上述提到的高可用、可伸縮、易用性,還要考慮以下的因素:
開源接受度。避免給用戶帶來太多理解成本,盡量做到對標(biāo)開源,這樣用戶接受度才會高。 網(wǎng)絡(luò)隔離。MSE 提供的是 BaaS 化的能力,Nacos Server 部署在云產(chǎn)品 VPC,與用戶 VPC 是隔離的,需要解決網(wǎng)絡(luò)隔離問題。 網(wǎng)絡(luò)安全。MSE Nacos 是獨(dú)享模式,網(wǎng)絡(luò)上租戶隔離是最基本的要求。除此之外企業(yè)級用戶會對 MSE Nacos 提出安全組/ACL 控制的訴求,這些都需要考量。
綜上,MSE Nacos 最終采用的是域名 + SLB 的 VIP 模式。

MSE Nacos 提供兩個(gè)域名,其中公網(wǎng)域名可以用做本地開發(fā)測試,或者自建環(huán)境、混合云等場景的接入點(diǎn),內(nèi)網(wǎng)域名用做阿里云生產(chǎn)環(huán)境接入點(diǎn)。公網(wǎng)域名有帶寬限制,需要在集群創(chuàng)建時(shí)根據(jù)場景選擇合適的帶寬,而內(nèi)網(wǎng)域名則沒有帶寬限制。公網(wǎng)域名請注意添加 IP 訪問白名單。
MSE 微服務(wù)引擎用戶交流群釘釘群號:23371469
官網(wǎng)首頁:https://mse.console.aliyun.com/
7 總結(jié)
本文介紹了 Nacos 的三種部署模式,并就高可用、可伸縮、易用性等方面對各個(gè)模式進(jìn)行了介紹,并對自建 Nacos 場景的部署選型進(jìn)行了分析,同時(shí)介紹了 MSE Nacos 企業(yè)版的部署架構(gòu),對云環(huán)境部署 Nacos 進(jìn)行了補(bǔ)充。
文章提及的三種模式其實(shí)也都是中間件組件常見的部署模式,不僅僅 Nacos,例如 Redis、DB 等場景,同樣有參考價(jià)值。
本文提及了地址服務(wù)器這個(gè)可能在開源領(lǐng)域不太常見的組件,在阿里內(nèi)部則用的非常普遍。
另外,Nacos 本身也提供了 addressServer 模塊,出于篇幅考慮沒有在本文中提及,后續(xù)我會單獨(dú)整理一篇文章介紹,感興趣的同學(xué)可以自行參考 Nacos 官方文檔和官方博客中的內(nèi)容。
往期推薦

