一、分布式调用链
随着业务的高速发展,服务之间的调用关系愈加复杂
线上每一个请求会经过多个业务系统,并产生对各种缓存或者DB 的访问,业务流会经过很多个微服务的处理和传递。
问题:
• —次请求的流量从哪个服务而来?最终落到了哪个服务中去?
• 为什么这个请求这么慢?到底哪个环节出了问题?
• 这个操作需要依赖哪些东西?是数据库还是消息队列?
• Redis挂了,哪些业务受影响?
所以如何理清他们并跟踪它们之间的调用关系就显得比较关键
二、什么是调用链
这个时候我们希望有—套这样的系统:
• 故障定位:调用链路跟踪,一次请求的逻辑轨迹可以完整清晰的展示出来。
• 性能分析:调用链的各个环节分别添加调用耗时,可以分析出系统的性能瓶颈。
• 数据分析:可以得到请求的行为路径,汇总分析应用在很多业务场景
同时我们还希望它具备:
• 低消耗性
• 低侵入性
• 时效性
• 决策支持
• 数据可视化
三、调用链选型
zipkin:是Twitter 开源的调用链分析工具,目前基于 springcloud sleuth 得到了广泛的使用,使用部署简单。
Pinpoint:是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。
SkyWalking:是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前已加入Apache化器。
CAT:是大众点评开源的基于编码和配置的调用链分析,应用监控分析,日志采集,监控报警等一系列的监
调用链-基本原理和接入方式
调用链选型
数据存储支持对比
社区活跃度
性能分析
模拟了三种并发用户:500,750,1000。使用jmeter测试,每个线程发送30个请求,设置思考时间为10ms,使用的采样率为1,即100%组合起来,一共有12种。下面看下汇总表:
四、skywalking支持的rpc框架
Dubbo
Dubbox
Apache Dubbo
Motan
gRPC
Apache ServiceComb Java Chassis
SOFARPC
五、skywalking 总体架构
Metric的特点是,它是可累加的:他们具有原子性,每个都是一个逻辑计量单元,或者一个时间
段内的柱状图。 例如:队列的当前深度可以被定义为一个计量单元,在写入或读取时被更新统
计; 输入HTTP请求的数量可以被定义为一个计数器,用于简单累加; 请求的执行时间可以被定义为一个柱状图,在指定时间片上更新和统计汇总。
Tracing的最大特点就是,它在单次请求的范围内,处理信息。 任何的数据、元数据信息都被绑定到系统中的单个事务上。 例如:一次调用远程服务的RPC执行过程;一次实际的SQL查询语句;一次HTTP请求的业务性ID。
总结,Metric主要用来进行数据的统计,比如HTTP请求数的计算。Tracing主要包含了某一次请求的链路数据。
1.探针(agent)负责进行数据的收集,包含了Tracing和Metrics的数据,agent会被安装到服务所在的服务器上,以方便数据的获取。
2. 可观测性分析平台OAP(Observability Analysis Platform),接收探针发送的数据,并在内存中使用分析引擎(Analysis Core)进行数据的整合运算,然后将数据存储到对应的存储介质上,比如Elasticsearch、MySQL数据库、H2数据库等。同时OAP还使用查询引擎(Query Core)提供HTTP查询接口。
3. Skywalking提供单独的UI进行数据的查看,此时UI会调用OAP提供的接口,获取对应的数据然后进行展示
六、告警功能
Skywalking每隔一段时间根据收集到的链路追踪的数据和配置的告警规则(如服务响应时间、服务响应
时间百分比)等,判断如果达到阈值则发送相应的告警信息。发送告警信息是通过调用webhook接口完
成,具体的webhook接口可以使用者自行定义,从而开发者可以在指定的webhook接口中编写各种告
警方式,比如邮件、短信等。告警的信息也可以在RocketBot中查看到。
skywalking默认的告警规则
1. 最近3分钟内服务的平均响应时间超过1秒
2. 最近2分钟服务成功率低于80%
3. 最近3分钟90%服务响应时间超过1秒
4. 最近2分钟内服务实例的平均响应时间超过1秒
七、java agent
java agent本质上可以理解为一个插件,该插件就是一个精心提供的jar包,这个jar包通过JVMTI(JVM Tool Interface)完成加载,最终借助JPLISAgent(Java Programming Language Instrumentation Services Agent)完成对目标代码的修改。
java agent技术的主要功能如下:
1、可以在加载java文件之前做拦截把字节码做修改
2、可以在运行期将已经加载的类的字节码做变更
3、还有其他的一些小众的功能
4、获取所有已经被加载过的类
5、获取所有已经被初始化过了的类
6、获取某个对象的大小
7、将某个jar加入到bootstrapclasspath里作为高优先级被bootstrapClassloader加载
8、将某个jar加入到classpath里供AppClassloard去加载
9、设置某些native方法的前缀,主要在查找native方法的时候做规则匹配
通过java agent技术进行类的字节码修改最主要使用的就是Java Instrumentation API。
java agent 启动时修改
启动时修改主要是在jvm启动时,执行native函数的Agent_OnLoad方法,在方法执行时,执行如下步骤:
1、创建InstrumentationImpl对象
2、监听ClassFileLoadHook事件
3、调用InstrumentationImpl的loadClassAndCallPremain方法,在这个方法里会去调用javaagent里MANIFEST.MF里指定的Premain-Class类的premain方法
java agent 运行时修改
运行时修改主要是通过jvm的attach机制来请求目标jvm加载对应的agent,执行native函数的Agent_OnAttach方法,在方法执行时,执行如下步骤:
1、创建InstrumentationImpl对象
2、监听ClassFileLoadHook事件
3、调用InstrumentationImpl的loadClassAndCallAgentmain方法,在这个方法里会去调用javaagent里MANIFEST.MF里指定的Agentmain-Class类的agentmain方法
如何使用java agent?
使用 java agent 需要几个步骤:
1. 定义一个 MANIFEST.MF 文件,必须包含 Premain-Class 选项,通常也会加入Can-Redefine-Classes 和 Can-Retransform-Classes 选项。
2. 创建一个Premain-Class 指定的类,类中包含 premain 方法,方法逻辑由用户自己确定。
3. 将 premain 的类和 MANIFEST.MF 文件打成 jar 包。
4. 使用参数 -javaagent: jar包路径 启动要代理的方法。