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及本宣告,
本文著作權歸作者所有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/543261.html
標籤:其他
