一、Nacos負(fù)載均衡體驗(yàn)
- 在注冊中心Nacos(單機(jī)部署)中梆造,由于使用的Nacos版本是2.2.1所以手動(dòng)引入了
loadbalancer
springcloud組件用于服務(wù)調(diào)用方解析服務(wù)名正確調(diào)用對應(yīng)服務(wù)缴守。本次學(xué)習(xí)就以loadbalancer
默認(rèn)使用的輪詢負(fù)載均衡策略來進(jìn)行初步體驗(yàn)。
關(guān)于SpringCloudAlibaba官網(wǎng)維護(hù)的Ribbon負(fù)載均衡器后面結(jié)合自定義負(fù)載均衡策略再學(xué)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
- 為了直觀的觀察負(fù)載均衡的效果,我們需要在原來的訂單-庫存案例中添加多個(gè)庫存服務(wù)供訂單服務(wù)調(diào)用屡穗,利用IDEA編輯器贴捡,我們無需復(fù)制多個(gè)訂單模塊修改端口啟動(dòng),以下是用同一份代碼村砂,在多個(gè)端口上運(yùn)行庫存服務(wù)的步驟:
-
復(fù)制庫存服務(wù)運(yùn)行配置
復(fù)制庫存服務(wù)運(yùn)行配置 - 修改配置名稱栈暇,同時(shí)新版本IDEA針對springboot項(xiàng)目覆蓋端口配置需要勾選
Modify options
中的Override configuration properties
修改配置名
勾選覆蓋springboot配置參數(shù)選項(xiàng) - 覆蓋springboot
yml
文件中的端口配置
覆蓋端口配置 -
啟動(dòng)新的庫存服務(wù)
新的庫存服務(wù)
5.觀察Nacos控制臺,庫存服務(wù)實(shí)例及健康實(shí)例數(shù)據(jù)都得到了更新
Nacos控制臺服務(wù)列表
- 修改庫存服務(wù)代碼箍镜,增加端口輸出,便于識別訂單服務(wù)調(diào)用的是哪一個(gè)庫存服務(wù)
@RestController
@RequestMapping("/stock")
public class StockController {
@Value("${server.port}")
private String port;
@RequestMapping("/reduct")
public String reduct() throws InterruptedException {
System.out.println("扣減庫存");
return "扣減庫存:"+port;
}
}
- 觀察負(fù)載均衡效果煎源,這里借助壓測工具JMeter進(jìn)行服務(wù)調(diào)用色迂,同時(shí)觀察庫存服務(wù)調(diào)用情況
-
設(shè)置線程組,1秒鐘創(chuàng)建10個(gè)線程訪問循環(huán)1次
JMeter線程組設(shè)置 -
設(shè)置HTTP本地訂單服務(wù)請求
HTTP請求配置 -
觀察結(jié)果樹手销,發(fā)現(xiàn)10次請求對庫存服務(wù)是進(jìn)行輪流訪問
結(jié)果樹
結(jié)果樹
二歇僧、Nacos雪崩保護(hù)體驗(yàn)
-
觀察服務(wù)詳情
Nacos服務(wù)列表
基于上面已經(jīng)有的兩個(gè)庫存服務(wù)實(shí)例,那什么是服務(wù)雪崩呢锋拖?
服務(wù)雪崩也就是假設(shè)兩個(gè)服務(wù)實(shí)例都最多能同時(shí)處理10個(gè)線程請求诈悍,當(dāng)一個(gè)服務(wù)實(shí)例出現(xiàn)異常,導(dǎo)致之前本應(yīng)該請求到該異常服務(wù)實(shí)例的請求兽埃, 請求到其他正常服務(wù)實(shí)例侥钳,導(dǎo)致正常服務(wù)實(shí)例超出最大處理線程數(shù),進(jìn)而出現(xiàn)處理速度下降柄错,最終導(dǎo)致服務(wù)宕機(jī)舷夺,同時(shí)進(jìn)一步擴(kuò)散至整個(gè)庫存服務(wù),導(dǎo)致庫存服務(wù)整體無法使用的情況售貌。
那什么是服務(wù)雪崩保護(hù)呢给猾?
Nacos的服務(wù)雪崩保護(hù)也就是:當(dāng)服務(wù)出現(xiàn)異常導(dǎo)致無法處理請求時(shí),會(huì)判斷出現(xiàn)異常的服務(wù)數(shù)量有沒有達(dá)到保護(hù)閾值
- 如果沒有則將請求分發(fā)到其他正常服務(wù)實(shí)例中進(jìn)行處理
- 如果達(dá)到保護(hù)閾值則將請求正常分發(fā)到所有服務(wù)實(shí)例中颂跨,包括異常實(shí)例敢伸,至于異常實(shí)例接收到請求怎么處理,可以結(jié)合
sentinel
SpringCloudAlibaba組件進(jìn)行服務(wù)降級或者熔斷快速失敗等處理恒削。
目前需要解決的一個(gè)問題就是將服務(wù)實(shí)例由臨時(shí)實(shí)例改為永久實(shí)例池颈,因?yàn)榕R時(shí)實(shí)例在服務(wù)下線的時(shí)候會(huì)直接刪除實(shí)例信息,這樣就永遠(yuǎn)不會(huì)達(dá)到保護(hù)閾值钓丰,就不會(huì)觸發(fā)服務(wù)雪崩保護(hù)饶辙。
- 更改庫存實(shí)例為永久實(shí)例
-
在Nacos控制臺創(chuàng)建服務(wù)
創(chuàng)建服務(wù) - 在庫存服務(wù)文件中設(shè)置屬性
ephemeral
為false,注意:必須先在控制臺創(chuàng)建服務(wù)否則會(huì)拋出異常
庫存服務(wù)配置文件 -
啟動(dòng)永久庫存服務(wù)實(shí)例(永久實(shí)例一旦注冊到Nacos中斑粱,就不會(huì)被刪除)
服務(wù)列表
服務(wù)詳情
- 測試服務(wù)雪崩保護(hù)
-
調(diào)整保護(hù)閾值為0.4弃揽,關(guān)閉一個(gè)庫存服務(wù)實(shí)例
服務(wù)詳情
通過觀察服務(wù)列表信息就可以看到未觸發(fā)保護(hù)閾值,此時(shí)所有請求應(yīng)該都是請求到健康實(shí)例上
服務(wù)列表
JMeter測試結(jié)果 - 調(diào)整保護(hù)閾值為0.6,關(guān)閉一個(gè)庫存服務(wù)實(shí)例
服務(wù)詳情
通過觀察服務(wù)列表信息就可以看到已經(jīng)觸發(fā)保護(hù)閾值矿微,此時(shí)請求應(yīng)該有成功請求到健康實(shí)例的也有請求到異常實(shí)例的痕慢,注意:Nacos在重新配置保護(hù)閾值后需要整體刷新一下Nacos控制臺,否則有可能閾值未生效
服務(wù)列表
JMeter測試結(jié)果