3. 字节码加强失效机制阐明
修正后的字节码是如何失效?次要是经过 Java Agent 技术完成的。咱们知道 Class 文件终究会被加载到 JVM 内存待使用,字节码有 2 个契机被修正:
一是加载的过程当中触发阻拦,触发字节码修正举措,最初将修正后的字节码数据加载 JVM 得以失效;
二是曾经实现加载的 Class 数据也是能够从 JVM 中被获得、修正后掩盖原数据达到加强成果。
下图是 Java Agnet 的民间原理图,它有两个类,Agent.class 和 Mytransform.class,Agent.class 中有一个 premain 办法,望文生义就是在 main 办法履行以前履行,他做的事很简略,就是往 JVM 外面注册一个 transform,大家留意看 transform 办法的入参,有一个字节数据,这就是原生的 class 文件,经过外部字节码加强工具的修正,能够减少一些自定义的逻辑,之后以前往值的方式交还给 JVM 被加载到内存里完成修正成果。
举个简略的例子,一个 Base 类和一个 process 办法,想要达到的成果是:在 process 履行先后各加一行 staRT 和 end 的输入。硬编码个别就是在办法外面写死,下图展现的就是字节码加强,拿到这个 base 类,而后找到它的 process 办法,而后 insert before,insert after 加两行输入就 OK 了。
04 全链路 Trace 建立 1. Trace1.0 架构
1.0 的时分,间接使用原生 Skywalking 的架构,抽出其 Trace 模块,数据寄放在 ES 里。然而跟着业务接入,发现无奈撑持全量货拉拉的业务数据,而 ES 的程度扩展的本钱较高,其存储架构不合适放 Trace 这类大数据量的数据,因此咱们进行架构 2.0 的降级。 2. Trace2.0 架构
下面解决了差别化、精密化采样,但还有个辣手的问题,就是在采样时如何包管链路的残缺性?解答这个问题前,让咱们先理解下甚么是链路残缺性?
这里举个例子,如图当初有一条近程调用,通过 ABC 和分支 AD。这里有个条件就是 ABCD 它是 4 个不同的办事,独立异步上报 Trace 数据没有严格的时间程序。在 B 调用 C 泛起异样时,咱们能轻松辨认到并将 B 和 C 的 Trace 数据段采样到,只保存 B 和 C 的这类状况,称为部份采样。然而在实际的一个排障过程当中,咱们还需求 A 和 D 这条链路数据作为辅佐信息来反对排障,所以最佳的形式是把 ABCD 都采样到,作为一个残缺的异样链路保留起来,这称为残缺采样。