W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
本文具體說明了地址遷移過程中使用的規(guī)則體信息,用戶可以根據(jù)自己需求定制適合自己的遷移規(guī)則。
在 Dubbo 3 之前地址注冊(cè)模型是以接口級(jí)粒度注冊(cè)到注冊(cè)中心的,而 Dubbo 3 全新的應(yīng)用級(jí)注冊(cè)模型注冊(cè)到注冊(cè)中心的粒度是應(yīng)用級(jí)的。從注冊(cè)中心的實(shí)現(xiàn)上來說是幾乎不一樣的,這導(dǎo)致了對(duì)于從接口級(jí)注冊(cè)模型獲取到的 invokers 是無法與從應(yīng)用級(jí)注冊(cè)模型獲取到的 invokers 進(jìn)行合并的。為了幫助用戶從接口級(jí)往應(yīng)用級(jí)遷移,Dubbo 3 設(shè)計(jì)了 Migration 機(jī)制,基于三個(gè)狀態(tài)的切換實(shí)現(xiàn)實(shí)際調(diào)用中地址模型的切換。
當(dāng)前共存在三種狀態(tài),F(xiàn)ORCE_INTERFACE(強(qiáng)制接口級(jí)),APPLICATION_FIRST(應(yīng)用級(jí)優(yōu)先)、FORCE_APPLICATION(強(qiáng)制應(yīng)用級(jí))。
FORCE_INTERFACE:只啟用兼容模式下接口級(jí)服務(wù)發(fā)現(xiàn)的注冊(cè)中心邏輯,調(diào)用流量 100% 走原有流程 APPLICATION_FIRST:開啟接口級(jí)、應(yīng)用級(jí)雙訂閱,運(yùn)行時(shí)根據(jù)閾值和灰度流量比例動(dòng)態(tài)決定調(diào)用流量走向 FORCE_APPLICATION:只啟用新模式下應(yīng)用級(jí)服務(wù)發(fā)現(xiàn)的注冊(cè)中心邏輯,調(diào)用流量 100% 走應(yīng)用級(jí)訂閱的地址
規(guī)則采用 yaml 格式配置,具體配置下參考如下:
key: 消費(fèi)者應(yīng)用名(必填) step: 狀態(tài)名(必填) threshold: 決策閾值(默認(rèn)1.0) proportion: 灰度比例(默認(rèn)100) delay: 延遲決策時(shí)間(默認(rèn)0) force: 強(qiáng)制切換(默認(rèn) false) interfaces: 接口粒度配置(可選) - serviceKey: 接口名(接口 + : + 版本號(hào))(必填) threshold: 決策閾值 proportion: 灰度比例 delay: 延遲決策時(shí)間 force: 強(qiáng)制切換 step: 狀態(tài)名(必填) - serviceKey: 接口名(接口 + : + 版本號(hào)) step: 狀態(tài)名 applications: 應(yīng)用粒度配置(可選) - serviceKey: 應(yīng)用名(消費(fèi)的上游應(yīng)用名)(必填) threshold: 決策閾值 proportion: 灰度比例 delay: 延遲決策時(shí)間 force: 強(qiáng)制切換 step: 狀態(tài)名(必填)
參考配置示例如下:
key: demo-consumer step: APPLICATION_FIRST threshold: 1.0 proportion: 60 delay: 0 force: false interfaces: - serviceKey: DemoService:1.0.0 threshold: 0.5 proportion: 30 delay: 0 force: true step: APPLICATION_FIRST - serviceKey: GreetingService:1.0.0 step: FORCE_APPLICATION
? 配置項(xiàng)內(nèi)容參考上一節(jié)
程序啟動(dòng)時(shí)會(huì)拉取此配置作為最高優(yōu)先級(jí)啟動(dòng)項(xiàng),當(dāng)配置項(xiàng)為啟動(dòng)項(xiàng)時(shí)不執(zhí)行檢查操作,直接按狀態(tài)信息達(dá)到終態(tài)。 程序運(yùn)行過程中收到新配置項(xiàng)將執(zhí)行遷移操作,過程中根據(jù)配置信息進(jìn)行檢查,如果檢查失敗將回滾為遷移前狀態(tài)。遷移是按接口粒度執(zhí)行的,也即是如果一個(gè)應(yīng)用有 10 個(gè)接口,其中 8 個(gè)遷移成功,2 個(gè)失敗,那終態(tài) 8 個(gè)遷移成功的接口將執(zhí)行新的行為,2 個(gè)失敗的仍為舊狀態(tài)。如果需要重新觸發(fā)遷移可以通過重新下發(fā)規(guī)則達(dá)到。
注:如果程序在遷移時(shí)由于檢查失敗回滾了,由于程序無回寫配置項(xiàng)行為,所以如果此時(shí)程序重啟了,那么程序會(huì)直接按照新的行為不檢查直接初始化。
此配置項(xiàng)可以通過環(huán)境變量或者配置中心傳入,啟動(dòng)時(shí)優(yōu)先級(jí)比配置文件低,也即是當(dāng)配置中心的配置文件不存在時(shí)讀取此配置項(xiàng)作為啟動(dòng)狀態(tài)。
配置項(xiàng)名 | 默認(rèn)值 | 說明 |
---|---|---|
dubbo.migration.file | dubbo-migration.yaml | 本地配置文件路徑 |
dubbo.application.migration.delay | 60000 | 配置文件延遲生效時(shí)間(毫秒) |
配置文件中格式與前文提到的規(guī)則一致
本地文件配置方式本質(zhì)上是一個(gè)延時(shí)配置通知的方式,本地文件不會(huì)影響默認(rèn)啟動(dòng)方式,當(dāng)達(dá)到延時(shí)時(shí)間后觸發(fā)推送一條內(nèi)容和本地文件一致的通知。這里的延時(shí)時(shí)間與規(guī)則體中的 delay 字段無關(guān)聯(lián)。 本地文件配置方式可以保證啟動(dòng)以默認(rèn)行為初始化,當(dāng)達(dá)到延時(shí)時(shí)觸發(fā)遷移操作,執(zhí)行對(duì)應(yīng)的檢查,避免啟動(dòng)時(shí)就以終態(tài)方式啟動(dòng)。
閾值機(jī)制旨在進(jìn)行流量切換前的地址數(shù)檢查,如果應(yīng)用級(jí)的可使用地址數(shù)與接口級(jí)的可用地址數(shù)對(duì)比后沒達(dá)到閾值將檢查失敗。
核心代碼如下:
if (((float) newAddressSize / (float) oldAddressSize) >= threshold) { return true; } return false;
同時(shí) MigrationAddressComparator 也是一個(gè) SPI 拓展點(diǎn),用戶可以自行拓展,所有檢查的結(jié)果取交集。
灰度比例功能僅在應(yīng)用級(jí)優(yōu)先狀態(tài)下生效。此功能可以讓用戶自行決定調(diào)用往新模式應(yīng)用級(jí)注冊(cè)中心地址的調(diào)用數(shù)比例?;叶壬У那疤崾菨M足了閾值探測,在應(yīng)用級(jí)優(yōu)先狀態(tài)下,如果閾值探測通過,currentAvailableInvoker 將被切換為對(duì)應(yīng)應(yīng)用級(jí)地址的 invoker;如果探測失敗 currentAvailableInvoker 仍為原有接口級(jí)地址的 invoker。
流程圖如下: 探測階段 調(diào)用階段
核心代碼如下:
// currentAvailableInvoker is based on MigrationAddressComparator's result if (currentAvailableInvoker != null) { if (step == APPLICATION_FIRST) { // call ratio calculation based on random value if (ThreadLocalRandom.current().nextDouble(100) > promotion) { return invoker.invoke(invocation); } } return currentAvailableInvoker.invoke(invocation); }
地址遷移過程中涉及到了三種狀態(tài)的切換,為了保證平滑遷移,共有 6 條切換路徑需要支持,可以總結(jié)為從強(qiáng)制接口級(jí)、強(qiáng)制應(yīng)用級(jí)往應(yīng)用級(jí)優(yōu)先切換;應(yīng)用級(jí)優(yōu)先往強(qiáng)制接口級(jí)、強(qiáng)制應(yīng)用級(jí)切換;還有強(qiáng)制接口級(jí)和強(qiáng)制應(yīng)用級(jí)互相切換。 對(duì)于同一接口切換的過程總是同步的,如果前一個(gè)規(guī)則還未處理完就收到新規(guī)則則回進(jìn)行等待。
從強(qiáng)制接口級(jí)、強(qiáng)制應(yīng)用級(jí)往應(yīng)用級(jí)優(yōu)先切換本質(zhì)上是從某一單訂閱往雙訂閱切換,保留原有的訂閱并創(chuàng)建另外一種訂閱的過程。這個(gè)切換模式下規(guī)則體中配置的 delay 配置不會(huì)生效,也即是創(chuàng)建完訂閱后馬上進(jìn)行閾值探測并決策選擇某一組訂閱進(jìn)行實(shí)際優(yōu)先調(diào)用。由于應(yīng)用級(jí)優(yōu)先模式是支持運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行閾值探測,所以對(duì)于部分注冊(cè)中心無法啟動(dòng)時(shí)即獲取全量地址的場景在全部地址通知完也會(huì)重新計(jì)算閾值并切換。 應(yīng)用級(jí)優(yōu)先模式下的動(dòng)態(tài)切換是基于服務(wù)目錄(Directory)的地址監(jiān)聽器實(shí)現(xiàn)的。
應(yīng)用級(jí)優(yōu)先往強(qiáng)制接口級(jí)、強(qiáng)制應(yīng)用級(jí)切換的過程是對(duì)雙訂閱的地址進(jìn)行檢查,如果滿足則對(duì)另外一份訂閱進(jìn)行銷毀,如果不滿足則回滾保留原來的應(yīng)用級(jí)優(yōu)先狀態(tài)。 如果用戶希望這個(gè)切換過程不經(jīng)過檢查直接切換可以通過配置 force 參數(shù)實(shí)現(xiàn)。
強(qiáng)制接口級(jí)和強(qiáng)制應(yīng)用級(jí)互相切換需要臨時(shí)創(chuàng)建一份新的訂閱,判斷新的訂閱(即閾值計(jì)算時(shí)使用新訂閱的地址數(shù)去除舊訂閱的地址數(shù))是否達(dá)標(biāo),如果達(dá)標(biāo)則進(jìn)行切換,如果不達(dá)標(biāo)會(huì)銷毀這份新的訂閱并且回滾到之前的狀態(tài)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: