1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        前端需要了解的泳道概念

        共 2116字,需瀏覽 5分鐘

         ·

        2021-01-04 03:58

        背景

        微服務(wù)框架下服務(wù)個數(shù)多、調(diào)用鏈路較長,其中一個服務(wù)出問題會影響到整條鏈路。但QA提測往往需要該條鏈路上的多個服務(wù)配套測試,甚至是同時測試一個服務(wù)的多個演進版本。

        提供穩(wěn)定環(huán)境 和 多服務(wù)/多版本同時測試 看似相悖的需求,通過泳道“Swimlane”能夠得到解決。

        測試過程中會遇到的問題

        1. 關(guān)于一個服務(wù)上的多個需求的同時測試,存在服務(wù)搶占分支測試的問題;

        2. 不同的業(yè)務(wù)組在測試時依賴的第三方服務(wù)有改動或正在進行新需求測試影響本業(yè)務(wù)測試。

        微服務(wù)框架下服務(wù)個數(shù)多、調(diào)用鏈路較長,其中一個服務(wù)出問題會影響到整條鏈路。但QA提測往往需要該條鏈路上的多個服務(wù)配套測試,甚至是同時測試一個服務(wù)的多個演進版本。提供穩(wěn)定環(huán)境 和 多服務(wù)/多版本同時測試 看似相悖的需求,通過泳道“Swimlane”能夠得到解決。

        什么是泳道

        對服務(wù)鏈按需求進行分組復(fù)制,并實現(xiàn)邏輯、物理的隔離,使得不同需求的服務(wù)鏈運行在相隔的物理機器上,邏輯上如同游泳場中的泳道。

        一個環(huán)境內(nèi)會有一條骨干鏈路(該環(huán)境的默認鏈路)和多條泳道。如圖所示,泳道隔離出了一條調(diào)用邊界:處于[泳道-1]內(nèi)的服務(wù)B要調(diào)用服務(wù)C,若在[泳道-1]內(nèi)部署了C服務(wù),則B只能調(diào)用泳道內(nèi)的C服務(wù),而不能調(diào)用骨干鏈路或其他泳道的C服務(wù);若在[泳道-1]內(nèi)沒有部署C服務(wù),則流量會調(diào)回骨干鏈路。

        優(yōu)勢:

        1. 并行測試。(因此可以根據(jù)測試需要,部署不同分支的服務(wù)分組,多個泳道并行,多個服務(wù)/多個版本可同時提測)

        2. 提供穩(wěn)定的骨干鏈路。(保證整個測試流程始終能正常運行)

        3. 錯誤隔離。(泳道內(nèi)的服務(wù)發(fā)生異常 不會影響其他泳道)

        泳道的特性

        泳道相當于提供了多條“請求的跑道”,理解泳道主要在于理解“流量跑到哪去了”:

        泳道內(nèi)如果沒有部署被調(diào)用服務(wù),流量會fallback到骨干
        – 比如上圖[泳道-2]中的B服務(wù)節(jié)點 調(diào)用了 [骨干鏈路]中的C服務(wù)節(jié)點

        泳道內(nèi)若存在被調(diào)用節(jié)點,那么流量是一定不會fallback的 (包括不可用的和禁用的)
        – 比如上圖[泳道-2]中的A服務(wù)節(jié)點 只會調(diào)用 [泳道-2]中的B服務(wù)節(jié)點,即使[泳道-2]中的B不可用,也是不會fallback的

        骨干環(huán)境是一定不會調(diào)用到泳道內(nèi)的
        – 比如上圖中絕逼不會有 從[骨干鏈路]到[泳道-2]的調(diào)用

        泳道之間是一定不會互相調(diào)用的
        – 比如上圖中絕逼不會有 [泳道-1]與[泳道-2]之間的調(diào)用

        泳道的實現(xiàn)

        泳道實現(xiàn)的重點在于服務(wù)的注冊、發(fā)現(xiàn)和服務(wù)導(dǎo)流。

        后端服務(wù)的注冊和發(fā)現(xiàn)的流程如下:

        1. 服務(wù)B啟動,上報ip、port、appkey、swimlane等信息

        2. 骨干鏈路上的服務(wù)A節(jié)點要調(diào)用B,先去取B的服務(wù)列表,并進行過濾:A不帶有泳道標識,所以只會調(diào)用不帶泳道標識的B服務(wù)節(jié)點

        3. 泳道1上的服務(wù)A節(jié)點要調(diào)用B,也會先去取B的服務(wù)列表,并進行過濾:A帶有泳道=泳道1 標識,所以只會調(diào)用同樣帶有泳道=泳道1 標識的B服務(wù)節(jié)點

        服務(wù)導(dǎo)流

        • 通過域名劃分泳道:為各個泳道申請單獨的域名,根據(jù)域名進行分流

        • 通過header攜帶泳道信息:請求的header字段增加“swimlane=xxxx”,標識請求要打到名為xxxx的泳道里,分流系統(tǒng)會根據(jù)該字段做分流。

        前端靜態(tài)資源,基于泳道名進行隔離,在資源編譯和打包的時候,指定發(fā)布的泳道名,然后資源會上傳到該泳道對應(yīng)的靜態(tài)服務(wù)器中:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        const swimName = process.env.SWIM_ENV;
        if (swimName) {
        console.log('檢測到泳道環(huán)境SWIM_ENV:' + swimName);
        console.log('默認使用test01執(zhí)行發(fā)布');
        }
        const webpackConfig = merge(baseWebpackConfig, {
        devtool: config.build.productionSourceMap ? '#source-map' : false,
        output: {
        path: swimName ? config.build.assetsRoot + `/${swimName}` : config.build.assetsRoot,
        publicPath: swimName ? config.build.assetsPublicPath + `/${swimName}/` : config.build.assetsPublicPath,
        filename: 'js/[name].bundle.[chunkhash].js',
        chunkFilename: 'js/[name].[chunkhash:5].chunk.js',
        library: '[name]'
        },
        });

        點個『在看』支持下?


        瀏覽 109
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            成人毛片免费观看无需播放器 | 五月婷婷五月丁香 | 美女被人c| 美剧19禁啪啪无遮挡大尺度 | ass漂亮女人下部picasa | 扒开双腿猛进入校花 | www.亚洲 | 成人午夜免费无码区无码A片在线观看 | 性爱综合网 | 亚洲天堂第一页 |