[jvm-sandbox-repeater 學習筆記][原理說明篇] 1 錄製流程
repeater系列學習筆記進入第二部分,原理說明篇。
本篇章會結合錄製回放的流程進行原始碼的導讀,並且附上我的學習解析,可能有講得不對、不夠好的地方,歡迎大家留言指正~
jvm-sandbox-repeater 學習筆記系列的文章建議按照順序閱讀~附上前序篇章:入門使用篇的傳送門。
1.1 錄製流程圖
如下圖,描述了使用者觸發請求,當sandbox感知到呼叫事件到錄製結果儲存的過程。
1.2 錄製過程步驟的原始碼解析
在整個錄製過程中,repeater進行錄製的處理流程是DefaultEventListener
類中實現。
接下來我們將以這個類作為入口去了解錄製過程的處理邏輯。
1.2.1 DefaultEventListener類
DefaultEventListener
實現了sandbox的EventListener介面,是用來處理觸發事件的類。
在repeater中,不同的外掛可以自定義自己的EventListener來進行各自特殊的事件處理。而在當前的程式碼中,除了http外掛,其他外掛都使用的是預設的DefaultEventListener
。
在DefaultEventListener
中,承接的是所有事件的處理,也就是說無論是錄製操作,還是回放操作,都是集中在這個類中實現的,只是根據不同的條件來區分是錄製流量還是回放流量,從而判斷該執行錄製還是該執行回放。
在上面的流程圖中,repeater中的流程執行,實際上是DefaultEventListener
的onEvent
的流程圖。接下來我們一個一個流程去解析錄製過程的實現。
1.2.2 事件過濾
在整個事件處理過程中,總共經歷了兩個階段,四個事件過濾。
過濾順序 | 過濾說明 | 實現方法 |
---|---|---|
1 | 針對單個listener,只處理top的事件 不同的外掛之間的listener相互隔離,所以即使是錄製http的請求,java子呼叫外掛的事件也能通過過濾。 |
DefaultEventListener.isTopEvent |
2 | 進行基礎過濾,主要根據系統熔斷、降級進行判斷。該過濾條件與repeaterConfig中的degrade欄位、exceptionThreshold欄位有關。 | DefaultEventListener.access |
3 | 執行取樣計算(只有entrance外掛負責計算取樣,子呼叫外掛不計算),該過濾條件與repeaterConfig中的sample欄位有關。 | DefaultEventListener.sample |
4 | 判斷是否是外掛呼叫處理器設定為忽略的事件。每個外掛處理不同。 | processor != null && processor.ignoreEvent((InvokeEvent)event) |
1.2.3 初始化跟蹤器
當事件通過第一個過濾時,就會進行跟蹤器初始化。
/**
* 初始化上下文;
* 只有entrance外掛負責初始化和清理上下文
* 子呼叫無需關心traceContext資訊(多執行緒情況下由ttl負責copy和restore,單執行緒由entrance負責管理)
*
* @param event 事件
*/
protected void initContext(Event event) {
if (entrance && isEntranceBegin(event)) {
Tracer.start();
}
}
跟蹤器相關的內容在com.alibaba.jvm.sandbox.repeater.plugin.core.trace包中。
其中我們提到的traceId實際上是這個跟蹤器的獨立標識。所以無論是錄製和回放都會有其獨立的traceId。
1.2.4 Before事件處理
對應的方法是DefaultEventListener.doBefore
。
判斷當前流量是否為回放流量,若為回放流量則呼叫
processor.doMock
方法執行Mock,不執行後續操作。若當前流量非回放流量,則基於當前獲取到的資訊拼接
Invocation
例項。其中會呼叫外掛呼叫處理器的assembleRequest、assembleResponse、assembleThrowable、assembleIdentity方法進行請求引數、返回結果、丟擲異常、呼叫標識的拼接。根據外掛呼叫處理器的設定,判斷是否需要進行
Invocation
中的request、response、throwable引數的序列化。將當前事件的Invocation資訊存放到錄製快取中。
1.2.5 Return事件處理/ Throw事件處理
return事件與throw事件的處理邏輯基本一致。
判斷當前流量是否為回放流量,若為回放流量則不執行後續操作。
從錄製快取中獲取對應的
Invocation
例項,如果獲取失敗則列印失敗日誌,不執行後續操作Invocation
例項獲取成功後,呼叫外掛呼叫處理器的assembleResponse或者assembleThrowable方法將reponse或者throwable資訊設定到Invocation
例項中。並設定Invocation
的結束時間。回撥呼叫監聽器
InvocationListener
的onInvocation
方法,判斷Invocation是否是一個入口呼叫,如果是則呼叫訊息投遞器的broadcastRecord將錄製記錄序列化後上傳給repeater-console。如果不是則當做子呼叫儲存到錄製快取中。
PS:訊息投遞器當前支援兩種模式,在standalone模式下,儲存到本地檔案;在非standalone模式下上傳到repeater-console。
相關文章
- [jvm-sandbox-repeater 學習筆記][原理說明篇] 2 回放流程JVM筆記
- [jvm-sandbox-repeater 學習筆記][入門使用篇] 2 配置說明JVM筆記
- 1_文字記錄說明
- 2018.03.15、View 繪製流程學習 筆記View筆記
- 流量錄製回放工具jvm-sandbox-repeater入門篇——錄製和回放JVM
- 《通訊原理基礎》學習筆記(1)筆記
- 數學證明 學習筆記筆記
- flutter 學習筆記【flutter 構造方法 TextField 屬性說明】Flutter筆記構造方法
- AQS原理學習筆記AQS筆記
- synchronized原理學習筆記synchronized筆記
- 【記錄】MySQL 學習筆記MySql筆記
- [記錄] MySQL 學習筆記MySql筆記
- Hololens開發學習筆記設計篇(1)筆記
- 安卓學習筆記---開篇(目錄結構)安卓筆記
- 學習筆記1筆記
- 學習筆記-1筆記
- 【學習筆記】HTML篇筆記HTML
- flutter學習記錄-1Flutter
- Spring學習記錄1Spring
- 前端學習記錄(CSS篇)前端CSS
- Java學習筆記記錄(二)Java筆記
- 容斥原理學習筆記筆記
- 流量錄製回放工具jvm-sandbox-repeater入門篇——服務部署JVM
- python學習筆記(1Python筆記
- Vue學習筆記1Vue筆記
- swift學習筆記《1》Swift筆記
- HTML學習筆記1HTML筆記
- ADworld學習筆記(1)筆記
- flex:1學習筆記Flex筆記
- git學習筆記 1Git筆記
- git學習筆記1Git筆記
- SLAM學習筆記(1)SLAM筆記
- golang 學習筆記1Golang筆記
- HTML學習筆記(1)HTML筆記
- hibernate學習筆記(1)筆記
- spring學習筆記(1)Spring筆記
- Leetcode學習筆記(1)LeetCode筆記
- Numpy學習筆記 1筆記