Sentinel GO API 使用指南

hjavn發表於2021-08-18

工具與資源中心

幫助開發者更加高效的工作,提供圍繞開發者全生命週期的工具與資源
developer.aliyun.com/tool?spm=a1z3...

使用者接入使用 Sentinel Go (後文均用 Sentinel 表示 Sentinel Go) 主要需要需要以下幾步:

  1. 對 Sentinel 的執行環境進行相關配置並初始化。API 介面使用細節可以參考:配置方式
  2. 埋點(定義資源),該步驟主要是確定系統中有哪些資源需要防護,資源定義可參考:新手指南
  3. 配置規則,該步驟主要是為每個資源都配置具體的規則,規則的配置可參考:新手指南 以及各個模組的使用文件。
  4. 編寫資源防護的入口和出口程式碼。釋放方式可參考:新手指南

通用配置及初始化

使用 Sentinel 需要在應用啟動時對 Sentinel 執行環境進行相關配置並觸發初始化。api 包下提供如下函式:

  • InitDefault():從環境變數指定的配置檔案以及環境變數中讀取相應配置來初始化 Sentinel,若環境變數不存在則使用預設值。
  • Init(configPath string):從給定的 YAML 檔案中讀取相應配置來初始化 Sentinel。
  • InitWithConfig(confEntity *config.Entity): 使用者硬編碼配置物件*config.Entity來初始化Sentinel。

通用配置項載入策略和配置項請參考 配置方式使用文件

示例程式碼:

  1. import (
  2. sentinel “github.com/alibaba/sentinel-golang/api”
  3. )
  4. func initSentinel() {
  5. err := sentinel.Init(confPath)
  6. if err != nil {
  7. // 初始化 Sentinel 失敗
  8. }
  9. }

注意:必須成功呼叫 Sentinel 的初始化函式以後再呼叫埋點 API。

埋點(定義資源)

使用 Sentinel 的 Entry API 將業務邏輯封裝起來,這一步稱為“埋點”。每個埋點都有一個資源名稱(resource),代表觸發了這個資源的呼叫或訪問。

埋點 API 位於 api 包中:

  • Entry(resource string, opts ...Option) (*base.SentinelEntry, *base.BlockError)

其中 resource 代表埋點資源名,opts 代表埋點配置。這裡需要注意的是,返回值引數列表的第一個和第二個引數是互斥的,也就是說,如果Entry執行pass,那麼Sentinel會返回(*base.SentinelEntry, nil);如果Entry執行blocked,那麼Sentinel會返回(nil, *base.BlockError)。

目前支援以下埋點配置:

  • WithTrafficType(entryType base.TrafficType):標記該埋點資源的流量型別,其中 Inbound 代表入口流量,Outbound 代表出口流量。若不指定,預設為 Outbound。
  • WithResourceType(resourceType base.ResourceType):標記該埋點資源的分類。
  • WithAcquireCount(acquireCount uint32):標記每次觸發該埋點計為幾次呼叫(可以理解為 batch count)。若不指定,預設為 1。
  • WithArgs(args ...interface{}):埋點攜帶的引數列表,為熱點引數統計預留。
  • WithSlotChain(chain *base.SlotChain):埋點執行的檢查的slotchain,若不指定,預設使用全域性slotchain

埋點 API 示例:

  1. import (
  2. sentinel “github.com/alibaba/sentinel-golang/api”
  3. )
  4. // Entry 方法用於埋點
  5. e, b := sentinel.Entry(“your-resource-name”, sentinel.WithTrafficType(base.Inbound))
  6. if b != nil {
  7. // 請求被流控,可以從 BlockError 中獲取限流詳情
  8. // block 後不需要進行 Exit()
  9. } else {
  10. // 請求可以通過,在此處編寫您的業務邏輯
  11. // 務必保證業務邏輯結束後 Exit
  12. e.Exit()
  13. }

若該次呼叫被拒絕,則 Entry API 會返回 BlockError 代表被 Sentinel 限流。BlockError 提供了限流原因以及觸發的規則等資訊,可以方便開發者獲取相關資訊進行記錄和處理。

規則配置

硬編碼方式

Sentinel 支援原始的硬編碼方式載入規則,可以通過各個模組的 LoadRules(rules) 函式載入規則。以流控規則為例:

  1. _, err = flow.LoadRules([]*flow.Rule{
  2. {
  3. Resource: “some-test”,
  4. Threshold: 10,
  5. TokenCalculateStrategy: flow.Direct,
  6. ControlBehavior: flow.Reject,
  7. },
  8. })
  9. if err != nil {
  10. // 載入規則失敗,進行相關處理
  11. }

動態資料來源

Sentinel 提供動態資料來源介面進行擴充套件,使用者可以通過動態檔案、etcd、consul、nacos 等配置中心來動態地配置規則。

本文轉自:developer.aliyun.com/article/78738...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章