溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除

發(fā)布時間:2021-12-21 14:28:15 來源:億速云 閱讀:138 作者:柒染 欄目:云計算

今天就跟大家聊聊有關(guān)微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

微服務(wù)架構(gòu)下,穩(wěn)定性和高可用性一個永恒的話題,在實(shí)際的治理過程中,我們有可能會遇到以下場景:

  • 某個應(yīng)用灰度發(fā)布,先上了幾臺機(jī)器,由于代碼邏輯寫的有問題,造成線程池滿,出現(xiàn)運(yùn)行異常。

  • 服務(wù)端集群中,某幾臺機(jī)器由于磁盤滿,或者是宿主機(jī)資源爭搶導(dǎo)致 load 過高,客戶端出現(xiàn)調(diào)用超時。

  • 服務(wù)端集群中,某幾臺機(jī)器由于線程池滿,造成 Full Garbage Collection。

在以上 3 種場景中,由于客戶端并不法感知已經(jīng)出現(xiàn)問題的那些服務(wù)端,依然會發(fā)送請求到這些機(jī)器上,造成業(yè)務(wù)調(diào)用報錯,上游的機(jī)子將會被下游的某臺機(jī)子的短暫故障拖垮,造成應(yīng)用雪崩的風(fēng)險。

面對這種場景,如果僅僅為此而進(jìn)行服務(wù)降級,對應(yīng)用的傷害未免過大,但如果我們可以檢測出服務(wù)集群中某些故障機(jī)子,并對其進(jìn)行短暫隔離,即可有效保障服務(wù)的高可用與系統(tǒng)的穩(wěn)定性,同時給運(yùn)維人員提供了寶貴的緩沖時間,用于問題定位,排除故障。

下面為大家介紹如何實(shí)現(xiàn)離群實(shí)例摘除。

Microservice Outlier Ejection (微服務(wù)離群實(shí)例摘除)

  • 什么是離群實(shí)例摘除

當(dāng)單點(diǎn)發(fā)生夯機(jī)異常時,consumer 能主動判斷,并將對應(yīng)的 provider 實(shí)例短時間剔除,不再請求,在一定時間間隔后再繼續(xù)訪問。同時,具有全局異常判斷能力,當(dāng) provider 異常實(shí)例的數(shù)量過多時,并且超過一定的控制比例,說明此時 provide 整體服務(wù)質(zhì)量低下,該機(jī)制僅保持摘除一定的比例。

  • 離群實(shí)例摘除的功能

從服務(wù)層容錯能力上,對業(yè)務(wù)穩(wěn)定性進(jìn)行增強(qiáng),有效解決單點(diǎn)故障的問題。

  • 與熔斷的區(qū)別

熔斷是指當(dāng)服務(wù)的輸入負(fù)載激增時, 避免服務(wù)被迅速壓垮導(dǎo)致雪崩效應(yīng),而對負(fù)載進(jìn)行斷路的一種方式 。 熔斷一般由熔斷請求判斷算法,熔斷恢復(fù)機(jī)制,熔斷報警等模塊組成。隔離是指,為了避免在依賴的服務(wù)故障時候造成的故障擴(kuò)散,而采取的將系統(tǒng)進(jìn)行單元化設(shè)計的一種架構(gòu)方法。

若僅僅由于服務(wù)端集群中單點(diǎn)異常問題,就采用熔斷降級方案,將會對應(yīng)用的傷害過大,離群實(shí)例摘除可以有效地解決單點(diǎn)異常問題從而保證服務(wù)質(zhì)量。若 provider 整體服務(wù)質(zhì)量低下時,離群摘除效果不再明顯,此時可以采用熔斷降級功能。

  • 離群實(shí)例摘除支持的版本

只要您的應(yīng)用版本在列表中,您無需改動一行代碼就可以使用到離群實(shí)例摘除功能。

 目前支持版本開發(fā)中版本(即將支持)
Dubbo2.5.0~2.7.3< 2.5.0 dubbox 版本
Spring CloudD、E、F、G、HC

目前已經(jīng)覆蓋了市面上大部分微服務(wù)場景,后續(xù)我們將會持續(xù)支持開源最新的 Dubbo/Spring Cloud 版本。

我們提供了 Dubbo 和 Spring Cloud 兩種場景的離群摘除功能,本文將先介紹一下 Dubbo Microservice Outlier Ejection 的實(shí)踐與效果。

下面將通過在 EDAS 上通過演示 Dubbo 離群摘除功能及效果。

企業(yè)級分布式應(yīng)用服務(wù)EDAS(Enterprise Distributed Application Service)是一個應(yīng)用托管和微服務(wù)管理的 PaaS 平臺,提供應(yīng)用開發(fā)、部署、監(jiān)控、運(yùn)維等全棧式解決方案,同時支持 Dubbo、Spring Cloud 等微服務(wù)運(yùn)行環(huán)境。

