國內(nèi)公司一般都推崇阿里巴巴的技術(shù),比如注冊中心,SpringCloudAlibaba也推出了一個名為Nacos的注冊中心。
認(rèn)識和安裝Nacos
Nacos是阿里巴巴的產(chǎn)品,現(xiàn)在是SpringCloud中的一個組件。相比Eureka功能更加豐富,在國內(nèi)受歡迎程度較高。
安裝
在Nacos的GitHub頁面,提供有下載鏈接,可以下載編譯好的Nacos服務(wù)端或者源代碼:
GitHub主頁:https://github.com/alibaba/nacos
GitHub的Release下載頁:https://github.com/alibaba/nacos/releases
如圖:
將這個包解壓到任意非中文目錄下,如圖:
目錄說明:
- bin:啟動腳本
- conf:配置文件
端口配置
Nacos的默認(rèn)端口是8848,如果你電腦上的其它進(jìn)程占用了8848端口,請先嘗試關(guān)閉該進(jìn)程。
如果無法關(guān)閉占用8848端口的進(jìn)程,也可以進(jìn)入nacos的conf目錄,修改配置文件中的端口:
修改其中的內(nèi)容:
啟動
啟動非常簡單,進(jìn)入bin目錄,結(jié)構(gòu)如下:
然后執(zhí)行命令即可:
-
windows命令:
startup.cmd -m standalone
執(zhí)行后的效果如圖:
訪問
在瀏覽器輸入地址:http://127.0.0.1:8848/nacos即可:
默認(rèn)的賬號和密碼都是nacos,進(jìn)入后:
服務(wù)注冊到Nacos
Nacos是SpringCloudAlibaba的組件,而SpringCloudAlibaba也遵循SpringCloud中定義的服務(wù)注冊、服務(wù)發(fā)現(xiàn)規(guī)范。因此使用Nacos和使用Eureka對于微服務(wù)來說,并沒有太大區(qū)別。
主要差異在于:
- 依賴不同
- 服務(wù)地址不同
引入依賴
在cloud-demo父工程的pom文件中的<dependencyManagement>
中引入SpringCloudAlibaba的依賴:
<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>
然后在user-service和order-service中的pom文件中引入nacos-discovery依賴:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
復(fù)習(xí):dependencyManagement和dependencies區(qū)別:
①dependencies:自動引入聲明在dependencies里的所有依賴,并默認(rèn)被所有的子項目繼承。如果項目中不寫依賴項,則會從父項目繼承(屬性全部繼承)聲明在父項目dependencies里的依賴項。
②dependencyManagement里只是聲明依賴,并不實現(xiàn)引入,因此子項目需要顯式的聲明需要的依賴。如果不在子項目中聲明依賴,是不會從父項目中繼承的;只有在子項目中寫了該依賴項,并且沒有指定具體版本,才會從父項目中繼承該項,并且version和scope都讀取自父pom;如果子項目中指定了版本號,那么會使用子項目中指定的jar版本。同時dependencyManagement讓子項目引用依賴,而不用顯式的列出版本號。Maven會沿著父子層次向上走,直到找到一個擁有dependencyManagement元素的項目,然后它就會使用在這個dependencyManagement元素中指定的版本號,實現(xiàn)所有子項目使用的依賴項為同一版本。
③dependencyManagement 中的 dependencies 并不影響項目的依賴項;而獨立dependencies元素則影響項目的依賴項。只有當(dāng)外層的dependencies元素中沒有指明版本信息時,dependencyManagement 中的 dependencies 元素才起作用。一個是項目依賴,一個是maven項目多模塊情況時作依賴管理控制的。
配置nacos地址
在user-service和order-service的application.yml中添加nacos地址:
spring:
cloud:
nacos:
server-addr: localhost:8848
這里和Eureka配置中的eureka.client.service-url一個意思,就是說告訴當(dāng)前服務(wù)去哪里進(jìn)行注冊。
重啟
重啟微服務(wù)后,登錄nacos管理頁面,可以看到微服務(wù)信息:
注意:
這里要先把Eureka的依賴和配置給注釋掉,否則兩個注冊中心不知道用哪個,會報錯!
服務(wù)分級存儲模型
一個服務(wù)可以有多個實例,例如我們的user-service,可以有:
- 127.0.0.1:8081
- 127.0.0.1:8082
- 127.0.0.1:8083
一個服務(wù)既然可以有多個實例,如果我們把所有的實例都部署到一個機(jī)房里面,這就像把雞蛋放在一個籃子里面,如果籃子翻了,那么雞蛋也就全部碎了。如果哪一天機(jī)房出現(xiàn)了問題,那么整個服務(wù)不就完了?
所以為了解決這個問題,我們會將一個服務(wù)的多個實例部署到不同的機(jī)房,比如像阿里、京東這些公司他們會將服務(wù)的實例分散到全國各地,這樣能做到容災(zāi)。
假如這些實例分布于全國各地的不同機(jī)房,例如:
- 127.0.0.1:8081,在杭州機(jī)房
- 127.0.0.1:8082,在杭州機(jī)房
- 127.0.0.1:8083,在上海機(jī)房
Nacos就將同一機(jī)房內(nèi)的實例 劃分為一個集群。
nacos服務(wù)分級存儲模型就是引入了一個機(jī)房的概念(或者說地域的概念)
也就是說,user-service是服務(wù),一個服務(wù)可以包含多個集群,如杭州、上海,每個集群下可以有多個實例,形成分級模型,如圖:
微服務(wù)互相訪問時,應(yīng)該盡可能訪問同集群實例,因為本地訪問速度更快。當(dāng)本集群內(nèi)不可用時,才訪問其它集群。例如:
杭州機(jī)房內(nèi)的order-service應(yīng)該優(yōu)先訪問同機(jī)房的user-service。
Nacos引入這種集群的概念,就是為了盡可能避免跨集群調(diào)用,因為這樣的話延遲很高。
給user-service配置集群
修改user-service的application.yml文件,添加集群配置:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 集群名稱
重啟兩個user-service實例后,我們可以在nacos控制臺看到下面結(jié)果:
我們再次復(fù)制一個user-service啟動配置,添加屬性:
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH
配置如圖所示:
啟動UserApplication3后再次查看nacos控制臺:
同集群優(yōu)先的負(fù)載均衡
默認(rèn)的ZoneAvoidanceRule
并不能實現(xiàn)根據(jù)同集群優(yōu)先來實現(xiàn)負(fù)載均衡。
因此Nacos中提供了一個NacosRule
的實現(xiàn),可以優(yōu)先從同集群中挑選實例,在本集群中采取隨機(jī)選擇的方式。
1)給order-service配置集群信息
修改order-service的application.yml文件,添加集群配置:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 集群名稱
2)修改負(fù)載均衡規(guī)則
修改order-service的application.yml文件,修改負(fù)載均衡規(guī)則:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負(fù)載均衡規(guī)則
這個地方在【微服務(wù)】Ribbon負(fù)載均衡中的自定義負(fù)載均衡策略也提到過
總結(jié):
權(quán)重配置
實際部署中會出現(xiàn)這樣的場景:
服務(wù)器設(shè)備性能有差異,部分實例所在機(jī)器性能較好,另一些較差,我們希望性能好的機(jī)器承擔(dān)更多的用戶請求。
但默認(rèn)情況下NacosRule是同集群內(nèi)隨機(jī)挑選,不會考慮機(jī)器的性能問題。
因此,Nacos提供了權(quán)重配置來控制訪問頻率,權(quán)重越大則訪問頻率越高(相對于同一集群來說)。
在nacos控制臺,找到user-service的實例列表,點擊編輯,即可修改權(quán)重:
在彈出的編輯窗口,修改權(quán)重:
注意:如果權(quán)重修改為0,則該實例永遠(yuǎn)不會被訪問
環(huán)境隔離
Nacos提供了namespace來實現(xiàn)環(huán)境隔離功能。
- nacos中可以有多個namespace
- namespace下可以有g(shù)roup、service等
- 不同namespace之間相互隔離,例如不同namespace的服務(wù)互相不可見
創(chuàng)建namespace
默認(rèn)情況下,所有service、data、group都在同一個namespace,名為public:
我們可以點擊頁面新增按鈕,添加一個namespace:
然后,填寫表單:
就能在頁面看到一個新的namespace:
給微服務(wù)配置namespace
給微服務(wù)配置namespace只能通過修改配置來實現(xiàn)。
例如,修改order-service的application.yml文件:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空間,填I(lǐng)D
重啟order-service后,訪問控制臺,可以看到下面的結(jié)果:
此時訪問order-service,因為namespace不同,會導(dǎo)致找不到userservice,控制臺會報錯:
Nacos與Eureka的區(qū)別
Nacos的服務(wù)實例分為兩種l類型:
-
臨時實例:如果實例宕機(jī)超過一定時間,會從服務(wù)列表剔除,默認(rèn)的類型。
-
非臨時實例:如果實例宕機(jī),不會從服務(wù)列表剔除,也可以叫永久實例。
配置一個服務(wù)實例為永久實例:
spring:
cloud:
nacos:
discovery:
ephemeral: false # 設(shè)置為非臨時實例
Nacos和Eureka整體結(jié)構(gòu)類似,服務(wù)注冊、服務(wù)拉取、心跳等待,但是也存在一些差異:
-
Nacos與eureka的共同點文章來源:http://www.zghlxwxcb.cn/news/detail-784691.html
- 都支持服務(wù)注冊和服務(wù)拉取
- 都支持服務(wù)提供者心跳方式做健康檢測
-
Nacos與Eureka的區(qū)別文章來源地址http://www.zghlxwxcb.cn/news/detail-784691.html
- Nacos支持服務(wù)端主動檢測提供者狀態(tài):臨時實例采用心跳模式,非臨時實例采用主動檢測模式
- 臨時實例心跳不正常會被剔除,非臨時實例則不會被剔除
- Nacos支持服務(wù)列表變更的消息推送模式,服務(wù)列表更新更及時
- Nacos集群默認(rèn)采用AP方式,當(dāng)集群中存在非臨時實例時,采用CP模式;Eureka采用AP方式
到了這里,關(guān)于【微服務(wù)】Nacos注冊中心的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!