skywalking 源码解析——多线程变量传递 EnhancedInstance
大家好,我是烤鴨:
今天分享下 skywalking源碼,正好自己用到相關的內容了。
1. 攔截點
三個主要的攔截器、構造方法、靜態方法和示例方法,每個切面里都可以重寫這些方法,并且指定進入的攔截器。
2.? trace 相關內容
建議觀看這篇博客,寫的很詳細了。
http://www.iocoder.cn/SkyWalking/agent-collect-trace/?vip&guanfang#
我也簡單寫下吧,其實 skywalking 也是借鑒了 open-trace的思路,這是源碼 https://github.com/opentrace-community?
一條鏈路可能會有多個span(記錄當前節點的信息比如 ip、端口、請求時間、當前span的鏈路id,以及需要上下文傳遞的信息 ?全局鏈路id、header中的參數)
span之間需要關聯,會有 parent和child的概念,在多線程的場景下,可能會有 一個parent多個child的情況。
CarrierItem 用于上下文傳遞參數,結構是 key、value,還有自身節點,類似鏈表的結構
ContextManager 全局 span管理器,用于創建不同類型 、銷毀、復制 span
ContextSnapshot span的快照版,用于不同線程間使用
SW8CarrierItem skywalking 8.x 版本特有的,會隨著版本升級類名會改變,對 ?CarrierItem ?包裝,和當前作用域以及上下文綁定
TracingContext 鏈路管理器,看一下類的注釋吧。通過 ContextCarrier 和 ContextSnapshot 傳遞參數生成 TraceSegmentRef,利用的方法是 inject ?和 extract (從前一個元素中獲取參數)
* In skywalking core concept, FOLLOW_OF is an abstract concept when cross-process MQ or cross-thread async/batch tasks* happen, we used {@link TraceSegmentRef} for these scenarios. Check {@link TraceSegmentRef} which is from {@link* ContextCarrier} or {@link ContextSnapshot}.3.??說下 EnhancedInstance
這個類出現在所有切面方法的請求參數,這就是作者做的優化。跟上面一樣,構造器攔截模板、實例方法和靜態方法。
這幾個類是被放到啟動類加載器加載。 InstanceMethodsAroundInterceptor INTERCEPTOR 這個變量是在 prepareJREInstrumentation 進行的初始化。至此這幾個攔截模板會攔截所有的方法,如果是有攔截器的再按攔截的處理,否則直接放行。除了更好的異常處理、還可以傳遞參數就是 EnhancedInstance
4.??以 org.apache.skywalking.apm.plugin.hystrix.v1 插件為例說一下 EnhancedInstance 的作用
簡單介紹下 hystrix ,是一個很好的管理降級和熔斷的插件,可以自定義接口超時 走熔斷或 超時邏輯,并且可以重寫 回滾時的方法,避免了由于下游服務不可用拖垮了上游服務。
看下 HystrixCommandInstrumentation 攔截的是 com.netflix.hystrix.HystrixCommand 類的 run 和 getFallback 方法。
看下 run的攔截器。
從 EnhancedInstance 中獲取 enhanceRequireObjectCache 自定義的傳遞變量。為了避免異步線程,將當前span的快照版放到自定義傳遞變量中。
再看下 getFallback 的攔截器
continue 方法就是 從父線程獲取context ,創建子節點
5? 最后說幾句
其實不管是跨進程還是跨線程,只要攔截了進程或線程轉換的入口,將 EnhancedInstance 傳入當前快照對象,這樣子線程/進程 是可以獲取到東西的。就比如 new Thread的時候,攔截了構造器,EnhancedInstance .set(snapshot) 下游就可以獲取到了。
?
總結
以上是生活随笔為你收集整理的skywalking 源码解析——多线程变量传递 EnhancedInstance的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot mybatis-p
- 下一篇: LTE网络架构