https://www.aliyun.com/product/edas

準(zhǔn)備

接下來以微服務(wù)Demo為例子示范離群摘除功能,讀者可以從github中下載驗(yàn)證

https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/src

微服務(wù)Demo是一個簡單的電商項目,下圖為項目結(jié)構(gòu),cartservice 為 Dubbo 框架的購物車服務(wù) provider,productservice 為Spring Cloud提供的商品詳情服務(wù) provider,frontend 為web controller即前端展示頁面,可以理解為consumer。

微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除cdn.com/012c8ebbb65144e189f6731a6f021a4dc23468da.png">

我們將以cartservice服務(wù)即Dubbo服務(wù)端為例子,展示離群實(shí)例摘除功能。

EDAS 上部署微服務(wù) Demo

首先 cd cartservice切換到 cartservice 目錄下,再通過 mvn clean install 打包,通過 cd cartservice-provider/target 切換到target目錄下,我們可以看到新生成的 cartservice-provider-1.0.0-SNAPSHOT.jar 包,然后在 EDAS上 創(chuàng)建一個 cartservice 應(yīng)用。

微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除

然后啟動應(yīng)用,到目前為止,我們啟動了一個 cartservice-provider。點(diǎn)擊按此實(shí)例規(guī)格擴(kuò)容,該服務(wù)我們部署在兩個實(shí)例上。
lADPDgQ9rWd_0YNLzQLq_746_75_jpg_620x10000q90g

我們在這個 provider 的 com.alibabacloud.hipstershop.provider.CartServiceImpl 類中可以看到,這個 provider 是提供了viewCart 和 addItemToCart 的兩個關(guān)于購物車的服務(wù),我們在 viewCart 中加入一些模擬運(yùn)行時異常的邏輯。

    @Value("${exception.ip}")
    private String exceptionIp;

    @Override
    public List<CartItem> viewCart(String userID) {

        if (exceptionIp != null && exceptionIp.equals(getLocalIp())) {
            throw new RuntimeException("運(yùn)行時異常");
        }

        return cartStore.getOrDefault(userID, Collections.emptyList());
    }

其中 exceptionIp 為 ACM 配置中心的exception.ip的配置項,若該項配置為本機(jī)ip時,該服務(wù)throw RuntimeException,用于模擬業(yè)務(wù)異常的場景。

  • 為什么將 cartservice 擴(kuò)容到兩個實(shí)例,想必大家也猜到了,運(yùn)行時通過配置ACM配置中心指定其中一個實(shí)例的IP,模擬出一個實(shí)例異常的場景。

接下來,我們需要部署 frontend / productservice 兩個服務(wù),方式一樣,分別上傳 frontend/target/frontend-1.0.0-SNAPSHOT.jar 和 productservice/productservice-provider/target/productservice-provider-1.0.0-SNAPSHOT.jar

從下圖可以看到,我們的微服務(wù)Demo在EDAS部署上去了。

微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除

模擬業(yè)務(wù)異常

進(jìn)入到 frontend 應(yīng)用中,我們看到其實(shí)例的公網(wǎng) ip 為 47.99.150.33。
微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除

點(diǎn)擊View Cart 訪問至 http://47.99.150.33:8080/cart

微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除

然后繼續(xù)訪問 http://47.99.150.33:8080/cart ,發(fā)現(xiàn) 50 % 的概率錯誤頁面

11

此時,我們寫一個腳本,定時大量訪問 http://47.99.150.33:8080/cart 模擬請求。

while :
do
        result=`curl $1 -s`
        if [[ "$result" == *"500"* ]]; then
                echo `date +%F-%T` $result
        else
                echo `date +%F-%T` "success"
        fi

        sleep 0.1
done

然后 sh curlservice.sh http://47.99.150.33:8080/cart

我們看到不斷重復(fù)的每秒鐘 10 次的 50% 的調(diào)用成功率。

微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除

其實(shí)也可以理解到,下游的服務(wù)質(zhì)量隨著上游的某臺機(jī)子的異常而急劇下降,甚至可能導(dǎo)致下游服務(wù)被上游某些機(jī)子的(系統(tǒng)、業(yè)務(wù))異常給拖垮。

開啟離群摘除策略

下面我將演示離群摘除的策略的開啟及其效果的展示。

創(chuàng)建

我們進(jìn)入到 EDAS 左側(cè)列表的 [微服務(wù)管理] 下的 [離群實(shí)例摘除] 界面中,并選擇創(chuàng)建離群實(shí)例摘除策略。

微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除

如上圖可以選擇命名空間、填寫策略名稱、選擇該策略支持的框架類型(Dubbo/Spring Cloud)。

選擇生效應(yīng)用

