Sentinel核心源碼分析(上)

文章目錄

  • 前言
  • 一、客戶端與Spring Boot整合
  • 二、SphU.entry
    • 2.1、構建責任鏈
    • 2.2、調用責任鏈
      • 2.2.1、NodeSelectorSlot
      • 2.2.2、ClusterBuilderSlot
      • 2.2.3、LogSlot
      • 2.2.4、StatisticSlot
      • 2.2.5、AuthoritySlot
      • 2.2.6、SystemSlot
      • 2.2.7、FlowSlot
        • 2.2.7.1、selectNodeByRequesterAndStrategy
        • 2.2.7.2、canPass
      • 2.2.8、DegradeSlot
  • 總結


前言

??Sentinel作為Spring cloud alibaba中流控的組件,在微服務架構中也有廣泛的應用。其核心源碼主要體現在客戶端。客戶端在啟動時,和Nacos類似,也會將自己的信息注冊到服務端。而服務端的頁面上配置各種規則時,實際上也是將信息發送到了客戶端。
在這里插入圖片描述
??我們最常使用的@SentinelResource注解:
在這里插入圖片描述
??底層也是基于AOP + 責任鏈模式實現的。**Sentinel的難點不在于處理流程,而在于限流的算法。**本篇僅介紹Sentinel責任鏈的核心流程。


一、客戶端與Spring Boot整合

??在Spring Boot項目中,如果需要引入Sentinel,通常需要在pom文件中加入:

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>

??該組件也是利用了Spring Boot的自動配置:
在這里插入圖片描述
??其中的SentinelAutoConfiguration是核心:
在這里插入圖片描述
??在SentinelAutoConfiguration中,會注冊SentinelResourceAspect Bean:
在這里插入圖片描述
??SentinelResourceAspect實際上是一個切面,匹配了所有加入了@SentinelResource注解的方法:
在這里插入圖片描述
??invokeResourceWithSentinel是一個環繞通知。。在執行目標方法之前,首先會得到目標方法對象,以及處理注解中的一些信息,然后調用SphU.entry方法。該方法是Sentinel流程的核心。
在這里插入圖片描述
??點擊進去,會調用到entry方法:
在這里插入圖片描述
??Env在實例化之前,會觸發static中的邏輯:
在這里插入圖片描述
??在doInit方法中,又會通過SPI機制,加載InitFunc中的類:
在這里插入圖片描述
在這里插入圖片描述
??其中的HeartbeatSenderInitFunc是定期向服務端發送心跳的:
在這里插入圖片描述
在這里插入圖片描述
??CommandCenterInitFunc,是將客戶端各種接收規則的接口信息,暴露給服務端:
在這里插入圖片描述
??上面的邏輯,包括后續構建,執行責任鏈,是在切面中,并非是在應用啟動時執行的,而是在執行加入了@SentinelResource注解的方法時才會去執行!

二、SphU.entry

??SphU.entry方法內部主要做了兩件事:

  • 構建責任鏈。
  • 按照順序依次調用責任鏈。

在這里插入圖片描述

2.1、構建責任鏈

??在進入lookProcessChain方法后,首先通過雙檢鎖模式,判斷當前加入了@SentinelResource注解的方法,是否已經為其構建過責任鏈,如果沒有,才會執行newSlotChain方法。也就是說,是每一個加入了注解的方法,都有一個對應的責任鏈,并且只在應用啟動后該方法第一次被調用時初始化。
在這里插入圖片描述
??最終調用的是DefaultSlotChainBuilderbuild方法:
在這里插入圖片描述
??在該方法中,主要做了兩件事:
在這里插入圖片描述

??通過SPI機制,加載ProcessorSlots文件中的類(責任鏈中的具體組成類)。

