1,为什么要使用分布式链路追踪工具
随着分布式系统和微服务架构的出现,且伴随着用户量的增加,项目的体量变得十分庞大,一次用户请求会经过多个系统,不同服务之间调用关系十分复杂,一旦一个系统出现错误都可能会影响整个请求的处理结果。而因为项目十分庞大,调用链路十分复杂,无法快速定位失败的位置和原因。
除此之外,复杂的分布式系统也面临如下问题:
- 性能分析:一个服务依赖很多,被依赖的服务也依赖其他服务。如果某个接口耗时突然变长,那未必是直接调用的下游服务慢了,也可能是下游的下游慢了造成的,如何快速定位耗时变长的根本原因
- 链路梳理:需求迭代很快,系统之间调用关系变化频繁,靠人工难以梳理系统链路拓扑图【系统之间的调用关系】
为了解决这些问题。Google推出了分布式链路跟踪系统Dapper,之后各个互联网公司都参照Dapper的思想推出了自己的分布式链路跟踪系统,而这些系统就是分布式系统下的APM系统
2,什么是APM系统
APM【application performance management】即应用性能管理系统,是对企业系统即时监控以实现对应程序性能管理和故障管理的系统化解决方案。应用性能管理,主要指对企业的关键业务应用进行检测,优化,提高企业应用的可靠性和质量,保证用户得到良好的服务,降低IT总拥有成本
APM系统是可以帮助理解系统行为,用于分析性能问题的工具,以便发生故障的时候,能够快速定位问题和解决问题
3,什么是OpenTracing
分布式链路跟踪最先由Goole在Dappper论文中提出,而Open Tracing通过提供平台无关,厂商无关的API,使得开发人员能够方便的添加(或更换)追踪系统的实现。
4,分布式链路追踪工具的主要工具对比
- zipkin:Twitter公司开源的一个分布式追踪工具,被Spring Cloud Sleuth集成,使用广泛而稳定。
- Sky walking:中国人吴晟【华为】开源的一款分布式追踪,分析,告警的工具,现在是Apache旗下的开源项目。
- cat:大众点评开源的一款分布式链路追踪工具。
工具 | 实现方式 | 接入方式 | 数据收集 | UI | 数据存储方案 |
---|---|---|---|---|---|
zipkin | 拦截请求 | sleuth,引入依赖和配置 | 链路,耗时 | 一般 | 内存,mysql,es,Cassandra |
Sky walking | Java探针,字节码增强 | Javaagent | 链路,耗时,cpu,mem,JVM | 丰富 | es,mysql,h2,TiDB |
cat | 代码埋点 | 代码入侵 | 链路,耗时,cpu,mem,JVM | 丰富 | mysql,hdfs |
总结
zipkin
- 优点:轻量级,Spring cloud集成,使用人数多,成熟
- 缺点:功能简单,只有链路监控
sky walking
- 优点,采集数据丰富,UI友好,扩展性高,使用者多,支持中间件以及框架多,社区活跃,
- 缺点成熟度不够高
cat
- 优点:采集数据丰富,UI友好,粒度最细
- 缺点代码入侵,需要改动业务,git不够活跃,更新缓慢,存储支持不够广泛。
详细可查看 APM工具对比
5,Sky walking概述
根据官方解释,Sky walking是一个可观测分析平台【Observability Analysis Platform 简称OAP】和应用性能管理系统【Application Performance Management】简称APM。提供分布式链路追踪,服务网格遥测分析,度量聚合和可视化一体化解决方案。
主要特点
- 多语言探针,Java,.net core和node.js。
- 多监控手段,语言探针和Service mesh。
- 轻量高效,不需要额外搭建大数据平台。
- 模块化架构,UI,存储,集群管理多种机制可选。
- 支持告警。
- 优秀的可视化效果
6,Sky walking架构图
架构整体包含一下三个部分:
- 探针【agent】:负责进行数据收集,包含Tracing【链路】和Metrics【度量】的数据,agent会被安装到服务所在的服务器上,一遍方便数据获取。
- 可观测分析平台OAP:接收探针发送的数据,并在内存中使用分析引擎【Analysis Core】进行数据的整合运算,然后将数据存储到对应的存储介质上,比如ES,MySQL数据库,H2数据库等。同时OAP还使用查询引擎提供HTTP查询接口。
- Sky walking提供单独的UI进行数据查看,此时UI会调用OAP提供的接口,获取对应的数据然后进行展示。
SkyWalking主要概念
- 服务【Service】
- 端点【Endpoint】
- 实例【Instance】
如下图
上图中,我们编写了用户服务,这是一个web项目,在生产中部署了两个节点:192.168.1.100和
192.168.1.101。
- 用户服务就是Sky walking的服务【Service】,用户服务其实就是一个独立的应用【Application】,在6.0之后的Sky walking将应用改名为服务【service】
- 用户服务对外提供的HTTP接口比如【/usr/queryAll】就是一个端点,端点就是对外提供的接口
- 192.168.1.100和192.168.1.101这两个相同服务部署的节点就是实例,实例指同一个服务可以部署多个。
7,环境搭建
7.1打开官网,点击下载
7.2下载对应的Sky walking版本
7.3 解压
bash
tar -zxvf apache-skywalking-apm-9.0.0.tar.gz -C ./
7.4启动
解压后进入Sky walking的bin目录下
启动
bash
./start.sh
# windowns系统使用./start.bat
使用jps命令查看进程
部署成功
7.5下载探针
将探针解压
7.6 快速搭建一个微服务项目
7.7 在本地IDEA项目中配置探针
项目结构如下
skywalking-agent就是解压后的探针
配置探针
添加
bash
-javaagent:./skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=admin
命令解析
./skywalking-agent/skywalking-agent.jar 是探针的位置,如下图
Dskywalking.agent.service_name是在Sky walking服务中的名字
修改skywalking trace数据的后端地址
重新启动
启动成功
7.8 Sky walking UI界面查看
8 编写一个测试接口
java
@RestController
public class AdminController {
@GetMapping("/getUserById")
public String getUserById() {
return "user:123";
}
}
访问 http://localhost:8086/getUserById
查看拓扑图
链路追踪图
至此Sky walking环境搭建完成