Sentinel原始碼之基礎概念

2022-10-11 09:42:10 字數 3632 閱讀 7239

官網版本說明:版本說明

sentinel作為ali開源的一款輕量級流控框架,主要以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度來幫助使用者保護服務的穩定性。相比於hystrix,sentinel的設計更加簡單,在 sentinel中資源定義和規則配置是分離的,也就是說使用者可以先通過sentinel api給對應的業務邏輯定義資源(埋點),然後在需要的時候再配置規則,通過這種組合方式,極大的增加了sentinel流控的靈活性。

引入sentinel帶來的效能損耗非常小。只有在業務單機量級超過25w qps的時候才會有一些顯著的影響(5% - 10% 左右),單機qps不太大的時候損耗幾乎可以忽略不計。

sentinel提供兩種埋點方式:

sentinel 的核心骨架,將不同的 slot 按照順序串在一起(責任鏈模式),從而將不同的功能(限流、降級、系統保護)組合在一起。slot chain 其實可以分為兩部分:統計資料構建部分(statistic)和判斷部分(rule checking)。

在sentinel裡面,所有的資源都對應乙個資源名稱(resourcename),每次資源呼叫都會建立乙個 entry 物件。entry 可以通過對主流框架的適配自動建立,也可以通過註解的方式或呼叫 sphu api 顯式建立。entry 建立的時候,同時也會建立一系列功能插槽(slot chain),這些插槽有不同的職責,例如預設情況下會建立一下7個插槽:

nodeselectorslot 負責收集資源的路徑,並將這些資源的呼叫路徑,以樹狀結構儲存起來,用於根據呼叫路徑來限流降級;

clusterbuilderslot 則用於儲存資源的統計資訊以及呼叫者資訊,例如該資源的 rt, qps, thread count 等等,這些資訊將用作為多維度限流,降級的依據,對應簇點鏈路;

statisticslot 則用於記錄、統計不同緯度的 runtime 指標監控資訊;

flowslot 則用於根據預設的限流規則以及前面 slot 統計的狀態,來進行流量控制,對應流控規則;

authorityslot 則根據配置的黑白名單和呼叫**資訊,來做黑白名單控制,對應授權規則;

degradeslot 則通過統計資訊以及預設的規則,來做熔斷降級,對應熔斷規則;

systemslot 則通過系統的狀態,例如 load1 等,來控制總的入口流量,對應系統規則;

重要的概念:

slot chain:插槽

node:根節點

context:對資源操作時的上下文環境,每個資源操作(針對resource進行的entry/exit)必須屬於乙個context,如果程式中未指定context,會建立name為"sentinel_default_context"的預設context。乙個context生命週期內可能有多個資源操作,context生命週期內的最後乙個資源exit時會清理該context,這也預示這真個context生命週期的結束。

entry:表示一次資源操作,內部會儲存當前呼叫資訊。在乙個context生命週期中多次資源操作,也就是對應多個entry,這些entry形成parent/child結構儲存在entry例項中

sentinel 將processorslot作為 spi 介面進行擴充套件,使得 slot chain 具備了擴充套件的能力。您可以自行加入自定義的 slot 並編排 slot 間的順序,從而可以給 sentinel 新增自定義的功能。

單個資源:

import com.alibaba.csp.sentinel.entry;

import com.alibaba.csp.sentinel.sphu;

import com.alibaba.csp.sentinel.context.contextutil;

import com.alibaba.csp.sentinel.slots.block.blockexception;

public class contextdemo catch (blockexception e) finally

}//釋放context

contextutil.exit();

}}

多個資源:

public class contextdemo  catch (blockexception e) finally 

if (nodeb != null)

}//釋放context

contextutil.exit();

}}

乙個context中可以有多個resource,每個資源都必須對應乙個entry

這張圖的上半部分體現了node之間的關係:

對應原始碼的關係:

node 介面定義了乙個 node 類所需要提供的各項指標資料統計的相關功能,為外部遮蔽滑動視窗的存在。提供記錄請求被拒絕、請求被放行、請求處理異常、請求處理成功的方法,以及獲取當前時間視窗統計的請求總數、平均耗時等方法。

使用**理解node之間的關係

import com.alibaba.csp.sentinel.entry;

import com.alibaba.csp.sentinel.sph;

import com.alibaba.csp.sentinel.sphu;

import com.alibaba.csp.sentinel.context.contextutil;

import com.alibaba.csp.sentinel.slots.block.blockexception;

public class contextdemo catch (blockexception e) finally

if (nodeb != null)

}// 釋放context

contextutil.exit();

// context的名稱為entrance2

// entry就是乙個資源操作物件

entry nodec = null;

try catch (blockexception e) finally

if (nodec != null)

}// 釋放context

contextutil.exit();

}}

Tomcat 原始碼閱讀(一)總概

環境 tomcat7.0.28 堅持一下,把原始碼看完,勤奮一點,不要在懶惰了,你已經落下別人很多了 在bootstrap的init方法中,主要工作分5步,首先是初始化變數的問題,也就是設定設定系統變數的操作,呼叫system.setproperty方法。然後是初始化類載入器,設定catalinal...

midpoint原始碼閱讀十一(一些基本概念總結二)

上篇文章僅僅做了一些概念的簡單描述,本篇文章將針對midpoint當中的比較常用的概念做一些介紹。midpoint當中的概念錯綜複雜,我們從data model慢慢來展開。data model故名思意即 承載資訊的資料模型,官網 第一段中已介紹其用於midpoint中的對各元件中 midpoint的...

原始碼解析 JDK原始碼之LinkedHashMap

linkedhashmap原始碼,基於 jdk1.6.43 他繼承了hashmap,並且實現了插入和訪問的有序功能 public class linkedhashmapextends hashmapimplements map 其也有乙個entry內部類,繼承了 hashmap 的entry 內部類...