在這里插入圖片描述
??真正地去構建責任鏈:在執行ProcessorSlotChain chain = new DefaultProcessorSlotChain();這一段代碼時,實際上是構造了:
在這里插入圖片描述
??構造出的是下圖的數據結構,end是指向first的引用:
在這里插入圖片描述
??在構造完成后,就會利用chain.addLast((AbstractLinkedProcessorSlot<?>) slot);方法,向上圖的數據結構中插入具體的責任鏈類了:
在這里插入圖片描述
??首先將end的next指針指向NodeSelectorSlot,因為end是指向指向first的引用,實際上first的next指針也指向了NodeSelectorSlot:
在這里插入圖片描述
??然后將end指向NodeSelectorSlot:
在這里插入圖片描述
??以此類推,最終構建出的責任鏈是:
在這里插入圖片描述
圖片來源:圖靈學院

2.2、調用責任鏈

??這里我們重點關注FlowSlot和DegradeSlot,它們是sentinel核心功能-限流熔斷降級的體現。

2.2.1、NodeSelectorSlot

??首先調用的是NodeSelectorSlot,它的作用是構建資源調用的統計節點,用于記錄調用鏈路信息,并且將資源關聯到相應的 DefaultNode。
在這里插入圖片描述
??fireEntry就是在滿足條件的情況下,繼續調用后續的責任鏈。

2.2.2、ClusterBuilderSlot

??ClusterBuilderSlotNodeSelectorSlot是類似的,它的作用是構建統計節點的聚合關系。但是NodeSelectorSlot 是按調用鏈統計,ClusterBuilderSlot 是按資源維度統計。
在這里插入圖片描述

2.2.3、LogSlot

??LogSlot的作用,是在后續的責任鏈調用過程中出現異常時,進行日志的記錄,體現在它的try…catch中:
在這里插入圖片描述

2.2.4、StatisticSlot

??StatisticSlot是先將請求放行到后續的責任鏈,在后續的責任鏈調用完成后,再去進行統計資源的調用情況的操作。例如記錄 QPS(每秒請求數)、RT(響應時間)、線程數、異常數等。
在這里插入圖片描述
??包括拋出了各種異常之后的記錄,這些記錄都是執行降級、限流等控制的基礎數據來源。
在這里插入圖片描述

2.2.5、AuthoritySlot

??AuthoritySlot是進行授權規則的檢查,例如黑白名單:
在這里插入圖片描述


??簡單回顧一下黑白名單的使用,首先需要在sentinel控制臺的授權規則選項卡進行配置:
在這里插入圖片描述
??這里的資源名,是http請求的路徑,而流控應用,可以是特定的ip,也可以是請求路徑:

@Component
public class IPLimiter implements RequestOriginParser {/***	獲取當前服務實例的ip*/@Overridepublic String parseOrigin(HttpServletRequest httpServletRequest) {return httpServletRequest.getRemoteAddr();}
}

??在checkBlackWhiteAuthority方法中,首先會獲取所有設置的規則,然后根據當前的資源名,獲取該資源對應的所有規則
在這里插入圖片描述
??然后進行檢查:
在這里插入圖片描述
??這里的黑白名單體現在RuleConstant這個常量類中:
在這里插入圖片描述
??判斷邏輯有點繞:

  • 如果規則中的IP或路徑,和請求中的匹配,contain會為true,反之為false。
  • 在黑名單的判定中,如果contain為true,則返回false,代表請求不通過。因為黑名單就是要對能和規則匹配上的請求進行攔截。
  • 在白名單的判斷中,如果contain為false,則返回false,代表請求不通過。因為contain為false,代表請求和規則匹配不上,也就是不在白名單中。

在這里插入圖片描述

2.2.6、SystemSlot

??SystemSlot是對系統規則進行控制,包括系統整體的 QPS,平均響應時間(RT),當前系統的并發線程數等。
在這里插入圖片描述
在這里插入圖片描述

2.2.7、FlowSlot

??FlowSlot是 Sentinel 的核心功能之一,用于流量控制(限流)規則判斷。
在這里插入圖片描述
??同樣會獲取到控制臺設置的所有規則,然后逐個進行匹配:
在這里插入圖片描述
??最終調用到的是passLocalCheck,其中也有兩個關鍵方法:
在這里插入圖片描述

