我們先進入啟動類:com.alibaba.csp.sentinel.dashboard.DashboardApplication
看到這里主要就是創建一個線程,然后調用了com.alibaba.csp.sentinel.init.InitExecutor#doInit方法,最后調用啟動線程
我們進入com.alibaba.csp.sentinel.init.InitExecutor#doInit方法中
可以看到這里主要做三件事1、使用spi加載com.alibaba.csp.sentinel.init.InitFunc的一些實現類;2、將加載后的實現類進行排序;3、調用這些實現類的初始化方法
我們可以先看看他這里加載的四個實現類分別都是做什么的
com.alibaba.csp.sentinel.metric.extension.MetricCallbackInit
我們進這個實現類里去看看里面都做了啥
進入com.alibaba.csp.sentinel.metric.extension.MetricCallbackInit
我們可以看到這里主要是注冊擴展的入口和出口回調類
com.alibaba.csp.sentinel.slots.statistic.StatisticSlotCallbackRegistry中是一個map,存放了一些資源對應的回調信息
進入com.alibaba.csp.sentinel.metric.extension.callback.MetricEntryCallback
我們可以看到這里主要就是兩個方法,一個是通過另一個是阻塞處理方案
我們再來看看出口回調中做了啥
進入com.alibaba.csp.sentinel.metric.extension.callback.MetricExitCallback
可以看到這里主要就是做一些統計信息記錄
這里不經意發現了一個com.alibaba.csp.sentinel.slotchain.SlotChainBuilder
我們都知道sentinel中的slot是一個比較核心的類,所以我們不妨點進去看看這里干啥了
我們可以看到這里就是往com.alibaba.csp.sentinel.slotchain.ProcessorSlotChain中添加了一堆slot來構建一個chain
我們繼續往下
接下來我們看看com.alibaba.csp.sentinel.transport.init.CommandCenterInitFunc里做了啥
我們可以看到這里主要做三件事1、獲取命令中心;2、調用beforeStart方法做一些准備工作;3、調用start方法,這里我們重點關注2和3
進入com.alibaba.csp.sentinel.transport.CommandCenter#beforeStart方法
可以看到這里主要就是獲取dashboard中的提供的接口然后獲取對應的處理器分別放入map中,當在dashboard中調用了對一個的接口之后都會觸發這些處理器進行處理
接下來我們看看com.alibaba.csp.sentinel.transport.command.SimpleHttpCommandCenter#start方法里又做了啥
可以看到這里主要就是創建一個socket然后取監聽8719端口,而這個端口我們都知道這是sentinel與客戶端通信的端口號
接下來我們再看看com.alibaba.csp.sentinel.transport.init.HeartbeatSenderInitFunc中又做了啥
可以看到這里主要就是做一些心跳相關的任務初始化
ok到這里我們基本知道了啟動過程主要就是初始化一些接口的處理器、資源出入口回調以及心跳等信息的初始化,接下來我們具體操作配置一下流控規則看看是不是是怎么處理的
可以看到這里主要做兩件事:1、創建一個實體並保存;2、通知客戶端
接下來我們重點關注通知客戶端的邏輯
可以看到這里主要就是獲取到選擇的客戶端的機器列表對應的規則,然后調用com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient#setFlowRuleOfMachine方法
一路追尋,我們發現最后做走到了com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient#executeCommand方法中而且我們發現這是一個執行命令的方法,而且api名稱我們也知道了
命令?之前啟動 的時候我們是不是看到他的命令相關的那個spi擴展?那里好像初始化了命令處理器吧?我們重新走一下流程看看
果然,這里給定了處理器,那我們想這是不是在客戶端需要使用這個處理器進行事件處理呢?
我們在客戶端的com.alibaba.csp.sentinel.command.handler.ModifyRulesCommandHandler中打斷點請求果然進來了
繼續跟進com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager#loadRules方法
繼續跟進com.alibaba.csp.sentinel.property.DynamicSentinelProperty#updateValue方法
這里主要就是對監聽器對新值的監聽
所以我們就知道了咱們再dashboard中定義規則,他會發送http請求通知客戶端進行更新