太原網(wǎng)站建設(shè)網(wǎng)站推廣的渠道有
回顧
在前面的章節(jié)中:通過(guò)闡述sentinel簡(jiǎn)單使用、滑動(dòng)窗口、核心流程源碼分析把sentinel限流、熔斷等主要功能說(shuō)明清楚了,但我們?cè)趯?shí)際使用的過(guò)程中,不可能通過(guò)硬編碼的方式設(shè)置規(guī)則,且規(guī)則也沒(méi)法直觀的維護(hù),為此肯定是需要通過(guò)sentinel dashboard維護(hù)限流熔斷規(guī)則
交互橋梁
在前面的章節(jié)中,也提到過(guò)。如果在單獨(dú)的springboot項(xiàng)目中,想要和dashbaord做交互,需要引入如下依賴:
該依賴就是和dashbaord實(shí)現(xiàn)數(shù)據(jù)交互的橋梁,查看該模塊的代碼包情況:
其中重點(diǎn)需要關(guān)注的是:?
com.alibaba.csp.sentinel.transport.command.SimpleHttpCommandCenter 服務(wù)端命令接收
com.alibaba.csp.sentinel.transport.heartbeat.SimpleHttpHeartbeatSender 維護(hù)心跳
源碼分析
應(yīng)用端
心跳:
? ? ? ??
在?SimpleHttpHeartbeatSender中有看到發(fā)送心跳的代碼。但是:心跳是需要一直間隔發(fā)送的,此處只有發(fā)送的邏輯,未見(jiàn)間隔發(fā)送邏輯
所以肯定有個(gè)地方調(diào)用了該sendHeartbeat方法,跟蹤代碼,發(fā)現(xiàn)在:HeartbeatSenderInitFunc中有定時(shí)調(diào)度該方法:
?再詳細(xì)的分析調(diào)用接口地址和uri
?uri:
?至此,應(yīng)用client到sentinel dashboard的心跳部分已經(jīng)分析完成,既:
HeartbeartSenderInitFunc中定時(shí)調(diào)度HeartbeartSender#sendHeartbeat方法完成心跳功能,dashbaord的ip和端口是由應(yīng)用啟動(dòng)時(shí):-Dcsp.sentinel.dashboard.server參數(shù)指定的(具體的屬性邏輯可以自己跟蹤一下源碼)
應(yīng)用client端和dashbaord的命令交互
試想一下,在dashbaord上怎么獲取到對(duì)應(yīng)接入的應(yīng)用的限流、熔斷配置規(guī)則的?
在com.alibaba.csp.sentinel.transport.command.SimpleHttpCommandCenter中可以看到大量的關(guān)于網(wǎng)絡(luò)通信的代碼:
?
從代碼中可以看到,CommandCentre中啟動(dòng)了一個(gè)本地服務(wù)器,用于監(jiān)聽(tīng)連接。同樣的,跟蹤
com.alibaba.csp.sentinel.transport.command.SimpleHttpCommandCenter#start方法,發(fā)現(xiàn)在:
com.alibaba.csp.sentinel.transport.init.CommandCenterInitFunc#init方法完成初始化和調(diào)用,同時(shí)注意到:在正式調(diào)用start之前,做了一些初始化操作
?處理器和請(qǐng)求類型的映射關(guān)系:
?
?當(dāng)接收到來(lái)自dashboard的http請(qǐng)求后會(huì)組裝一個(gè)HttpEventTask,交由線程池處理:
最后根據(jù)請(qǐng)求類型,分配不同的處理完成處理過(guò)程:
以上是命令中心的核心邏輯。總結(jié)一下就是:
com.alibaba.csp.sentinel.transport.init.CommandCenterInitFunc#init調(diào)用com.alibaba.csp.sentinel.transport.command.SimpleHttpCommandCenter#beforeStart方法完成處理器注解名稱和處理器的映射列表,然后啟動(dòng)BIO(依賴不同服務(wù)類型不同)的服務(wù)器監(jiān)聽(tīng)
dashboard端
在應(yīng)用client端有2個(gè)待處理的問(wèn)題:
1 應(yīng)用client發(fā)送的心跳到dashbaord如何處理的
2 client啟動(dòng)的tpc服務(wù)器,dashboard是怎么連接并發(fā)送請(qǐng)求到應(yīng)用client端的?
心跳響應(yīng)
在上面的client段心跳中,有提到過(guò),請(qǐng)求的uri是:/registry/machine,在dashboard的源碼中查找到對(duì)應(yīng)的http接口:
接收到心跳信息之后是將數(shù)據(jù)存儲(chǔ)在appManagement中
而AppManagement是MachineDiscovery的一個(gè)裝飾器,真正干活的是:?
com.alibaba.csp.sentinel.dashboard.discovery.SimpleMachineDiscovery
?到這里心跳的邏輯已經(jīng)梳理完成:
應(yīng)用client端通過(guò)HeartbeatSenderInitFunc啟動(dòng)定時(shí)調(diào)度任務(wù)調(diào)用SimpleHttpHeartbeatSender#sendHeartbeat
方法往dashboard的/registry/machine接口請(qǐng)求,最終數(shù)據(jù)存儲(chǔ)在com.alibaba.csp.sentinel.dashboard.discovery.SimpleMachineDiscovery的一個(gè)ConcurrentMap中完成數(shù)據(jù)統(tǒng)計(jì)
dashboard請(qǐng)求client的規(guī)則數(shù)據(jù)
通過(guò)跟蹤dashboard的頁(yè)面請(qǐng)求規(guī)則接口:/v2/flow/rules&/v1/flow/rules
?最終數(shù)據(jù)請(qǐng)求委托給了:com.alibaba.csp.sentinel.dashboard.rule.FlowRuleApiProvider
?而FlowRuleApiProvider最終真正獲取數(shù)據(jù)是委托給了SentinelApiClient直連到對(duì)應(yīng)的機(jī)器上完成規(guī)則內(nèi)容獲取的
一路跟蹤最后來(lái)到發(fā)起http請(qǐng)求的入口:
? 到此,dashbaord想應(yīng)用client端發(fā)送命令的過(guò)程總結(jié)一下:
CommandCenterInitFunc在初始化時(shí),調(diào)用SimpleHttpCommandCenter#beforeStart方法完成處理器的初始化,最終組裝成一個(gè)以處理器的CommandMapping注解的name屬性為key,處理器為value的map對(duì)象。然后調(diào)用SimpleHttpCommandCenter#start()方法啟動(dòng)一個(gè)tcp服務(wù)器,監(jiān)聽(tīng)tcp請(qǐng)求。dashbaord在獲取規(guī)則內(nèi)容時(shí),通過(guò)com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient向應(yīng)用client端發(fā)起http請(qǐng)求(應(yīng)用client端的ip和端口通過(guò)心跳數(shù)據(jù)獲取),完成整個(gè)過(guò)程
填坑
在第一章關(guān)于sentinel的簡(jiǎn)單使用中,有提到一個(gè)問(wèn)題:為什么應(yīng)用client端已經(jīng)添加依賴,添加啟動(dòng)命令,并且啟動(dòng)成功之后,在dashboard的面板上無(wú)法看到對(duì)應(yīng)的應(yīng)用信息:
?而且在做源碼分析的時(shí)候也留了個(gè)坑:
?在上面分析應(yīng)用client端心跳時(shí)有提到:HeartbeatSenderInitFunc#init方法會(huì)啟動(dòng)定時(shí)調(diào)度功能完成心跳注冊(cè)。而Env的這段靜態(tài)代碼塊就是實(shí)現(xiàn)該功能的:
這里就是通過(guò)SPI機(jī)制,讀取配置中實(shí)現(xiàn)了InitFunc接口的類完成初始化任務(wù)。間接的完成HeartbeatSenderInitFunc的處理化,從而往dashboard注冊(cè)心跳。
而Env要運(yùn)行靜態(tài)代碼塊,是在SphU#entry方法觸發(fā)的。 當(dāng)然,如果你在啟動(dòng)應(yīng)用時(shí)初始化一下Env類,肯定也是可以和dashboard完成心跳注冊(cè)的:
以上:就是sentinel和dashbaord完成交互的全過(guò)程。關(guān)于sentinel的集群限流和數(shù)據(jù)持久化的問(wèn)題,在關(guān)于sentinel運(yùn)用的第五章中會(huì)完全解釋。
創(chuàng)作不易,點(diǎn)贊、收藏、關(guān)注!