德陽市住房和城鄉(xiāng)建設局網(wǎng)站首頁網(wǎng)站推廣上首頁
1.Nacos安裝部署
1.1 下載安裝
nacos官網(wǎng)提供了安裝部署教程,其下載鏈接指向github官網(wǎng),選擇合適版本即可。如訪問受阻可直接使用以下最新穩(wěn)定版壓縮包:📎nacos-server-2.1.0.zip,后續(xù)我們也可能會更改為其他版本做更多測試。
公司一般會采用最新版落后幾個版本的穩(wěn)定版當做生產(chǎn)版本,避免一些新特性引發(fā)的未知問題。
1.2 啟動
- window請直接進入路徑:cd nacos/bin后雙擊startup.sh啟動,或按照下述指令啟動
cd nacos/bin
startup.cmd -m standalone
- linux或mac進入路徑:nacos/bin/,cmd控制臺執(zhí)行
cd nacos/bin
sh startup.sh -m standalone
注意:如存在端口沖突,可至路徑:nacos/conf/application.properties 中修改后啟動

注意:nacos存儲路徑不可有中文。如遇啟動異常,
- mac可至路徑:nacos/logs/start.out 查看具體錯誤信息
- windows可至路徑:nacos/logs/nacos.log 查看具體錯誤信息,正常啟動日志如下
1.3 訪問
成功啟動后訪問如下地址:http://localhost:8848/nacos/#/login,默認用戶名/密碼:nacos/nacos

2.整合Nacos注冊中心
2.1 依賴導入
父工程新增spring-cloud-alibaba依賴
<!--nacos依賴-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.6.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>
因為Spring-cloud-alibaba自身也是集成了多個組件,所以這里只需引入alibaba大管家即可

子工程去除eureka依賴
注意order-service、user-service均需刪除
子工程新增spring-cloud-alibaba-nacos依賴
注意:不同于父工程,是nacos-discovery,order-service、user-service均需添加
<!--nacos依賴-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
至此,三個工程pom如下(eureka相關工程無需操作):
- 父pom:📎pom.xml
- user-service pom:📎pom.xml
- order-service pom:📎pom.xml
2.2 配置文件修改注冊中心
子工程均去除eureka注冊配置,均新增nacos配置
spring:cloud:nacos:server-addr: localhost:8848 #nacos服務地址
至此,兩個業(yè)務工程application.yml如下(eureka相關工程無需操作):
- order-service:📎application.yml
- user-service:📎application.yml
2.3 啟動工程并驗證
啟動應用后訪問Nacos會發(fā)現(xiàn)服務已完成注冊
如啟動遇到工程仍存在Eureka依賴,可嘗試重新編譯整個工程,或手動刪除target文件夾后再啟動

3.Nacos服務分級模型

不同于Zookeeper沒有針對服務發(fā)現(xiàn)設計數(shù)據(jù)模型,它的數(shù)據(jù)是以一種更抽象的樹形K-V組織的,因此理論上可以存儲任何語義的數(shù)據(jù)。而Eureka或Consule都做到了實例級別的數(shù)據(jù)擴展,這能滿足大多數(shù)場景但無法滿足大規(guī)模和多環(huán)境的服務數(shù)據(jù)存儲。Nacos經(jīng)過多年經(jīng)驗后提煉出上述模型,其特點在于:服務-集群-實例三層模型,可以滿足所有場景下的數(shù)據(jù)存數(shù)和管理。
通過設置不同的集群所在參數(shù),可以保證相同集群間優(yōu)先調用,減少網(wǎng)絡開銷。當本地集群服務無法拉取時,再去跨集群調用。對于此工程我們只需要設置提付提供者集群參數(shù):
cloud:nacos:server-addr: localhost:8848 # nacos服務地址discovery:cluster-name: HZ # 聲明集群名稱杭州
此時訪問Nacos會發(fā)現(xiàn)其增加了集群屬性發(fā)生變化,原為:Default

為模擬多集群場景,此時我們復制一個新的userApplicatio3啟動類,具體操作步驟如下:
- 復制一個新的userApplicatio3啟動類,設置其啟動端口:-Dserver.port=8083
- 更改配置文件集群屬性為GZ(注意不要停userApplication、userApplication2,否則原注冊信息會失效)
- 啟動userApplication3并訪問nacos

此時查看Nacos服務信息會發(fā)現(xiàn),已經(jīng)有了兩個集群信息。

