文章目錄
- 1、安裝
- 2、服務注冊
- 2.1、引入依賴
- 2.2、配置nacos地址
- 2.3、重啟
- 3、服務分級存儲模型
- 3.1、給user-service配置集群
- 3.2、同集群優先的負載均衡
- 4、權重配置
- 5、環境隔離
- 5.1、創建namespace
- 5.2、配置namespace
- 6、Nacos與Eureka的區別
- 7、代碼免費分享
?🍃作者介紹:雙非本科大三網絡工程專業在讀,阿里云專家博主,專注于Java領域學習,擅長web應用開發、數據結構和算法,初步涉獵Python人工智能開發和前端開發。
🦅主頁:@逐夢蒼穹
📕所屬專欄:微服務
? 您的一鍵三連,是我創作的最大動力🌹
1、安裝
國內公司一般都推崇阿里巴巴的技術,比如注冊中心,SpringCloudAlibaba也推出了一個名為Nacos的注冊中心。
Nacos是阿里巴巴的產品,現在是SpringCloud中的一個組件。
相比Eureka功能更加豐富,在國內受歡迎程度較高。
安裝方式可以參考這篇文章:https://blog.csdn.net/qq_60735796/article/details/136432153
2、服務注冊
Nacos是SpringCloudAlibaba的組件,而SpringCloudAlibaba也遵循SpringCloud中定義的服務注冊、服務發現規范。因此使用Nacos和使用Eureka對于微服務來說,并沒有太大區別。
主要差異在于:
- 依賴不同
- 服務地址不同
2.1、引入依賴
在cloud-demo父工程的pom文件中的<dependencyManagement>
中引入SpringCloudAlibaba的依賴:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.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>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
注意:不要忘了注釋掉eureka的依賴。
2.2、配置nacos地址
在user-service和order-service的application.yml中添加nacos地址:
spring:cloud:nacos:server-addr: localhost:8848
注意:不要忘了注釋掉eureka的地址
2.3、重啟
重啟微服務后,登錄nacos管理頁面,可以看到微服務信息:
3、服務分級存儲模型
一個服務可以有多個實例,例如我們的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。
3.1、給user-service配置集群
修改user-service的application.yml文件,添加集群配置:
spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HangZhou # 集群名稱 杭州
重啟兩個user-service實例后,我們可以在nacos控制臺看到下面結果:
我們再次復制一個user-service啟動配置,添加屬性:
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=Shanghai
啟動UserApplication3后再次查看nacos控制臺:
3.2、同集群優先的負載均衡
默認的ZoneAvoidanceRule
并不能實現根據同集群優先來實現負載均衡。
因此Nacos中提供了一個NacosRule
的實現,可以優先從同集群中挑選實例。
1)給order-service配置集群信息
修改order-service的application.yml文件,添加集群配置:
spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HangZhou # 集群名稱
2)修改負載均衡規則
修改order-service的application.yml文件,修改負載均衡規則:
userservice:ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負載均衡規則
4、權重配置
實際部署中會出現這樣的場景:
服務器設備性能有差異,部分實例所在機器性能較好,另一些較差,我們希望性能好的機器承擔更多的用戶請求。
但默認情況下NacosRule是同集群內隨機挑選,不會考慮機器的性能問題。
因此,Nacos提供了權重配置來控制訪問頻率,權重越大則訪問頻率越高。
在nacos控制臺,找到user-service的實例列表,點擊編輯,即可修改權重:
在彈出的編輯窗口,修改權重:
注意:如果權重修改為0,則該實例永遠不會被訪問
5、環境隔離
Nacos提供了namespace來實現環境隔離功能。
- nacos中可以有多個namespace
- namespace下可以有group、service等
- 不同namespace之間相互隔離,例如不同namespace的服務互相不可見
5.1、創建namespace
默認情況下,所有service、data、group都在同一個namespace,名為public:
我們可以點擊頁面新增按鈕,添加一個namespace:
然后,填寫表單:
就能在頁面看到一個新的namespace:
5.2、配置namespace
給微服務配置namespace只能通過修改配置來實現。
例如,修改order-service的application.yml文件:
spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZnamespace: e4ac0b0b-cba2-445e-9af8-008c84bf22fd # 命名空間,填ID
重啟order-service后,訪問控制臺,可以看到下面的結果:
此時訪問order-service,因為namespace不同,會導致找不到userservice,控制臺會報錯:
簡單來說就是沒有可用的實例
6、Nacos與Eureka的區別
Nacos的服務實例分為兩種類型:
- 臨時實例:如果實例宕機超過一定時間,會從服務列表剔除,默認的類型。
- 非臨時實例:如果實例宕機,不會從服務列表剔除,也可以叫永久實例。
配置一個服務實例為永久實例:
spring:cloud:nacos:discovery:ephemeral: false # 設置為非臨時實例
Nacos和Eureka整體結構類似,服務注冊、服務拉取、心跳等待,但是也存在一些差異:
- Nacos與eureka的共同點
- 都支持服務注冊和服務拉取
- 都支持服務提供者心跳方式做健康檢測
- Nacos與Eureka的區別
- Nacos支持服務端主動檢測提供者狀態:臨時實例采用心跳模式,非臨時實例采用主動檢測模式
- 臨時實例心跳不正常會被剔除,非臨時實例則不會被剔除
- Nacos支持服務列表變更的消息推送模式,服務列表更新更及時
- Nacos集群默認采用AP方式,當集群中存在非臨時實例時,采用CP模式;Eureka采用AP方式
7、代碼免費分享
百度網盤鏈接:
鏈接:https://pan.baidu.com/s/1D6lz27AZYgBKFD8W5OdJ-w?pwd=1234
提取碼:1234