2.2.7.1、selectNodeByRequesterAndStrategy

??selectNodeByRequesterAndStrategy用于在執行限流時 選擇哪個節點(Node)來做統計和判斷。不同的來源(origin)和限流策略(strategy)決定了限流數據統計的維度。首先會獲取到流控模式,也就是控制臺設置的:
在這里插入圖片描述

  • 匹配指定 origin 的限流
    • 如果是直接模式,就利用context.getOriginNode(); 調用方自己的統計節點限流。
    • 如果是其他策略,利用selectReferenceNode再次匹配:

在這里插入圖片描述

  • 如果來源是default
    • 直接限流時,使用當前資源的全局統計節點
    • 非直接限流,使用關聯資源的統計節點。
  • 如果來源是other
    • 直接限流時,使用當前資源的全局統計節點
    • 非直接限流,使用關聯資源的統計節點。
2.2.7.2、canPass

??在拿到上一步推斷出的節點后,會調用canPass方法,這里的canPass也有不同的實現:
在這里插入圖片描述
??對應控制臺中的:
在這里插入圖片描述
??這里涉及到滑動窗口,令牌桶,漏桶算法,會在后續進行說明。 Sentinel的難點不在于流程,而是算法。

2.2.8、DegradeSlot

??DegradeSlot的作用是熔斷降級控制。也是 Sentinel 的核心功能之一:在這里插入圖片描述
??在tryPass方法中,會對逐條規則進行校驗,如果此時的斷路器處于打開狀態,
在這里插入圖片描述
??并且超過了熔斷時間,會修改狀態為半開
在這里插入圖片描述

??熔斷降級中有一個重要的概念,也就是斷路器。在Sentinel 1.8 版本之后,斷路器有三種狀態,都記錄在CircuitBreaker的內部State枚舉類中:在這里插入圖片描述
??在這里簡單的說一下三種狀態的轉換:

  1. 正常情況下,斷路器處于關閉狀態,所有請求正常通過。
  2. 當請求觸發了降級條件(如異常比例過高、RT過大) 后,斷路器會進入打開狀態,在接下來的熔斷時長內(如 10 秒),所有請求都被拒絕(降級)。
  3. 當熔斷時長結束后,下一個請求到達時,斷路器進入半開狀態:
    • 如果該請求再次觸發降級條件,斷路器重新回到打開狀態。
    • 如果該請求通過且正常,斷路器會恢復為關閉狀態。

Closed → [觸發降級條件] → Open → [熔斷時長結束,下一請求] → Half-Open
↑ ↓
└────── [探測失敗] ←──── [探測成功] ←──────────────┘

總結

??本篇介紹了Sentinel 實現控制臺功能,在服務端的實現原理:通過AOP + 責任鏈模式實現。并且在調用目標方法時,為每一個請求都創建一份責任鏈,放入緩存,依次調用。
??后面幾個責任鏈的實現,在規則校驗不通過時,都會拋出異常,而真正處理的邏輯,在StatisticSlot的catch中,以及SentinelResourceAspect#invokeResourceWithSentinelentry.exit中,包括處理斷路器的狀態。

下一篇:Sentinel核心源碼分析(下)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900929.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900929.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900929.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

淺談「分詞」:原理 + 方案對比 + 最佳實踐

在文本搜索、自然語言處理、智能推薦等場景中&#xff0c;「分詞」 是一個基礎但至關重要的技術點。無論是用數據庫做模糊查詢&#xff0c;還是構建搜索引擎&#xff0c;分詞都是提高效率和準確度的核心手段。 &#x1f50d; 一、什么是分詞&#xff1f; 分詞&#xff08;Tok…

transformers:打造的先進的自然語言處理

github地址&#xff1a;https://github.com/huggingface/transformers Transformers 提供了數以千計的預訓練模型&#xff0c;支持 100 多種語言的文本分類、信息抽取、問答、摘要、翻譯、文本生成。它的宗旨是讓NLP 技術人易用。 Transformers 提供了便于快速下載和使用的API…