此時我們就完成Nacos分級模型的驗證,在實際的工作、生產(chǎn)環(huán)境中,一般來說服務都是同集群部署,不需要開發(fā)人員聲明式感知服務所在集群信息。
4.NacosRule負載均衡策略
修改oder-service集群屬性、負載均衡策略,調整為如下:
注意:此時需要將OrderApplication中的代碼聲明式負載均衡策略注釋或刪除(約定大于配置),否則失效
cloud:nacos:server-addr: localhost:8848 #nacos服務地址discovery:cluster-name: HZ # 聲明集群名稱杭州
userservice: # 給某個微服務配置負載均衡規(guī)則,這里是userservice服務ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負載均衡規(guī)則
此時重啟應用后會發(fā)現(xiàn)orderservice集群屬性存在變化:

訪問oder-service服務會發(fā)現(xiàn)其優(yōu)先匹配HZ集群的userApplication、userApplication2。
上面我們提到優(yōu)先調用本集群的服務,當本集群服務實例不存在時會考慮跨集群調用,故我們停掉userApplication、userApplication2,再做一次訪問會發(fā)現(xiàn)訪問正常,同時請求日志打到userApplication3。

5.Nacos權重控制
基于上一章節(jié)的負載均衡算法,我們可以了解到:存在部分機器性能更優(yōu),此時該機器理應得到更多的流量分配,nacos通過設置服務權重解決這一問題,權重越大訪問評率越高,配置頁面如下:

編輯后再次訪問服務,會發(fā)現(xiàn)流量產(chǎn)生明細變化。如權重設置為0對于服務調用方等同于服務下線。
6.Nacos環(huán)境隔離
日常開發(fā)過程中,我們一般會有dev、test、poc、prod等多個環(huán)境,同一個服務不同環(huán)境之間因存在代碼不一致問題肯定需要做隔離調度,Nacos通過namespace解決此問題,配置頁面如下,我們新增一個dev:


增加完成后列表發(fā)生變化如下:

我們嘗試在order-service中增加namespace,并重啟服務再次訪問,注意:namespace后字符串為上圖ID
cloud:nacos:server-addr: localhost:8848 #nacos服務地址discovery:cluster-name: HZ # 聲明集群名稱杭州namespace: 06e5f1a5-9ecb-438a-aae0-b434073bb973 # 命名空間
此時會因不在同一命名空間導致無法訪問(因userservice暴露服務時未聲明namespace,默認public)

我們修改user-service的配置文件,增加namespace,并重啟服務再次訪問會發(fā)現(xiàn)服務恢復正常

7.Nacos臨時實例與持久化實例
Nacos在定義上區(qū)分臨時實例和持久化實例,其主要區(qū)分關鍵是健康檢查的方式。
- 臨時實例:客戶端上報模型,能夠自動摘除不健康實例,無需持久化實例存儲
- 持久實例:服務端反省探測模式,客戶端因不上報心跳故不會自動摘除下線實例

在大中型公司,兩種類型一般都會使用,基礎的組件如數(shù)據(jù)庫、緩存等往往不能上報心跳,這種類型的服務在注冊時就需要作為持計劃實例注冊。而上層的業(yè)務服務,如微服務或Dubbo服務,服務的Provider端支持添加心跳,此時就可以使用臨時實例的注冊方式。
其配置文件配置如下:
cloud:nacos:server-addr: localhost:8848 # nacos服務地址discovery:cluster-name: HZ # 聲明集群名稱杭州namespace: 06e5f1a5-9ecb-438a-aae0-b434073bb973 # 命名空間ephemeral: false # 設置為非臨時實例
8.Nacos更多總結分析
📎Nacos.mm,如無法訪問可鏈接至:https://kdocs.cn/l/ccGuOOfpPjFv,圖片展示如下:

9.總結
本節(jié)從Nacos安裝、運行到具體規(guī)則配置,帶領讀者們深度參與了Nacos日常使用場景,Nacos作為注冊中心可以優(yōu)雅替換Eureka也離不開SpringCloud Alibaba的開源貢獻。作為國內(nèi)主流的配置、注冊中心,Nacos在國內(nèi)多數(shù)微服務公司都有使用,感興趣的可以閱讀一下本節(jié)推薦資料,筆者整理歸納在本文第8章節(jié)。
Nacos除了能夠實現(xiàn)服務注冊發(fā)現(xiàn)(AP),此外還有個重要特性:配置管理(CP),我們將在下一章節(jié)展開學習。
思考問題
- Nacos是什么?解決了什么問題?
- Nacos是如何優(yōu)雅替換Eureka的?
- Nacos實現(xiàn)的是客戶端,還是服務端負載均衡?
- Nacos如何實現(xiàn)注冊中心?
10.推薦閱讀資料
- Nacos白皮書:📎Nacos白皮書.pdf