日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实践 | Sentinel 扩展性设计

發布時間:2024/8/23 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实践 | Sentinel 扩展性设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Sentinel?提供多樣的 SPI 接口用于提供擴展的能力。用戶可以在用同一個 sentinel-core 的基礎上自行擴展接口實現,從而可以方便地給 Sentinel 添加自定義的邏輯。

初始化邏輯擴展機制

為了統一初始化的流程,我們抽象出了?InitFunc?接口代表 Sentinel 的一些初始化邏輯,如:

  • 注冊動態規則源(示例)
  • 注冊 StatisticSlot 回調函數(示例)
  • 啟動 Command Center
  • 初始化心跳發送

我們可以通過注解設置?InitFunc?執行的優先級。當應用首次訪問資源時,注冊的初始化函數會依次執行。若希望手動提前觸發初始化,可以在相應的位置(如 Spring Bean)調用?InitExecutor.doInit()?函數,重復調用只會執行一次。

Slot Chain 擴展機制

Sentinel 內部是通過一系列的 slot 組成的 slot chain 來完成各種功能的,包括構建調用鏈、調用數據統計、規則檢查等。各個 slot 之間的順序非常重要。Sentinel 將?SlotChainBuilder?作為 SPI 接口進行擴展,使得 Slot Chain 具備了擴展的能力。用戶可以自行加入自定義的 slot 并編排 slot 間的順序,從而可以給 Sentinel 添加自定義的功能。

?

比如我們想要在請求 pass 后記錄當前的 context 和資源信息,則可以實現一個簡單的 slot:

public class DemoSlot extends AbstractLinkedProcessorSlot<DefaultNode> {@Overridepublic 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);}@Overridepublic 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 {@Overridepublic 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 builder com.alibaba.csp.sentinel.demo.slot.DemoSlotChainBuilder

Sentinel 的熱點限流模塊就是利用了 Slot Chain 的擴展機制來將熱點限流功能添加到原有的功能鏈中。

StatisticSlot Callback

之前?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 在初始化時自動注冊。

Transport 擴展機制

  • CommandCenter 可擴展:用戶可以用不同的網絡協議或不同的庫來實現 Transport API Server。
  • HeartbeatSender 可擴展:用戶可以用不同的網絡協議和心跳策略來實現心跳發送(上報到控制臺)。
  • CommandHandler 可擴展:用戶可以自行實現?CommandHandler?并注冊到 SPI 配置文件中來為 CommandCenter 添加自定義的命令。


原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。

總結

以上是生活随笔為你收集整理的实践 | Sentinel 扩展性设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。