Spring Boot 集成 MongoDB 時自動創建的核心 Bean 的詳細說明及表格總結

以下是 Spring Boot 集成 MongoDB 時自動創建的核心 Bean 的詳細說明及表格總結&#xff1a; 核心 Bean 列表及詳細說明 1. MongoClient 類型&#xff1a;com.mongodb.client.MongoClient作用&#xff1a; MongoDB 客戶端核心接口&#xff0c;負責與 MongoDB 服務器建立連接、…

113. 在 Vue 3 中使用 OpenLayers 實現鼠標移動顯示坐標信息

? 寫在前面 在地圖類項目開發中&#xff0c;一個常見需求就是&#xff1a;實時獲取用戶鼠標在地圖上的經緯度坐標&#xff0c;并展示在地圖上。 本文將通過一個簡單的案例&#xff0c;手把手帶大家在 Vue 3 項目中集成 OpenLayers 地圖庫&#xff0c;并實現以下功能&#xf…

docker配置redis容器時搭載哨兵節點的情況下配置文件docker-compose.yml示例

1.配置數據節點&#xff08;主從節點&#xff09; version: 3.7 services:master:image: redis:5.0.9container_name: redis-masterrestart: alwayscommand: redis-server --appendonly yesports:- 6379:6379slave1:image: redis:5.0.9container_name: redis-slave1restart: a…

C++建造者模式進化論

還在為 C 對象那 長得令人發指 的構造函數參數列表抓狂嗎&#xff1f;&#x1f92f; 是不是經常在 int hp, int mp, int strength, int faith... 這樣的參數“連連看”中迷失自我&#xff0c;一不小心就把法力值傳給了血量&#xff0c;或者力量值填到了信仰欄&#xff1f;&…

在Ubuntu內網環境中為Gogs配置HTTPS訪問(通過Apache反向代理使用IP地址)

一、準備工作 確保已安裝Gogs并運行在HTTP模式(默認端口3000) 確認服務器內網IP地址(如192.168.1.100) 二、安裝Apache和必要模塊 sudo apt update sudo apt install apache2 -y sudo a2enmod ssl proxy proxy_http rewrite headers 三、創建SSL證書 1. 創建證書存儲目錄…

數據中臺、BI業務訪談(二):組織架構梳理的坑

這是數據中臺、BI業務訪談系列的第二篇文章&#xff0c;在上一篇文章中&#xff0c;我重點介紹了在給企業的業務部門、高層管理做業務訪談之前我們要做好行業、業務知識的功課。做好這些功課之后&#xff0c;就到了實際的訪談環節了。 業務訪談關鍵點 那么在具體業務訪談的時…

spark集群,Stand alone,Hadoop集群有關啟動問題

你的問題是因為 start-all.sh 是 Hadoop 的啟動腳本&#xff08;用于啟動 HDFS 和 YARN&#xff09;&#xff0c;而不是 Spark 的啟動腳本。而你已經通過 start-cluster.sh 啟動了 Hadoop 相關服務&#xff08;HDFS/YARN&#xff09;&#xff0c;再次執行 start-all.sh 會導致服…

Kotlin 通用請求接口設計:靈活處理多樣化參數

在 Kotlin 中設計一個通用的 ControlParams 類來處理不同的控制參數&#xff0c;有幾種常見的方法&#xff1a;方案1&#xff1a;使用密封類&#xff08;Sealed Class&#xff09; sealed class ControlParamsdata class LightControlParams(val brightness: Int,val color: S…

aspark 配置2

編寫Hadoop集群啟停腳本 1.建立新文件&#xff0c;編寫腳本程序 在hadoop101中操作&#xff0c;在/root/bin下新建文件&#xff1a;myhadoop&#xff0c;輸入如下內容&#xff1a; 2.分發執行權限 保存后退出&#xff0c;然后賦予腳本執行權限 [roothadoop101 ~]$ chmod x /r…

