注冊中心 Nacos(負載均衡、雪崩保護簡單體驗)

一、Nacos負載均衡體驗

  • 注冊中心Nacos(單機部署)中,由于使用的Nacos版本是2.2.1所以手動引入了loadbalancerspringcloud組件用于服務(wù)調(diào)用方解析服務(wù)名正確調(diào)用對應(yīng)服務(wù)。本次學(xué)習(xí)就以loadbalancer默認使用的輪詢負載均衡策略來進行初步體驗。
    關(guān)于SpringCloudAlibaba官網(wǎng)維護的Ribbon負載均衡器后面結(jié)合自定義負載均衡策略再學(xué)
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
  • 為了直觀的觀察負載均衡的效果,我們需要在原來的訂單-庫存案例中添加多個庫存服務(wù)供訂單服務(wù)調(diào)用,利用IDEA編輯器,我們無需復(fù)制多個訂單模塊修改端口啟動,以下是用同一份代碼,在多個端口上運行庫存服務(wù)的步驟:
  1. 復(fù)制庫存服務(wù)運行配置


    復(fù)制庫存服務(wù)運行配置
  2. 修改配置名稱,同時新版本IDEA針對springboot項目覆蓋端口配置需要勾選Modify options中的Override configuration properties
    修改配置名

    勾選覆蓋springboot配置參數(shù)選項
  3. 覆蓋springbootyml文件中的端口配置
    覆蓋端口配置
  4. 啟動新的庫存服務(wù)


    新的庫存服務(wù)

    5.觀察Nacos控制臺,庫存服務(wù)實例及健康實例數(shù)據(jù)都得到了更新


    Nacos控制臺服務(wù)列表
  • 修改庫存服務(wù)代碼,增加端口輸出,便于識別訂單服務(wù)調(diào)用的是哪一個庫存服務(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;
    }
}
  • 觀察負載均衡效果,這里借助壓測工具JMeter進行服務(wù)調(diào)用,同時觀察庫存服務(wù)調(diào)用情況
  1. 設(shè)置線程組,1秒鐘創(chuàng)建10個線程訪問循環(huán)1次


    JMeter線程組設(shè)置
  2. 設(shè)置HTTP本地訂單服務(wù)請求


    HTTP請求配置
  3. 觀察結(jié)果樹,發(fā)現(xiàn)10次請求對庫存服務(wù)是進行輪流訪問


    結(jié)果樹

    結(jié)果樹

二、Nacos雪崩保護體驗

  • 觀察服務(wù)詳情


    Nacos服務(wù)列表
服務(wù)詳情

基于上面已經(jīng)有的兩個庫存服務(wù)實例,那什么是服務(wù)雪崩呢?
服務(wù)雪崩也就是假設(shè)兩個服務(wù)實例都最多能同時處理10個線程請求,當(dāng)一個服務(wù)實例出現(xiàn)異常,導(dǎo)致之前本應(yīng)該請求到該異常服務(wù)實例的請求, 請求到其他正常服務(wù)實例,導(dǎo)致正常服務(wù)實例超出最大處理線程數(shù),進而出現(xiàn)處理速度下降,最終導(dǎo)致服務(wù)宕機,同時進一步擴散至整個庫存服務(wù),導(dǎo)致庫存服務(wù)整體無法使用的情況。

那什么是服務(wù)雪崩保護呢?
Nacos的服務(wù)雪崩保護也就是:當(dāng)服務(wù)出現(xiàn)異常導(dǎo)致無法處理請求時,會判斷出現(xiàn)異常的服務(wù)數(shù)量有沒有達到保護閾值

  1. 如果沒有則將請求分發(fā)到其他正常服務(wù)實例中進行處理
  2. 如果達到保護閾值則將請求正常分發(fā)到所有服務(wù)實例中,包括異常實例,至于異常實例接收到請求怎么處理,可以結(jié)合sentinelSpringCloudAlibaba組件進行服務(wù)降級或者熔斷快速失敗等處理。

目前需要解決的一個問題就是將服務(wù)實例由臨時實例改為永久實例,因為臨時實例在服務(wù)下線的時候會直接刪除實例信息,這樣就永遠不會達到保護閾值,就不會觸發(fā)服務(wù)雪崩保護。

  • 更改庫存實例為永久實例
  1. 在Nacos控制臺創(chuàng)建服務(wù)


    創(chuàng)建服務(wù)
  2. 在庫存服務(wù)文件中設(shè)置屬性ephemeral為false,注意:必須先在控制臺創(chuàng)建服務(wù)否則會拋出異常
    庫存服務(wù)配置文件
  3. 啟動永久庫存服務(wù)實例(永久實例一旦注冊到Nacos中,就不會被刪除)


    服務(wù)列表

    服務(wù)詳情
  • 測試服務(wù)雪崩保護
  1. 調(diào)整保護閾值為0.4,關(guān)閉一個庫存服務(wù)實例


    服務(wù)詳情

    通過觀察服務(wù)列表信息就可以看到未觸發(fā)保護閾值,此時所有請求應(yīng)該都是請求到健康實例上


    服務(wù)列表

    JMeter測試結(jié)果
  2. 調(diào)整保護閾值為0.6,關(guān)閉一個庫存服務(wù)實例
    服務(wù)詳情

    通過觀察服務(wù)列表信息就可以看到已經(jīng)觸發(fā)保護閾值,此時請求應(yīng)該有成功請求到健康實例的也有請求到異常實例的,注意:Nacos在重新配置保護閾值后需要整體刷新一下Nacos控制臺,否則有可能閾值未生效
    服務(wù)列表

    JMeter測試結(jié)果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容