作積極的人,越努力越幸運!算法
本文行文思路:先拋出源碼閱讀方法,而後結合Sentinel創做過程談談具體是如何運用這些技巧,最後解答幾個源碼閱讀的誤區。架構
Sentinel 系列共包含15篇文章,主要以源碼分析爲手段,圖文並茂的方式對 Sentinel 的架構設計理念、核心實現要點進行了一一剖析,並加以實戰分析與思考。框架
不少朋友都在諮詢我是如何閱讀源碼的。對此可概括爲以下幾個要點,而後結合 Sentienl 源碼分析專欄對各個要點進行拆解,對源碼閱讀方法進行一次「實戰」。運維
在準備深刻學習 Sentinel 以前,首先認真看了一遍 Sentinel 的官方文檔,從而造成了對 Sentinel 的基本認識,咱們能夠從官方文檔瞭解到 Sentinel 主要涉及的核心內容,正以下圖所示:ide
這些內容能夠簡單的當成一個學習的提綱,能夠從裏面挑選本身感興趣的進行重點學習。微服務
在看完官方文檔後,我就踏上創做 Sentinel 系列的征途。
本文不會再詳細介紹每個知識點的細節,有關各個知識點的具體講解,你們能夠點擊感興趣的連接中進行深刻研究,本文主要是點到爲止,重在介紹筆者是如何學習源碼的。源碼分析
一、Alibaba Sentinel 限流與熔斷初探
該文章主要從以下幾個點進行展開:學習
其實第三點並非特別必須,不過要得出這些結論也並不難,由於對 Sentinel 有了全局的認識後並根據各個模塊的命名很容易能得出該模塊的做用。這裏第四點很是關鍵,一般一個優秀的開源框架都會提供完備的演示 Demo,你們能夠看到 Sentinel 的演示 demo 很是豐富,在本文中我特地選擇了 Dubbo 來作示例,主要是咱們公司大量使用 dubbo 來實現公司的微服務,這樣會更加貼近實戰,更有利於尋找突破口。ui
經過跑通 Demo 的主要目的有三個:架構設計
經過該篇文章的學習咱們瞭解到能夠經過 Dubbo 的擴展機制實現對 Dubbo 的適配,在 Dubbo Filter 中咱們能看到了與 Sentinel 相關的核心 API SphU.entry,從而找到深刻學習 Sentinel 的核心入口,也就是後續文章會經過對該方法的研究,從而打開進入 Sentinel 內核世界的大門。
備註:在閱讀這篇文章的時候,我以爲 Dubbo 的適配感受很是簡單,但隨着我對這個系列的深刻學習,發現了該方法沒有那麼簡單,當時不少點都沒有理解到位,這個在後續會有重點闡述,這也是不斷學習、不斷思考帶來的好處。
三、尋找一把進入 Alibaba Sentinel 的鑰匙
本文主要是詳細跟蹤 SphU.entry 方法的執行流程,從而揭曉其實現的關鍵點,果不其然,經過跟蹤該方法的流程,找到了 Sentinel 的核心運做機制:Slot 處理鏈。
就問你們激不激動,開不開心,從這些 Slot 的名字基本就能得出其含義,後續的研究重點就是逐一解開這些 Slot 的實現原理便可。
四、Sentinel 調用上下文環境實現原理
按照上述 Slot 的鏈,開始了 NodeSelectorSlot 的研究,經過學習瞭解到該 NodeSelectorSlot 主要是構建 Sentinel 的調用鏈,即調用上下文環境管理,準確的說是構建調用鏈的入口節點。在 Sentinel 中每進入一個資源都會有對應的節點實時存儲該資源的調用信息。
五、Sentinel 實時數據採集原理
這個議題共兩篇文章,其相關連接以下:
要實現限流、熔斷等功能,首先要解決的問題是如何實時採集服務(資源)調用信息。例如將某一個接口設置的限流闊值 1W/tps,那首先如何判斷當前的 TPS 是多少?Alibaba Sentinel 採用滑動窗口來實現實時數據的統計,實現類:StatisticSlot。
六、Sentinel 限流實現原理
在弄懂了 Sentinel 的實時數據採集原理後,限流實現就很是簡單了,就是基於採集的調用信息,而後與限流規則進行比較,判斷是否須要限流,Sentinel 在觸發限流後還提供了多種處理策略,例如快速失敗、勻速排隊、預熱等機制。
但我在學習限流的時候,我將限流核心邏輯與觸發限流後的處理策略進行了分解,在學習限流的時候挑選了最簡單處理策略(勻速排隊),將比較難的預熱機制分解,再單起一篇文章進行學習,這樣的拆解有利於保證學習單篇文章的用時,並提升本身的「產量」,提升本身的成就感。
這塊主要包含以下4篇文章:
這裏還要重點闡述一下限流領域最核心的算法:漏桶算法、漏斗算法等,而且 Sentinel 的預熱機制主要是參考 Guava 的實現,故這裏花了點精力認真學習了 Guava 的 RateLimite 的實現原理。
七、Sentinel DegradeSlot 熔斷實現原理
限流部分學習完後,我就火燒眉毛的去探究熔斷的實現,其實熔斷自己並不複雜,和限流同樣,無非就是根據當前的實時調用信息與熔斷規則進行對比便可,若是知足熔斷規則就拋出異常。若是隻是熔斷自身的實現本質確實簡單,但要結合實際,其實有更多的問題須要思考,這個在後面的實戰篇又是反覆思考,從而發現 Sentinel 在熔斷的實現上其實比較粗糙。
八、Sentienl 動態數據源架構設計理念與改造實踐
通過前面的文章,Sentinel 的單機限流與熔斷已經基本學習了,這個時候就要開始思考如何使用 Sentinel 了,但 Sentinel 官方提供的後臺運維管理系統的熔斷、限流規則只能存儲在內存,顯然不能直接用於生產環境,故須要提出解決方案,本篇文章詳細介紹了筆者是如何根據官方資料進行動態數據源配置的方法調研的,完成是按照工做中架構設計方案的標準來思考的,強烈推薦。
九、Sentinel Dubbo 適配器看限流與熔斷(實戰思考篇)
支持了動態數據源,就繼續進行思考,在微服務領域是如何思考引入熔斷機制的,進行一番思考後發現官方提供的 Dubbo 適配器的粒度是服務級別的,沒法控制機器級別,例以下圖所示:
例如當前的 Sentinel Dubbo 適配器目前不支持一個服務其中一臺服務提供者變慢,發往這臺機器上的請求被熔斷,當前的實現版本會調用該服務的全部請求都會被熔斷,故官方的 Dubbo 適配器還須要更加完善,有了本身的思考纔會對知識理解更多,故經過學習源碼,必定不能「盡信書」,要有本身的思考與懷疑能力,這樣才能對開源社區作出必定的貢獻,共同進步與成長。
以上就是我學習源碼的方法,但願對你們真正有所幫助與感觸。
咱們要始終明白看源碼只是手段,目的是要思考框架的設計原理、並經過源碼瞭解實現細節並指導實踐。重在思考。固然實現細節看事後容易忘記,但只要理解了思想,在須要使用時能夠看本身寫過的文章,一會兒就能拾起來。
我是強烈不建議這樣作,這樣會迷失在細節中無可自拔。正確的姿式是尋找入口,帶上本身的思考去梳理,當遇到看不懂源碼或是沒法理解其思想時,這個時候能夠藉助 Debug,能夠經過運行時可視化的數據,幫助咱們更快的瞭解。
原創不易,若是對你有所幫助請你爲本文點個【在看】吧,這將是我寫做更多優質文章的最強動力。
歡迎加入個人知識星球,一塊兒交流源碼,探討架構,揭祕億級訂單的架構設計與實踐經驗,打造高質量的技術交流圈,爲廣大星友提供高質量問答服務,長按以下二維碼加入。