Webstorm 使用搜不到node_modules下的JS內容 TS項目按Ctrl無法跳轉到函數實現

將node_modules標記為不排除&#xff0c;此時要把內存改大&#xff0c;不然webstorm中途建立索引時&#xff0c;會因為內存不足&#xff0c;導致索引中途停止&#xff0c;造成后續搜索不出來 更改使用內存設置 內存調為4096 若出現搜不出來js內容時&#xff0c;請直接重啟下該項…

vue-element-plus-admin的安裝

文檔鏈接&#xff1a;開始 | vue-element-plus-admin 之前嘗試按照官方文檔來安裝&#xff0c;運行npm run dev命令卻不能正常打開訪問瀏覽器&#xff0c;換一個方式 首先在目錄下打開命令窗口 1、克隆項目 從 GitHub 獲取代碼 # clone 代碼 git clone https://github.com…

【windows10】基于SSH反向隧道公網ip端口實現遠程桌面

【windows10】基于SSH反向隧道公網ip端口實現遠程桌面 1.背景2.SSH反向隧道3.遠程連接電腦 1.背景 ?Windows 10遠程桌面協議的簡稱是RDP&#xff08;Remote Desktop Protocol&#xff09;?。 RDP是一種網絡協議&#xff0c;允許用戶遠程訪問和操作另一臺計算機。 遠程桌面功…

軟考系統架構設計師之大數據與人工智能筆記

一、大數據架構設計 1. 核心概念與挑戰 大數據特征&#xff1a;體量大&#xff08;Volume&#xff09;、多樣性&#xff08;Variety&#xff09;、高速性&#xff08;Velocity&#xff09;、價值密度低&#xff08;Value&#xff09;。傳統數據庫問題&#xff1a;數據過載、性…

【數據結構 · 初階】- 單鏈表

目錄 一.相關指針知識點 二.鏈表 1.為什么學了順序表還要學鏈表 2.優點 三.實現 1.鏈表的打印 —— 理解鏈表結構 (2) 物理結構圖 2.鏈表的尾插 —— 入門 錯誤寫法&#xff1a;tail ! NULL 總結&#xff1a; 正確代碼物理圖解&#xff1a; (2) 尾插整體代碼 (思考…

按鍵消抖(用狀態機實現)

基于狀態機的設計代碼 module key_filter(clk,rst,key,key_p_flag,key_r_flag,key_state);input clk,rst;input key;output reg key_p_flag;output reg key_r_flag;output reg key_state;reg [1:0]r_key; //后面用來判斷什么時候pedge&#xff0c;什么時候nedgealways…

大數據(7.2)Kafka萬億級數據洪流下的架構優化實戰:從參數調優到集群治理

目錄 一、海量數據場景下的性能之殤1.1 互聯網企業的數據增長曲線1.2 典型性能瓶頸分析 二、生產者端極致優化2.1 批量發送黃金法則2.1.1 分區選擇算法對比 2.2 序列化性能突破 三、消費者端并發藝術3.1 多線程消費模式演進3.1.1 消費組Rebalance優化 3.2 位移管理高階技巧 四、…

MyBatis深度解析與實戰指南:細節完整,從入門到精通

MyBatis深度解析與實戰指南&#xff1a;細節完整&#xff0c;從入門到精通 整理這份筆記&#xff0c;是因為學習 MyBatis 時發現很多教程要么只講基礎 CRUD&#xff0c;要么直接跳到 Spring 整合&#xff0c;對 MyBatis 核心特性講解不全面&#xff0c;基礎部分也不夠完整。實…

【科學技術部政務服務平臺-用戶注冊/登錄安全分析報告】

前言 由于網站注冊入口容易被黑客攻擊&#xff0c;存在如下安全問題&#xff1a; 暴力破解密碼&#xff0c;造成用戶信息泄露短信盜刷的安全問題&#xff0c;影響業務及導致用戶投訴帶來經濟損失&#xff0c;尤其是后付費客戶&#xff0c;風險巨大&#xff0c;造成虧損無底洞…