微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除

這些參數(shù)都提供了默認(rèn)值,需要根據(jù)自己應(yīng)用的具體情況調(diào)整最合適的值,由于需要保護(hù)的 RuntimeException 屬于業(yè)務(wù)異常于是選上 網(wǎng)絡(luò)異常+業(yè)務(wù)異常。(需要注意的是即使摘除實(shí)例比例上限配得特別低,向下取整數(shù)小于1,當(dāng)集群中實(shí)例數(shù)目大于1,且某一實(shí)例異常,我們也會摘除一實(shí)例)。

創(chuàng)建完成

可以看到策略的信息則創(chuàng)建完成。

策略

微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除

看到了我們創(chuàng)建的離群摘除策略,且是針對Dubbo框架,并且針對的是 網(wǎng)絡(luò)異常+業(yè)務(wù)異常 的異常類型。

驗(yàn)證離群摘除效果

這時,我們看到,再感知到異常后,離群摘除功能生效,請求調(diào)用一陣子后,均返回正確結(jié)果。

微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除

客戶端感知到某臺服務(wù)端機(jī)子異常后,主動摘除。僅僅調(diào)用業(yè)務(wù)正常的 Provider 實(shí)例,同時我們也可以通 ARMS(EDAS監(jiān)控系統(tǒng)) 監(jiān)控看到服務(wù)質(zhì)量的上升,以及流量從異常 Provider 中摘除。

Dubbo框架可以從 /home/admin/.opt/ArmsAgent/logs 目錄下的日志中,搜索日志中的 “OutlierRouter” 關(guān)鍵字可以看到一系列離群實(shí)例摘除的事件日志。

修改/關(guān)閉離群摘除策略

對于EDAS的應(yīng)用我們支持通過控制臺動態(tài)修改和刪除離群摘除策略。

  • 對應(yīng)策略規(guī)則的修改

點(diǎn)擊 修改生效應(yīng)用 或者 編輯策略。

微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除

控制臺的操作,對應(yīng)用中的配置都是實(shí)時生效的,若刪除策略后,默認(rèn)關(guān)閉相關(guān)策略。

若我們打開ARMS監(jiān)控觀察具體的調(diào)用情況。

ARMS監(jiān)控

若我們開啟監(jiān)控,將會直觀看到流量與請求錯誤等信息。

開啟離群摘除前

如下圖方式開啟,然后跳轉(zhuǎn)至ARMS(EDAS監(jiān)控系統(tǒng))應(yīng)用監(jiān)控頁面,我們需要把三個應(yīng)用都開啟高級監(jiān)控。
微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除

從以下拓?fù)鋱D中我們看到,流量不斷地訪問到cartservice服務(wù)上。

微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除

可以看到,在開啟了離群摘除的那個點(diǎn)只后,錯誤率從50%明顯下降。

微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除

Dubbo Agent 方案技術(shù)架構(gòu)

對于用戶來說,無需改動一行代碼,一行配置,即可享受到穩(wěn)定性增強(qiáng)的能力。

離群實(shí)例摘除技術(shù)

Outlier Detection 離群檢測

均是基于時間窗口的數(shù)據(jù)統(tǒng)計。

兩種實(shí)現(xiàn)
1、Dubbo 2.7 版本通過向鏈路中嵌入一個MetricsFilter,對于鏈路的每個request/response做打點(diǎn)處理,統(tǒng)計rt、調(diào)用成功與否、異常類型,并且已endpoint(ip+port)為key存儲

2、在 Agent 底座中統(tǒng)計經(jīng)過的http請求,通過url、rt、狀態(tài)碼、異常類型等數(shù)據(jù)結(jié)果,統(tǒng)計最近時間窗口的數(shù)據(jù)(目前寫死 10 秒,暫時不透出)

實(shí)時統(tǒng)計前N秒的調(diào)用信息,作為離群實(shí)例摘除動作的依據(jù)。

Outlier Ejection 離群摘除

Dubbo 基于 Dubbo Router 實(shí)現(xiàn),對于調(diào)用的上游服務(wù)對應(yīng)的所有 invokers 中,拉黑掉“不健康”的節(jié)點(diǎn),同時記錄拉黑的信息。

Dubbo-Router控制邏輯
每次請求過來僅僅check一下并標(biāo)記狀態(tài),后臺有專門兩個線程將標(biāo)記的流量進(jìn)行判斷是否進(jìn)入隔離列表或從中剔除,修改拉黑信息等耗時操作,最大程度上保證請求的實(shí)時性。

Spring Cloud 基于 擴(kuò)展 LoadBalace 實(shí)現(xiàn),原理相似。

看完上述內(nèi)容,你們對微服務(wù)治理實(shí)踐中如何對單點(diǎn)異常進(jìn)行自動摘除有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI