這篇文章主要介紹“Sentinel擴展機制是什么”,在日常操作中,相信很多人在Sentinel擴展機制是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Sentinel擴展機制是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Sentinel 提供多樣的 SPI 接口用于提供擴展的能力。用戶可以在用同一個 sentinel-core 的基礎上自行擴展接口實現,從而可以方便地給 Sentinel 添加自定義的邏輯。
為了統一初始化的流程,我們抽象出了
InitFunc
接口代表 Sentinel 的一些初始化邏輯,如:
注冊動態規則源( 示例 )
注冊 StatisticSlot 回調函數( 示例 )
啟動 Command Center
初始化心跳發送
我們可以通過注解設置
InitFunc
執行的優先級。當應用首次訪問資源時,注冊的初始化函數會依次執行。若希望手動提前觸發初始化,可以在相應的位置(如 Spring Bean)調用
InitExecutor.doInit()
函數,重復調用只會執行一次。
Sentinel 內部是通過一系列的 slot 組成的 slot chain 來完成各種功能的,包括構建調用鏈、調用數據統計、規則檢查等。各個 slot 之間的順序非常重要。Sentinel 將
SlotChainBuilder
作為 SPI 接口進行擴展,使得 Slot Chain 具備了擴展的能力。用戶可以自行加入自定義的 slot 并編排 slot 間的順序,從而可以給 Sentinel 添加自定義的功能。
cdn.nlark.com/lark/0/2018/png/47688/1539165202133-64062dc7-88f1-45ac-8177-c29cd9ca0e9d.png">
比如我們想要在請求 pass 后記錄當前的 context 和資源信息,則可以實現一個簡單的 slot:
public class DemoSlot extends AbstractLinkedProcessorSlot<DefaultNode> { @Override
public void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode node, int count, Object... args)
throws Throwable {
System.out.println("Current context: " + context.getName());
System.out.println("Current entry resource: " + context.getCurEntry().getResourceWrapper().getName());
fireEntry(context, resourceWrapper, node, count, args);
} @Override
public void exit(Context context, ResourceWrapper resourceWrapper, int count, Object... args) {
System.out.println("Exiting for entry on DemoSlot: " + context.getCurEntry().getResourceWrapper().getName());
fireExit(context, resourceWrapper, count, args);
}
}然后實現一個
SlotChainBuilder,可以在
DefaultSlotChainBuilder
的基礎上將我們新的 slot 添加到鏈的尾部(當然也可以不用 DefaultSlotChainBuilder,自由組合現有的 slot):
package com.alibaba.csp.sentinel.demo.slot;public class DemoSlotChainBuilder implements SlotChainBuilder { @Override
public ProcessorSlotChain build() {
ProcessorSlotChain chain = new DefaultSlotChainBuilder().build();
chain.addLast(new DemoSlot()); return chain;
}
}最后在
resources/META-INF/services
目錄下的 SPI 配置文件
com.alibaba.csp.sentinel.slotchain.SlotChainBuilder
中添加上實現的 SlotChainBuilder 的類名即可生效:
# Custom slot chain buildercom.alibaba.csp.sentinel.demo.slot.DemoSlotChainBuilder
Sentinel 的熱點限流模塊就是利用了 Slot Chain 的擴展機制來將熱點限流功能添加到原有的功能鏈中。
之前
StatisticSlot
里面包含了太多的邏輯,像普通 QPS 和 熱點參數 QPS 的 addPass/addBlock 等邏輯統計都在
StatisticSlot
里面,各個邏輯都雜糅在一起,不利于擴展。因此有必要為
StatisticSlot
抽象出一系列的 callback,從而使 StatisticSlot 具備基本的擴展能力,并將一系列的邏輯從
StatisticSlot
解耦出來,更為清晰。目前 Sentinel 提供了兩種 callback:
ProcessorSlotEntryCallback:包含
onPass
和
onBlocked
兩個回調函數,分別對應請求通過 StatisticSlot 和請求被 blocked 的時候執行。
ProcessorSlotExitCallback:包含
onExit
回調函數,當請求經 StatisticSlot exit 的時候執行。
用戶只需將實現的 callback 注冊到
StatisticSlotCallbackRegistry
即可生效。
Sentinel 的
動態規則數據源
用于從外部的存儲中讀取及寫入規則。Sentinel 將動態規則數據源劃分為兩種類型:讀數據源(ReadableDataSource)和寫數據源(WritableDataSource),從而使不同類型的數據源職責更加清晰:
讀數據源僅負責監聽或輪詢讀取遠程存儲的變更。
寫數據源僅負責將規則變更寫入到規則源中。
我們只需要自己實現動態規則源,然后將其注冊至對應的 RuleManager 上,這樣就可以實時地配置規則并進行拉取/推送了。注冊動態規則源時可以借助 Sentinel 的
InitFunc
SPI 在初始化時自動注冊。
CommandCenter 可擴展:用戶可以用不同的網絡協議或不同的庫來實現 Transport API Server。
HeartbeatSender 可擴展:用戶可以用不同的網絡協議和心跳策略來實現心跳發送(上報到控制臺)。
CommandHandler 可擴展:用戶可以自行實現
CommandHandler
并注冊到 SPI 配置文件中來為 CommandCenter 添加自定義的命令。
到此,關于“Sentinel擴展機制是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。