SpringCloud之注冊(cè)中心之Nacos負(fù)載均衡詳解
負(fù)載均衡
生產(chǎn)環(huán)境相對(duì)是?較惡劣的, 我們需要對(duì)服務(wù)的流量進(jìn)?更加精細(xì)的控制. Nacos?持多種負(fù)載均衡策略, 包括權(quán)重, 同機(jī)房, 同地域, 同環(huán)境等.
服務(wù)下線
當(dāng)某?個(gè)節(jié)點(diǎn)上接?的性能較差時(shí), 我們可以第?時(shí)間對(duì)該節(jié)點(diǎn)進(jìn)?下線.
操作步驟: 服務(wù)詳情 -> 下線
點(diǎn)擊下線后, 再次請(qǐng)求接?, 會(huì)發(fā)現(xiàn)該服務(wù)沒有請(qǐng)求進(jìn)來了。再次單擊上線, 該節(jié)點(diǎn)會(huì)繼續(xù)收到請(qǐng)求。
下線之前
下線端口號(hào)為9091的服務(wù)進(jìn)程之后:
權(quán)重配置
除了下線之外, 我們也可以配置這個(gè)節(jié)點(diǎn)的流量權(quán)重。
配置權(quán)重
操作步驟: 找到對(duì)應(yīng)節(jié)點(diǎn) ->編輯 -> 在彈出的窗?修改權(quán)重值。
下面修改端口號(hào)為9091的服務(wù)進(jìn)程的權(quán)重為0.1
觀察結(jié)果:
我們可以看到,三個(gè)服務(wù)實(shí)例接收到的請(qǐng)求次數(shù)幾乎一樣多,這是為什么呢?明明我們已經(jīng)配置了權(quán)重且比例稍微比較大,按理說應(yīng)該能看到現(xiàn)象。
是因?yàn)槲覀兪褂昧薒oadBalance,它本來就是負(fù)責(zé)負(fù)載均衡的,此時(shí)就不會(huì)使用Nacos的權(quán)重屬性進(jìn)行負(fù)載均衡。
我們可以參考一下文章:
解決辦法
開啟Nacos負(fù)載均衡策略
application.properties
spring.cloud.loadbalancer.nacos.enabled=true
application.yml
spring: cloud: loadbalancer: nacos: enabled: true
觀察結(jié)果:
由此我們可以看到,我們?cè)O(shè)置的權(quán)重生效了。
常見問題
修改權(quán)重時(shí), 可能會(huì)報(bào)錯(cuò):
報(bào)錯(cuò)信息為:
caused: errCode: 500, errMsg: do metadata operation failed ;caused:com.alibaba.nacos.consistency.exception.ConsistencyException: The Raft Group[naming_instance_metadata] did not find the Leader node;caused: The Raft Group[naming_instance_metadata] did not find the Leader node;
原因: Nacos 采? raft 算法來計(jì)算 Leader, 并且會(huì)記錄前?次啟動(dòng)的集群地址, 當(dāng)服務(wù)器 IP 改變時(shí)會(huì)導(dǎo)致 raft 記錄的集群地址失效, 導(dǎo)致選 Leader 出現(xiàn)問題. (?絡(luò)環(huán)境發(fā)?變化時(shí), IP地址也會(huì)發(fā)?變化)
解決辦法: 刪除 Nacos 根?錄下 data ?件夾下的 protocol ?件夾即可。
同集群優(yōu)先訪問
Nacos把同?個(gè)機(jī)房?jī)?nèi)的實(shí)例, 劃分為?個(gè)集群. 所以同集群優(yōu)先訪問, 在?定程度上也可以理解為同房?jī)?yōu)先訪問.微服務(wù)架構(gòu)中, ?個(gè)服務(wù)通常有多個(gè)實(shí)例共同提供服務(wù), 這些實(shí)例可以部署在不同的機(jī)器上, 這些機(jī)器可以分布在不同的機(jī)房, ?如product-service:
實(shí)例1: 分布在上海機(jī)房實(shí)例2: 分布在上海機(jī)房實(shí)例3: 分布在北京機(jī)房實(shí)例4: 分布在北京機(jī)房
微服務(wù)訪問時(shí), 應(yīng)盡量訪問同機(jī)房的實(shí)例. 當(dāng)本機(jī)房?jī)?nèi)實(shí)例不可?時(shí), 才訪問其他機(jī)房的實(shí)例。
?如order-service 在上海機(jī)房, product-service 在北京和上海機(jī)房都有實(shí)例, 那我們希望可以優(yōu)先訪問上海機(jī)房, 如果上海機(jī)房沒有實(shí)例, 或者實(shí)例不可?, 再訪問北京機(jī)房的實(shí)例. 通常情況下, 因?yàn)橥?個(gè)機(jī)房的機(jī)器屬于?個(gè)局域?, 局域?訪問速度更快?點(diǎn).
給實(shí)例配置集群名稱
1. 配置集群名稱
給order-service和端口號(hào)為9090的product-service配置 SH 集群名稱。
spring: cloud: nacos: discovery: server-addr: 110.41.51.65:10020 cluster-name: SH #集群名稱: 上海集群
給端口號(hào)為9091的product-service 和 端口號(hào)為9092的product-service配置 BJ 集群名稱。
開啟Nacos負(fù)載均衡策略
同權(quán)重配置
spring: cloud: nacos: loadbalancer: nacos: enabled: true
多次訪問“http://127.0.0.1:8080/order/1”
觀察結(jié)果:
我們前面配置order-service集群為 SH,配置端口號(hào)為9090的product-service集群為 SH,配置端口號(hào)為9091的product-service集群為 BJ,配置端口號(hào)為9092的product-service集群為 BJ。
上面的結(jié)果可以看到,請(qǐng)求都發(fā)送到了端口號(hào)為9090的product-service集群,與預(yù)期符合。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于java線程池讀取單個(gè)SQL數(shù)據(jù)庫表
這篇文章主要為大家詳細(xì)介紹了基于java線程池讀取單個(gè)SQL數(shù)據(jù)庫表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08Java接口操作(繼承父類并實(shí)現(xiàn)多個(gè)接口)
這篇文章主要介紹了Java接口操作(繼承父類并實(shí)現(xiàn)多個(gè)接口),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10基于Spring-cloud-gateway實(shí)現(xiàn)全局日志記錄的方法
最近項(xiàng)目在線上運(yùn)行出現(xiàn)了一些難以復(fù)現(xiàn)的bug需要定位相應(yīng)api的日志,通過nginx提供的api請(qǐng)求日志難以實(shí)現(xiàn),于是在gateway通過全局過濾器記錄api請(qǐng)求日志,本文給大家介紹基于Spring-cloud-gateway實(shí)現(xiàn)全局日志記錄,感興趣的朋友一起看看吧2023-11-11Spring中@Configuration和@Component注解的區(qū)別及原理
這篇文章主要介紹了Spring中@Configuration和@Component注解的區(qū)別及原理,從功能上來講,這些注解所負(fù)責(zé)的功能的確不相同,但是從本質(zhì)上來講,Spring內(nèi)部都將其作為配置注解進(jìn)行處理,需要的朋友可以參考下2023-11-11使用Spring Cloud Feign遠(yuǎn)程調(diào)用的方法示例
這篇文章主要介紹了使用Spring Cloud Feign遠(yuǎn)程調(diào)用的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09Java中時(shí)間戳和時(shí)間的轉(zhuǎn)換方法代碼
這篇文章主要介紹了Java中時(shí)間戳和時(shí)間的轉(zhuǎn)換的相關(guān)資料,Java8中時(shí)間戳與日期時(shí)間對(duì)象之間的轉(zhuǎn)換是編程中常見的操作,通過時(shí)間字符串獲取時(shí)間對(duì)象也是其中的一種方法,需要的朋友可以參考下2025-03-03SpringBoot項(xiàng)目打包成war包并部署在tomcat上運(yùn)行的操作步驟
我們開發(fā) SpringBoot 項(xiàng)目有時(shí)我們會(huì)需要打包成 war 包,放入外置的 Tomcat 中進(jìn)行運(yùn)行,或者使用工具idea直接啟動(dòng),便于開發(fā)調(diào)試,本文給大家分享SpringBoot項(xiàng)目打包成war包并部署在tomcat上運(yùn)行的操作步驟,感興趣的朋友一起看看吧2024-03-03Springboot+Shiro+Mybatis+mysql實(shí)現(xiàn)權(quán)限安全認(rèn)證的示例代碼
Shiro是Apache?的一個(gè)強(qiáng)大且易用的Java安全框架,執(zhí)行身份驗(yàn)證、授權(quán)、密碼學(xué)和會(huì)話管理,Shiro?主要分為兩個(gè)部分就是認(rèn)證和授權(quán)兩部分,這篇文章主要介紹了Springboot+Shiro+Mybatis+mysql實(shí)現(xiàn)權(quán)限安全認(rèn)證的示例代碼,需要的朋友可以參考下2024-07-07