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相关推荐
- 纯干货,从源码解析多线程与高并发,再说不会,我不再踏足IT圈
没什么太多说的,多线程与高并发,面试重点,咱直接进入正题,联合底层源码,我们从源码看一下,多线程与高并发底层的知识点,这也是阿里p8+的面试官建议的学习到的级别 CAS Compare And Swa ...
- java 多线程 安全 源码,纯干货,从源码解析多线程与高并发,再说不会,我再也不踏足IT圈...
没什么太多说的,多线程与高并发,面试重点,咱直接进入正题,联合底层源码,咱们从源码看一下,多线程与高并发底层的知识点,这也是阿里p8+的面试官建议的学习到的级别java CAS Compare And ...
- 多线程(三)之ReentrantLock源码解析
2019独角兽企业重金招聘Python工程师标准>>> 今天分析ReentrantLock类的源码,在看源码之前,先学习AQS(AbstractQueuedSynchronizer) ...
- prometheus变量_TiKV 源码解析系列文章(四)Prometheus(下)
本文为 TiKV 源码解析系列的第四篇,接上篇继续为大家介绍 rust-prometheus.上篇主要介绍了基础知识以及最基本的几个指标的内部工作机制,本篇会进一步介绍更多高级功能的实现原理. 与上篇 ...
- 多线程与高并发(八):ThreadPoolExecutor源码解析, SingleThreadPool,CachedPool,FixedThreadPool,ForkJoinPoll 等
线程池 今天我们来看看JDK给我们提供的默认的线程池的实现. ThreadPoolExecutor:我们通常所说的线程池.多个线程共享同一个任务队列. SingleThreadPool CachedP ...
- 源码解析 --skywalking agent 插件加载流程
1. 插件 目前很多框架,都采用框架 + 插件的模式开发. 如DataX.FlinkX通过插件支持众多异构数据源, Skywalking通过插件实现针对很多软件如redis.mysql.dubbo等方 ...
- 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 ...
- Android多线程之IntentService源码解析
想要了解 IntentService 的工作原理需要先对 Android 系统中以 Handler.Looper.MessageQueue 组成的异步消息处理机制以及 HandlerThread 有所 ...
- 【Java学习002】Java-ArrayList源码解析
ArrayList源码解析 1.1底层数据结构 定义:实现List接口的可扩容数组实现. 数组特点: 查询快:数组开辟的是连续空间,所以可以依靠索引进行快速查询. 增删慢:每次删除元素,都需要更改数组 ...
最新文章
- AI岗位面试屡战屡败?这份“翻盘秘籍”快收好!
- flutter可视化_Flutter 对Dart情有独钟的那些事儿
- python 二维数组赋值_Python中多个变量的灵活处理
- 基于Xml 的IOC 容器-载入<property>的子元素
- 云计算:大数据时代的系统工程
- 四元数和欧拉角在线转换
- RocketMQ中的autoCreateTopicEnable是如何实现自动创建topic?
- Java ques:WARN: Establishing SSL connection without server’s identity verification is not recommend
- 为什么python打不开_Python打不开.py文件
- 泰坦尼克号幸存预测项目
- 性能测试培训:性能瓶颈分析思路
- 将整型数字转化成大写格式
- 几种修复照片画质的方法
- 【解决】Error loading the file ‘Assets/.../Scene.unity‘. File is either empty or corrupted, please......
- sougou linux 无法切换中英文,Ubuntu 16.04安装GoLand后不能切换到搜狗输入法
- delete数组报错
- Python抓取基金公开信息,从此选基金不再盲目
- 百度地图 appkey_android,百度地图AppKey的申请
- 2019最新计算机毕业设计-题目汇总大全-系列4
- 从零开始学Pyqt5之【控件介绍】(15):绘图类控件QPainter、QPen、QBrush、QPixMap
热门文章
- [html] 如何构建“弱网络环境”友好的项目?
- [html] 要减少DOM的数量有什么办法吗?
- 前端学习(2532):vuex mutation
- 前端学习(908):location常用方法
- git学习(7):创建ssh key时遇到“Bad escape character ‘ygen’.”
- mybatis学习(7):Windows下安装MySQL详细教程
- 新华计算机学校环境好吗,新华电脑校园环境好不好?(二)
- wordpress函数手册_WordPress主题开发手册
- 儿童学文字编程python_手把手教你python数字知识
- VSCode中Markdown目录显示异常