微服務治理實踐中如何對單點異常進行自動摘除

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

成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于成都網(wǎng)站建設、做網(wǎng)站、南華網(wǎng)絡推廣、微信小程序定制開發(fā)、南華網(wǎng)絡營銷、南華企業(yè)策劃、南華品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供南華建站搭建服務,24小時服務熱線:18982081108,官方網(wǎng)址:muchs.cn

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

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

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

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

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

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

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

Microservice Outlier Ejection (微服務離群實例摘除)

  • 什么是離群實例摘除

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

  • 離群實例摘除的功能

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

  • 與熔斷的區(qū)別

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

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

  • 離群實例摘除支持的版本

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

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

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

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

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

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

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

準備

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

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

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

微服務治理實踐中如何對單點異常進行自動摘除cdn.com/012c8ebbb65144e189f6731a6f021a4dc23468da.png">

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

EDAS 上部署微服務 Demo

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

微服務治理實踐中如何對單點異常進行自動摘除

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

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

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

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

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

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

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

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

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

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

微服務治理實踐中如何對單點異常進行自動摘除

模擬業(yè)務異常

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

點擊View Cart 訪問至 http://47.99.150.33:8080/cart

微服務治理實踐中如何對單點異常進行自動摘除

然后繼續(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

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

微服務治理實踐中如何對單點異常進行自動摘除

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

開啟離群摘除策略

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

創(chuàng)建

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

微服務治理實踐中如何對單點異常進行自動摘除

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

選擇生效應用

微服務治理實踐中如何對單點異常進行自動摘除

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

創(chuàng)建完成

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

策略

微服務治理實踐中如何對單點異常進行自動摘除

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

驗證離群摘除效果

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

微服務治理實踐中如何對單點異常進行自動摘除

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

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

修改/關閉離群摘除策略

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

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

點擊 修改生效應用 或者 編輯策略。

微服務治理實踐中如何對單點異常進行自動摘除

控制臺的操作,對應用中的配置都是實時生效的,若刪除策略后,默認關閉相關策略。

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

ARMS監(jiān)控

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

開啟離群摘除前

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

從以下拓撲圖中我們看到,流量不斷地訪問到cartservice服務上。

微服務治理實踐中如何對單點異常進行自動摘除

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

微服務治理實踐中如何對單點異常進行自動摘除

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

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

離群實例摘除技術

Outlier Detection 離群檢測

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

兩種實現(xiàn)
1、Dubbo 2.7 版本通過向鏈路中嵌入一個MetricsFilter,對于鏈路的每個request/response做打點處理,統(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 秒,暫時不透出)

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

Outlier Ejection 離群摘除

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

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

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

看完上述內(nèi)容,你們對微服務治理實踐中如何對單點異常進行自動摘除有進一步的了解嗎?如果還想了解更多知識或者相關內(nèi)容,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

網(wǎng)頁標題:微服務治理實踐中如何對單點異常進行自動摘除
文章鏈接:http://muchs.cn/article16/pidogg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序網(wǎng)站建設建站公司、ChatGPT手機網(wǎng)站建設、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)