Sentinel之sentinel-dubbo-adapter原始碼分析
一、簡介
sentinel-dubbo-adapter模組是sentinel與dubbo的一個適配模組,dubbo專案可以引入以下依賴:
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-dubbo-adapter</artifactId> <version>1.3.0-GA</version> </dependency>
注意:專案若需要接入dashboard只引入這個依賴是不夠的,還需要引入一個transport依賴,這裡以simple-http為例:
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> <version>1.3.0-GA</version> </dependency>
原理
通過擴充套件dubbo的Filter,在自定義Filter中實現對資源的保護。
二、原始碼分析
包結構
如圖所示

sentinel-dubbo-adaper
分析
1、DubboFallback是個回撥介面,在傳送BlockException異常時會呼叫。
2、DefaultDubboFallback是DubboFallback介面的實現類,可以發現呼叫該介面時會丟擲SentinelRpcException異常。dubbo應用若捕獲到這個異常說明資源是被保護了。
3、DubboFallbackRegistry是一個DubboFallback介面的註冊器,其中註冊了consumerFallback和providerFallback;

DubboFallbackRegistry
4、AbstractDubboFilter
AbstractDubboFilter是一個抽象類。

image.png
只提供了一個受保護的方法,用來獲取資源的名稱。
資源名稱= interfaceName:methodName(clazzName,clazzName)
5、DubboAppContextFilter
原始碼如圖:

image.png
可以發現:
- 該filter是預設啟用的且針對消費者的
- 註釋的解釋可以發現,該Filter的作用是 把當前消費者應用名稱設定到每一個呼叫上下文中
- 應用名稱設定到invocation的attachment的dubboApplication中。
那麼為什麼要需要這個呢?
- 在RPC呼叫時,dubbo消費者並沒有提供應用程式名稱給提供方
- 如果消費者不使用該介面卡但是又需要基於呼叫者進行流量控制,開發者可以手動把應用程式的attachment的應用名稱設定為“dubboApplication”
- 有了消費者的應用名稱後,可以對某一個呼叫者進行流程控制,如果這裡沒有配置的話,預設就是全部呼叫者。
6、DubboUtils
這個類就是獲取 DubboAppContextFilter 類設定消費者名稱了。
7、dubbo/com.alibaba.dubbo.rpc.Filter

image.png
這裡把自定義的Filter新增到指定的檔案中,通過dubbo的SPI擴充套件機制可以載入這些擴充套件的Filter,想了解dubbo的SPI擴充套件機制可以網上找下資料。
8、SentinelDubboConsumerFilter
直接看原始碼:

image.png
這裡需要注意Tracer.trace方法:

image.png
後續回撥用ClusterNode的trace方法,方法中會呼叫父類的increaseExceptionQps增加異常次數。

image.png
rollingCounterInsecond和rollingCounterInMinute是連個不用時間視窗,sentinel指標的統計就是根據滑動時間視窗統計的,關於指標時間視窗,後續有文章介紹。
9、SentinelDubboProviderFilter
與SentinelDubboConsumerFilter的處理邏輯類似,但是這個是提供方的Filter。
其他
1、如果我們引入這個dubbo適配module,但是不想這個sentinel保護被啟用,可以通過下面方式禁用:
<dubbo:consumer filter="-sentinel.dubbo.consumer.filter"/> <dubbo:provider filter="-sentinel.dubbo.provider.filter"/>
三、我的小結
1、dubbo專案接入sentinel只需要引入該模組jar包即可,但是若需要接入到dashboard還需要引入一個transport依賴。
2、通過介紹的sentinel-dubbo-adapter模組的原始碼,可以發現:dubbo介面資源的原理就是通過dubbo的擴充套件機制對提供端和消費端進行資源的保護
3、資源保護的核心原始碼,這裡沒有介紹,主要因為涉及是sentinel的底層核心,這裡後續需要大量篇幅介紹。