大家好,我是烤鸭:

今天分享下 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相关推荐

  1. 纯干货,从源码解析多线程与高并发,再说不会,我不再踏足IT圈

    没什么太多说的,多线程与高并发,面试重点,咱直接进入正题,联合底层源码,我们从源码看一下,多线程与高并发底层的知识点,这也是阿里p8+的面试官建议的学习到的级别 CAS Compare And Swa ...

  2. java 多线程 安全 源码,纯干货,从源码解析多线程与高并发,再说不会,我再也不踏足IT圈...

    没什么太多说的,多线程与高并发,面试重点,咱直接进入正题,联合底层源码,咱们从源码看一下,多线程与高并发底层的知识点,这也是阿里p8+的面试官建议的学习到的级别java CAS Compare And ...

  3. 多线程(三)之ReentrantLock源码解析

    2019独角兽企业重金招聘Python工程师标准>>> 今天分析ReentrantLock类的源码,在看源码之前,先学习AQS(AbstractQueuedSynchronizer) ...

  4. prometheus变量_TiKV 源码解析系列文章(四)Prometheus(下)

    本文为 TiKV 源码解析系列的第四篇,接上篇继续为大家介绍 rust-prometheus.上篇主要介绍了基础知识以及最基本的几个指标的内部工作机制,本篇会进一步介绍更多高级功能的实现原理. 与上篇 ...

  5. 多线程与高并发(八):ThreadPoolExecutor源码解析, SingleThreadPool,CachedPool,FixedThreadPool,ForkJoinPoll 等

    线程池 今天我们来看看JDK给我们提供的默认的线程池的实现. ThreadPoolExecutor:我们通常所说的线程池.多个线程共享同一个任务队列. SingleThreadPool CachedP ...

  6. 源码解析 --skywalking agent 插件加载流程

    1. 插件 目前很多框架,都采用框架 + 插件的模式开发. 如DataX.FlinkX通过插件支持众多异构数据源, Skywalking通过插件实现针对很多软件如redis.mysql.dubbo等方 ...

  7. The Wide and Deep Learning Model(译文+Tensorlfow源码解析) 原创 2017年11月03日 22:14:47 标签: 深度学习 / 谷歌 / tensorf

    The Wide and Deep Learning Model(译文+Tensorlfow源码解析) 原创 2017年11月03日 22:14:47 标签: 深度学习 / 谷歌 / tensorfl ...

  8. Android多线程之IntentService源码解析

    想要了解 IntentService 的工作原理需要先对 Android 系统中以 Handler.Looper.MessageQueue 组成的异步消息处理机制以及 HandlerThread 有所 ...

  9. 【Java学习002】Java-ArrayList源码解析

    ArrayList源码解析 1.1底层数据结构 定义:实现List接口的可扩容数组实现. 数组特点: 查询快:数组开辟的是连续空间,所以可以依靠索引进行快速查询. 增删慢:每次删除元素,都需要更改数组 ...

最新文章

  1. AI岗位面试屡战屡败?这份“翻盘秘籍”快收好!
  2. flutter可视化_Flutter 对Dart情有独钟的那些事儿
  3. python 二维数组赋值_Python中多个变量的灵活处理
  4. 基于Xml 的IOC 容器-载入<property>的子元素
  5. 云计算:大数据时代的系统工程
  6. 四元数和欧拉角在线转换
  7. RocketMQ中的autoCreateTopicEnable是如何实现自动创建topic?
  8. Java ques:WARN: Establishing SSL connection without server’s identity verification is not recommend
  9. 为什么python打不开_Python打不开.py文件
  10. 泰坦尼克号幸存预测项目
  11. 性能测试培训:性能瓶颈分析思路
  12. 将整型数字转化成大写格式
  13. 几种修复照片画质的方法
  14. 【解决】Error loading the file ‘Assets/.../Scene.unity‘. File is either empty or corrupted, please......
  15. sougou linux 无法切换中英文,Ubuntu 16.04安装GoLand后不能切换到搜狗输入法
  16. delete数组报错
  17. Python抓取基金公开信息,从此选基金不再盲目
  18. 百度地图 appkey_android,百度地图AppKey的申请
  19. 2019最新计算机毕业设计-题目汇总大全-系列4
  20. 从零开始学Pyqt5之【控件介绍】(15):绘图类控件QPainter、QPen、QBrush、QPixMap

热门文章

  1. [html] 如何构建“弱网络环境”友好的项目?
  2. [html] 要减少DOM的数量有什么办法吗?
  3. 前端学习(2532):vuex mutation
  4. 前端学习(908):location常用方法
  5. git学习(7):创建ssh key时遇到“Bad escape character ‘ygen’.”
  6. mybatis学习(7):Windows下安装MySQL详细教程
  7. 新华计算机学校环境好吗,新华电脑校园环境好不好?(二)
  8. wordpress函数手册_WordPress主题开发手册
  9. 儿童学文字编程python_手把手教你python数字知识
  10. VSCode中Markdown目录显示异常