國內公司一般都推崇阿里巴巴的技術,比如註冊中心,SpringCloudAlibaba也推出了一個名為Nacos的註冊中心。Dynami Naming and Configuration Service。是阿里巴巴2018年7月開源的專案。
Nacos是阿里巴巴的產品,現在是SpringCloud中的一個元件。相比Eureka功能更加豐富,在國內受歡迎程度較高。
一、Nacos安裝和入門示例
1.1)、Nacos 安裝步驟:
1.下載安裝包
2.解壓將這個包解壓到任意非中文目錄下 預設埠 8848
3.埠配置 預設埠 8848 修改配置檔案application.properties的內容: server.port=8848
4.啟動 進入bin目錄 然後執行命令即可: - windows命令:startup.cmd -m standalone
或點選startup.cmd 啟動nacos。
然後控制檯視窗顯示Nacos logo,安裝成功。
5.點選地址訪問 預設賬號:nacos密碼 :nacos
1.2)、Nacos 入門示例:
Nacos是SpringCloudAlibaba的元件,而SpringCloudAlibaba也遵循SpringCloud中定義的服務註冊、服務發現規範。因此使用Nacos和使用Eureka對於微服務來說,並沒有太大區別。
主要差異在於:
- 依賴不同
- 服務地址不同
使用Nacos註冊中心 換掉Eureka
步驟一、引入依賴(pom檔案)
在cloud-demo父工程的pom檔案中的`<dependencyManagement>`中引入SpringCloudAlibaba的依賴:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>X.X.X.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>
步驟二、配置nacos地址(yml檔案)
在user-service和order-service的application.yml中新增nacos地址:
在Spring配置檔案中新增 Nacos配置
spring:
cloud:
nacos:
server-addr: localhost:8848
步驟三、重啟
重啟微服務後,登入nacos管理頁面,可以看到微服務資訊:
配置註冊成功。
二、服務分級儲存模型
2.1)、服務分級儲存模型概念
一個服務可以有多個例項,例如我們的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是服務,一個服務可以包含多個叢集,如杭州、上海,每個叢集下可以有多個例項,形成分級模型,服務- 叢集 -例項,如圖:
一級是服務,例如userservice。
二級是叢集,例如杭州或上海。
三級是例項,例如杭州機房的某臺部署了userservice的伺服器。
微服務互相訪問時,應該儘可能訪問同叢集例項,因為本地訪問速度更快。當本叢集內不可用時,才訪問其它叢集。例如 如圖:
2.2)、服務叢集配置示例:
userservice 配置叢集, 把userservice 2個例項 放到杭州叢集 ,1個放到上海叢集。
步驟一、修改user-service的application.yml檔案,新增叢集配置:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 叢集名稱
步驟二、重啟兩個user-service例項後,我們可以在nacos控制檯檢視結果:
userservice 服務,叢集數量2,例項數量3。
2.3)、配置同叢集優先的負載均衡
預設的ZoneAvoidanceRule並不能實現根據同叢集優先來實現負載均衡。預設輪詢機制,不能實現同叢集優先的負載均衡。
因此Nacos中提供了一個NacosRule的實現,可以優先從同叢集中挑選例項。
步驟一、給order-service配置叢集資訊
修改order-service的application.yml檔案,新增叢集配置:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 叢集名稱
步驟二、修改負載均衡規則
修改order-service的application.yml檔案,修改負載均衡規則:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負載均衡規則
執行專案,測試訪問orderservice,測試負載均衡 成功。
測試說明:隨機訪問本地叢集。如果停掉本地叢集的2個 userservice,訪問orderservice,也可以訪問,本地叢集沒有userservice服務也可以訪問。
NacosRule負載均衡策略:
優先選擇同叢集服務例項列表
本地叢集找不到提供者,才去其它叢集尋找,並且會報警告
確定了可用例項列表後,再採用隨機負載均衡挑選例項
三、Nacos權重配置
實際部署中會出現這樣的場景:
伺服器裝置效能有差異,部分例項所在機器效能較好,另一些較差,我們希望效能好的機器承擔更多的使用者請求。 但預設情況下NacosRule是同叢集內隨機挑選,不會考慮機器的效能問題。
因此,Nacos提供了權重配置來控制訪問頻率,權重越大則訪問頻率越高。
權重控制:
Nacos控制檯可以設定例項的權重值,0~1之間
同叢集內的多個例項,權重越高被訪問的頻率越高
權重設定為0則完全不會被訪問
配置權重步驟:
步驟一、在nacos控制檯,找到user-service的例項列表,點選編輯,即可修改權重:
步驟二、在彈出的編輯視窗,修改權重:
如果權重修改為0,則該例項永遠不會被訪問。
示例: userservice 例項權重設定為0.1 ,訪問比例為 1比10 。 設定為0 則不訪問,可以用作使用者無感知升級,不用再凌晨升級維護。