Nacos 通過提供簡單易用的動態服務發現、服務配置、服務共用與管理等服務基礎設施,幫助用戶在雲原生時代,在私有雲、混合雲或者公有雲等所有雲環境中,更好的構建、交付、管理自己的微服務平臺,更快的復用和組合業務服務,更快的交付商業創新的價值,從而為用戶贏得市場。 ...
Nacos註冊中心
和Euraka一樣都是註冊中心,但Nacos不需要註冊Nacos,因為阿裡巴巴已經註冊在好了。只需要下載安裝後打開即可
Windows安裝
開發階段採用單機安裝即可
1.1.下載安裝包
在Nacos的GitHub頁面,提供有下載鏈接,可以下載編譯好的Nacos服務端或者源代碼:
GitHub主頁:https://github.com/alibaba/nacos
GitHub的Release下載頁:https://github.com/alibaba/nacos/releases
如圖:
SpringCloud文件中已經準備了安裝包:
windows版本使用nacos-server-1.4.1.zip
包即可。
1.2.解壓
將這個包解壓到任意非中文目錄下,如圖:
目錄說明:
- bin:啟動腳本
- conf:配置文件
1.3.埠配置
Nacos的預設埠是8848,如果你電腦上的其它進程占用了8848埠,請先嘗試關閉該進程。
如果無法關閉占用8848埠的進程,也可以進入nacos的conf目錄,修改配置文件中的埠:
修改其中的內容:
1.4.啟動
啟動非常簡單,進入bin目錄,結構如下:
然後執行命令即可:
-
windows命令:
startup.cmd -m standalone
執行後的效果如圖:
1.5.訪問
在瀏覽器輸入地址:http://127.0.0.1:8848/nacos即可:
預設的賬號和密碼都是nacos,進入後:
Linux安裝
Linux或者Mac安裝方式與Windows類似。
2.1.安裝JDK
Nacos依賴於JDK運行,索引Linux上也需要安裝JDK才行。
上傳jdk安裝包:
上傳到某個目錄,例如:/usr/local/
然後解壓縮:
tar -xvf jdk-8u144-linux-x64.tar.gz
然後重命名為java
配置環境變數:
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
設置環境變數:
source /etc/profile
2.2.上傳安裝包
如圖:
也可以直接使用文件中的tar.gz:
上傳到Linux伺服器的某個目錄,例如/usr/local/src
目錄下:
2.3.解壓
命令解壓縮安裝包:
tar -xvf nacos-server-1.4.1.tar.gz
然後刪除安裝包:
rm -rf nacos-server-1.4.1.tar.gz
目錄中最終樣式:
目錄內部:
2.4.埠配置
與windows中類似
2.5.啟動
在nacos/bin目錄中,輸入命令啟動Nacos:
sh startup.sh -m standalone
服務註冊到Nacos並拉取
Nacos是SpringCloudAlibaba的組件,而SpringCloudAlibaba也遵循SpringCloud中定義的服務註冊、服務發現規範。因此使用Nacos和使用Eureka對於微服務來說,並沒有太大區別。
主要差異在於:
- 依賴不同
- 服務地址不同
0) 啟動Nacos
進入bin目錄,結構如下:
然後執行命令即可:
-
windows命令:
startup.cmd -m standalone
執行後的效果如圖:
在瀏覽器輸入地址:http://127.0.0.1:8848/nacos即可。預設賬號密碼都是 nacos
1)引入依賴
註意:不要忘了註釋掉eureka的依賴。
在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>
2)配置nacos地址
註意:不要忘了註釋掉eureka的地址
在生產者user-service和消費者order-service的application.yml中添加nacos地址:
spring:
cloud:
nacos:
server-addr: localhost:8848 #配置nacos訪問地址(預設也是這個)
3)消費者:服務拉取與負責均衡
我們要去eureka-server中拉取user-service服務的實例列表,並且實現負載均衡。
-
加負責均衡註解
在order-service的OrderApplication中,給RestTemplate這個Bean添加一個@LoadBalanced註解: -
修改訪問服務路徑
修改order-service服務中的cn.itcast.order.service包下的OrderService類中的queryOrderById方法。修改訪問的url路徑,用服務名代替ip、埠:spring會自動幫助我們從eureka-server端,根據userservice這個服務名稱,獲取實例列表,而後完成負載均衡。
服務分級存儲模型
① 一級是服務,例如userservice
② 二級是集群,例如杭州、惠州、上海
③ 三級是實例,例如廣州機房的某台部署了userservice的伺服器
一個服務可以有多個實例,例如我們的user-service,可以有:
- 127.0.0.1:8081
- 127.0.0.1:8082
- 127.0.0.1:8083
假如這些實例分佈於全國各地的不同機房,例如:
- 127.0.0.1:8081,在上海機房
- 127.0.0.1:8082,在上海機房
- 127.0.0.1:8083,在杭州機房
Nacos就將同一機房內的實例 劃分為一個集群。
也就是說,user-service是服務,一個服務可以包含多個集群,如杭州、上海,每個集群下可以有多個實例,形成分級模型,如圖:
微服務互相訪問時,應該儘可能訪問同集群實例,因為本地訪問速度更快。當本集群內不可用時,才訪問其它集群。例如:
杭州機房內的order-service應該優先訪問同機房的user-service。
生成者:配置集群
每一個註冊的服務都可以設置集群,以便後續快速訪問
修改生產者user-service的application.yml文件,添加集群配置:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 集群名稱(一般以地區簡寫來表示)
重啟兩個user-service實例後,我們可以在nacos控制台看到下麵結果:
我們再次複製一個user-service啟動配置,添加屬性:
-Dserver.port=8083
-Dspring.cloud.nacos.discovery.cluster-name=SH
配置如圖所示:
啟動UserApplication3後再次查看nacos控制台:
消費者:同集群優先的負載均衡
NacosRule負載均衡策略
① 優先選擇同集群服務實例列表
② 本地集群找不到提供者,才去其它集群尋找,並且會報警告
③ 確定了可用實例列表後,再採用隨機負載均衡挑選實例
預設的ZoneAvoidanceRule
並不能實現根據同集群優先來實現負載均衡。
因此Nacos中提供了一個NacosRule
的實現,可以優先從同集群中挑選實例。
1)給消費者order-service配置集群信息
修改order-service的application.yml文件,添加集群配置:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 優先消費指定集群的名稱
2)修改負載均衡規則
修改消費者order-service的application.yml文件,修改負載均衡規則:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負載均衡規則
生產者:權重配置
① Nacos控制台可以設置實例的權重值,0~1之間
② 同集群內的多個實例,權重越高被訪問的頻率越高
③ 權重設置為0則完全不會被訪問
實際應用場景:
伺服器設備性能有差異,部分實例所在機器性能較好,另一些較差,我們希望性能好的機器承擔更多的用戶請求。
但預設情況下NacosRule是同集群內隨機挑選,不會考慮機器的性能問題。
因此,Nacos提供了權重配置來控制訪問頻率,權重越大則訪問頻率越高。
操作:
在nacos控制台,找到生產者user-service的實例列表,點擊編輯,即可修改權重:
在彈出的編輯視窗,修改權重:
環境隔離namespace
Nacos提供了namespace來實現環境隔離功能【一般用於隔離開發環境dev和生產環境prod】
-
nacos中可以有多個namespace
-
namespace下可以有group、service等(如:與錢有關的服務就放在一組)
-
不同namespace之間相互隔離,例如不同namespace的服務互相不可見
相互隔離是無法相互訪問的意思
創建namespace
預設情況下,所有service、data、group都在同一個namespace,名為public:
我們可以點擊頁面新增按鈕,添加一個namespace:
然後,填寫表單:
就能在頁面看到一個新的namespace(該空間的ID是由UUID生成的):
給微服務配置namespace
給微服務配置namespace只能通過修改配置來實現。
例如,修改order-service的application.yml文件:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空間,填ID
重啟order-service後,訪問控制台,可以看到下麵的結果:
此時消費者order-service訪問生產者user-service,因為namespace不同,會導致找不到userservice,控制台會報錯:
臨時/非臨時實例
Nacos的服務實例分為兩種l類型:
-
臨時實例:如果實例宕機超過一定時間,會從服務列表剔除,預設的類型。
-
非臨時實例:如果實例宕機,不會從服務列表剔除,也可以叫永久實例。
配置一個服務實例為永久實例:(預設為臨時實例)
spring:
cloud:
nacos:
discovery:
ephemeral: false # 設置為非臨時實例
Nacos與Eureka區別
Nacos和Eureka整體結構類似,服務註冊、服務拉取、心跳等待,但是也存在一些差異:
-
Nacos與eureka的共同點
Eureka和Nacos都有的兩個細節功能:
I、服務消費者需要找userservice名的服務,Euraka就會將以userservice命名的服務埠以列表(緩存列表)的形式返回給消費者,這樣消費者就不需要一直訪問Euraka造成伺服器壓力。但同時為了保證userservice命名的服務有變化時消費者拉取信息的準確性,所以Euraka每30s更新列表並返回給消費者。
II、服務提供者都需要一定時間內發送請求進行心跳檢測,讓Euraka和Nacos知道該提供者還活著。(Nacos心跳檢測更頻繁)- 都支持服務註冊和服務拉取
- 都支持服務提供者心跳方式做健康檢測
-
Nacos與Eureka的區別
-
Nacos支持服務端主動檢測提供者狀態:臨時實例採用心跳模式,非臨時實例採用主動檢測模式
主動模式檢測:Nacos會主動發送請求去檢測提供者是否有存在
-
臨時實例心跳不正常會被剔除,非臨時實例則不會被剔除
-
Nacos支持服務列表變更的消息推送模式,服務列表更新更及時
白話:當提供者(生產者)有變化時會主動告訴消費者。
優勢:Eureka可能有30s的誤差,但Nacos沒有 -
Nacos集群預設採用AP方式,當集群中存在非臨時實例時,採用CP模式;Eureka採用AP方式
-
本文來自博客園,作者:不吃紫菜,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接:https://www.cnblogs.com/buchizicai/p/17093508.html及本聲明。
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。