sentinel 提供多樣的 spi 介面用於提供擴充套件的能力。使用者可以在用同乙個 sentinel-core 的基礎上自行擴充套件介面實現,從而可以方便地給 sentinel 新增自定義的邏輯。
為了統一初始化的流程,我們抽象出了initfunc
介面代表 sentinel 的一些初始化邏輯,如:
我們可以通過註解設定initfunc
執行的優先順序。當應用首次訪問資源時,註冊的初始化函式會依次執行。若希望手動提前觸發初始化,可以在相應的位置(如 spring bean)呼叫initexecutor.doinit()
函式,重複呼叫只會執行一次。
sentinel 內部是通過一系列的 slot 組成的 slot chain 來完成各種功能的,包括構建呼叫鏈、呼叫資料統計、規則檢查等。各個 slot 之間的順序非常重要。sentinel 將slotchainbuilder
作為 spi 介面進行擴充套件,使得 slot chain 具備了擴充套件的能力。使用者可以自行加入自定義的 slot 並編排 slot 間的順序,從而可以給 sentinel 新增自定義的功能。
比如我們想要在請求 pass 後記錄當前的 context 和資源資訊,則可以實現乙個簡單的 slot:
public class demoslot extends abstractlinkedprocessorslot
@override}}
然後實現乙個slotchainbuilder
,可以在defaultslotchainbuilder
的基礎上將我們新的 slot 新增到鏈的尾部(當然也可以不用 defaultslotchainbuilder,自由組合現有的 slot):
package com.alibaba.csp.sentinel.demo.slot;
public class demoslotchainbuilder implements slotchainbuilder
}
最後在resources/meta-inf/services
目錄下的 spi 配置檔案com.alibaba.csp.sentinel.slotchain.slotchainbuilder
中新增上實現的 slotchainbuilder 的類名即可生效:
# custom slot chain builder
com.alibaba.csp.sentinel.demo.slot.demoslotchainbuilder
sentinel 的熱點限流模組就是利用了 slot chain 的擴充套件機制來將熱點限流功能新增到原有的功能鏈中。
之前statisticslot
裡面包含了太多的邏輯,像普通 qps 和 熱點引數 qps 的 addpass/addblock 等邏輯統計都在statisticslot
裡面,各個邏輯都雜糅在一起,不利於擴充套件。因此有必要為statisticslot
抽象出一系列的 callback,從而使 statisticslot 具備基本的擴充套件能力,並將一系列的邏輯從statisticslot
解耦出來,更為清晰。目前 sentinel 提供了兩種 callback:
使用者只需將實現的 callback 註冊到statisticslotcallbackregistry
即可生效。
sentinel 的 動態規則資料來源 用於從外部的儲存中讀取及寫入規則。sentinel 將動態規則資料來源劃分為兩種型別:讀資料來源(readabledatasource
)和寫資料來源(writabledatasource
),從而使不同型別的資料來源職責更加清晰:
我們只需要自己實現動態規則源,然後將其註冊至對應的 rulemanager 上,這樣就可以實時地配置規則並進行拉取/推送了。註冊動態規則源時可以借助 sentinel 的initfunc
spi 在初始化時自動註冊。
架構 擴充套件性
擴充套件選和伸縮性 擴充套件性 指對現有系統影響最小的情況下,系統功能可持續擴充套件或提公升的能力。表現在系統基礎設施穩定不需要經常變更,應用之間較少依賴和耦合,對需求變更可以敏捷響應。它是系統架構設計層面的開閉原則 對擴充套件開放,對修改關閉 架構設計考慮未來功能擴充套件,當系統增加新功能時,不需...
再談 eBay 的擴充套件性最佳實踐
很多人都覺得 ebay 在qcon 北京 上的技術講座不錯,但對我來說,其實衝擊力沒那麼大了。ebay 一兩年前就是這個 ppt 不過還是比 amazon 的 jeff barr 強了很多,以後要是開個什麼會,你把 jeff barr 請來還講那個銷售文件,估計自己都不好意思。不過,ebay 這次的...
匯入 設計的可擴充套件性
敏捷思想的流行使得很多人對可擴充套件設計產生了一種懷疑的態度。這有幾方面的原因,一方面是j2ee平台本身提供的分布式機制等技術因素很容易誘導你定義不 必要的擴充套件需求,第二是基於目前的技術手段對於程式結構的分解仍然有著很大限制,具體的程式實現中往往會引入某種強制依賴,削弱了潛在的可擴充套件性,第三...