1、skywalking是什么
1.1 链路追踪介绍
- 对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如:
- 如何串联整个调用链路,快速定位问题?
- 如何缕清各个微服务之间的依赖关系?
- 如何进行各个微服务接口的性能分折?
- 如何跟踪整个业务流程的调用处理顺序?
1.2 skywalkig简介
- skywalking是一个国产开源框架,2015年由吴晟开源 , 2017年加入Apache孵化器。
- skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。
- 它是一款优秀的 APM(Application Performance Management)工具,包括了分布式追踪、性能指标分析、应用和服务依赖分析等。
- 官网、下载地址、Github、中文文档
1.3 链路追踪框架对比
- Zipkin 是Twitter开源的调用链分析工具,目前基于springcloud sleuth得到了广泛的使用,特点是轻量,使用部署简单。
- Pinpoint 是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。
- SkyWalking 是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。
- Cat 是大众点评开源的基于编码和配置的调用链分析,应用监控分析,日志采集,监控报警等一系列的监控平台工具。
1.4 Skywalking主要功能特性
- 1、多种监控手段,可以通过语言探针和service mesh获得监控的数据;
- 2、支持多种语言自动探针,包括 Java,.NET Core 和 Node.JS;
- 3、轻量高效,无需大数据平台和大量的服务器资源;
- 4、模块化,UI、存储、集群管理都有多种机制可选;
- 5、支持告警;
- 6、优秀的可视化解决方案;
2、 SkyWalking 环境搭建部署
- Skywalking agent和业务系统绑定在一起,负责收集各种监控数据;
- Skywalking oapservice是负责处理监控数据的,比如接受skywalking agent的监控数据,并存储在数据库中;接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。它通常以集群的形式存在。
- Skywalking webapp,前端界面,用于展示数据。
- 数据库指的是用于存储监控数据的数据库,比如mysql、elasticsearch等。
2.1 下载 SkyWalking
- 下载
- 目录结构:
2.2 搭建 SkyWalking OAP 服务
- 启动脚本bin/startup.sh
- 日志信息存储在logs目录
- 启动成功后,会有两个服务被启动分别是:
skywalking-oap-server
和skywalking-web-ui
; - skywalking-oap-server服务启动后会暴露11800 和 12800 两个端口,分别为收集监控数据的端口11800和接受前端请求的端口12800,修改端口可以修改config/applicaiton.yml;
- skywalking-web-ui服务会占用 8080 端口, 修改端口可以修改webapp/webapp.yml;
server.port
:SkyWalking UI服务端口,默认是8080;collector.ribbon.listOfServers
:SkyWalking OAP服务地址数组,SkyWalking UI界面的数据是通过请求SkyWalking OAP服务来获得;
- 请求UI服务
2.3 SkyWalking中的三个概念
- 服务(Service) :表示对请求提供相同行为的一系列或一组工作负载,在使用Agent时,可以定义服务的名字;
- 服务实例(Service Instance) :上述的一组工作负载中的每一个工作负载称为一个实例, 一个服务实例实际就是操作系统上的一个真实进程;
- 端点(Endpoint) :对于特定服务所接收的请求路径, 如HTTP的URI路径和gRPC服务的类名 + 方法签名;
3、SkyWalking 接入微服务
3.1 Linux环境通过jar包方式接入
- 准备一个SpringBoot程序,打成可执行jar包,写一个shell脚本,在启动项目的Shell脚本中,通过 -javaagent 参数进行配置SkyWalking Agent来跟踪微服务;
#!/bin/sh # SkyWalking Agent配置 export SW_AGENT_NAME=springboot-skywalking-demo #Agent名字,一般使用`spring.application.name` export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 #配置 Collector 地址。 export SW_AGENT_SPAN_LIMIT=2000 #配置链路的最大Span数量,默认为 300。 export JAVA_AGENT=-javaagent:/usr/local/soft/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar
- 启动的日志信息:
4、Skywalking持久化跟踪数据
- 默认使用的H2数据库存储
- config/application.yml
4.1 基于mysql持久化
- 修改config目录下的application.yml,使用mysql作为持久化存储的仓库
- 修改mysql连接配置
- 编辑配置文件
storage:
#选择使用mysql 默认使用h2,不会持久化,重启skyWalking之前的数据会丢失
selector: ${SW_STORAGE:mysql}
#使用mysql作为持久化存储的仓库
mysql:
properties:
#数据库连接地址
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://1ocalhost:3306/swtest"}
#用户名
dataSource.user: ${SW_DATA_SOURCE_USER:root}
#密码
- 启动Skywalking,查看swtest数据库,可以看到生成了很多表。
5、 自定义SkyWalking链路追踪
- 如果我们希望对项目中的业务方法,实现链路追踪,方便我们排查问题,可以使用如下的代码:
- 引入依赖
<!-- SkyWalking 工具类 --> <dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-trace</artifactId> <version>8.4.0</version>
5.1 @Trace将方法加入追踪链路
- 如果一个业务方法想在ui界面的跟踪链路上显示出来,只需要在业务方法上加上@Trace注解即可;
- 测试:
5.2 加入@Tags或@Tag
- 我们还可以为追踪链路增加其他额外的信息,比如记录参数和返回信息。
- 实现方式:在方法上增加@Tag或者@Tags。
- @Tag 注解中 key = 方法名 、value = returnedObj 返回值 、 arg[0] 参数
@Trace @Tag(key = "list", value = "returnedObj") public List<User> list(){ return userMapper.list(); } @Trace @Tags({@Tag(key = "param", value = "arg[0]"), @Tag(key = "user", value = "returnedObj")}) public User getById(Integer id){ return userMapper.getById(id); }