工具與資源中心
幫助開發者更加高效的工作,提供圍繞開發者全生命週期的工具與資源
developer.aliyun.com/tool?spm=a1z3...
使用者接入使用 Sentinel Go (後文均用 Sentinel 表示 Sentinel Go) 主要需要需要以下幾步:
- 對 Sentinel 的執行環境進行相關配置並初始化。API 介面使用細節可以參考:配置方式
- 埋點(定義資源),該步驟主要是確定系統中有哪些資源需要防護,資源定義可參考:新手指南
- 配置規則,該步驟主要是為每個資源都配置具體的規則,規則的配置可參考:新手指南 以及各個模組的使用文件。
- 編寫資源防護的入口和出口程式碼。釋放方式可參考:新手指南
通用配置及初始化
使用 Sentinel 需要在應用啟動時對 Sentinel 執行環境進行相關配置並觸發初始化。api
包下提供如下函式:
InitDefault()
:從環境變數指定的配置檔案以及環境變數中讀取相應配置來初始化 Sentinel,若環境變數不存在則使用預設值。Init(configPath string)
:從給定的 YAML 檔案中讀取相應配置來初始化 Sentinel。InitWithConfig(confEntity *config.Entity)
: 使用者硬編碼配置物件*config.Entity
來初始化Sentinel。
通用配置項載入策略和配置項請參考 配置方式使用文件
示例程式碼:
- import (
- sentinel “github.com/alibaba/sentinel-golang/api”
- )
- func initSentinel() {
- err := sentinel.Init(confPath)
- if err != nil {
- // 初始化 Sentinel 失敗
- }
- }
注意:必須成功呼叫 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 示例:
- import (
- sentinel “github.com/alibaba/sentinel-golang/api”
- )
- // Entry 方法用於埋點
- e, b := sentinel.Entry(“your-resource-name”, sentinel.WithTrafficType(base.Inbound))
- if b != nil {
- // 請求被流控,可以從 BlockError 中獲取限流詳情
- // block 後不需要進行 Exit()
- } else {
- // 請求可以通過,在此處編寫您的業務邏輯
- // 務必保證業務邏輯結束後 Exit
- e.Exit()
- }
若該次呼叫被拒絕,則 Entry API 會返回 BlockError 代表被 Sentinel 限流。BlockError 提供了限流原因以及觸發的規則等資訊,可以方便開發者獲取相關資訊進行記錄和處理。
規則配置
硬編碼方式
Sentinel 支援原始的硬編碼方式載入規則,可以通過各個模組的 LoadRules(rules)
函式載入規則。以流控規則為例:
- _, err = flow.LoadRules([]*flow.Rule{
- {
- Resource: “some-test”,
- Threshold: 10,
- TokenCalculateStrategy: flow.Direct,
- ControlBehavior: flow.Reject,
- },
- })
- if err != nil {
- // 載入規則失敗,進行相關處理
- }
動態資料來源
Sentinel 提供動態資料來源介面進行擴充套件,使用者可以通過動態檔案、etcd、consul、nacos 等配置中心來動態地配置規則。
本文轉自:developer.aliyun.com/article/78738...
本作品採用《CC 協議》,轉載必須註明作者和本文連結