是什么?
skywalking是一个优秀的国产开源框架,2015年由个人吴晟(华为开发者)开源 ,
分布式链路追踪就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。
优势:
- skywalking采用字节码增强的技术实现代码无侵入,zipKin代码侵入性比较高
- skywalking功能比较丰富,报表统计,UI界面更加人性化
当前主流开源组件
常用链路追踪工具的有:Zipkin、SkyWalking、CAT。
Zipkin 是 Twitter 开源的调用链分析工具,目前基于 SpringCloud Sleuth 得到了广泛的使用,特点是轻量,使用部署简单。
SkyWalking 是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI 功能较强,接入端无代码侵入。目前已加入 Apache 孵化器。
CAT 是大众点评开源的基于编码和配置的调用链分析,应用监控分析,日志采集,监控报警等一系列的监控平台工具。
纯属个人观点:
- 从接入方式来看,Cat的代码侵入性最高,Zipkin只需要基于Sleuth方式引入配置,SkyWalking无代码侵入性。
- 从使用入门来看,Zipkin容易些,Cat成本高些。
- 从页面UI展示来看,健壮度:CAT > SkyWalking> Zipkin。
综上所述,Skywalking代码无侵入性,通信方式采用 gRPC ,性能较好,UI 够强也够用。
1.服务端如何搭建?
skywalking同样是通过jar包方式启动,需要下载jar包,地址:
https://skywalking.apache.org/downloads/
这里也有8.1.0版本的和mysql驱动包,需要自取
通过网盘分享的文件:服务追踪
链接: https://pan.baidu.com/s/1VEpBGonq0k08N4pu3x7oqg?pwd=w8j9 提取码: w8j9
SkyWalking版本对应不同的JDK(本人就踩大坑了)
SkyWalking 版本 | 支持的 JDK 版本 |
8.x | JDK 8, 9, 10, 11 |
9.x | JDK 8, 9, 10, 11, 16, 17 |
10.x | JDK 8, 9, 10, 11, 16, 17 |
目录分析:
- agent:客户端需要指定的目录,其中有一个jar,就是负责和客户端整合收集日志
- bin:服务端启动的脚本
- config:一些配置文件的目录
- logs:oap服务的日志目录
- oap-libs:oap所需的依赖目录
- webapp:UI服务的目录
修改端口号:
\webapp\application.yml 我修改为8888防止冲突
启动:
启动命令在/bin目录下,这里需要启动两个服务,如下:
oap服务:对应的启动脚本oapService.bat,Linux下对应的后缀是sh
UI服务:对应的启动脚本webappService.bat,Linux下对应的后缀是sh
当然还有一个startup.bat启动文件,可以直接启动上述两个服务,我们可以直接使用这个脚本,直接双击,将会弹出两个窗口则表示启动成功,如下图:
因为skywalking是非侵入式的所以就可以选择直接添加JVM选项
-javaagent:D:\1AAATools\apache-skywalking-apm-bin8.1\apache-skywalking-apm-bin\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=ruoyi-gen
-Dskywalking.collector.backend_service=localhost:11800
-javaagent:skywalking-agent.jar所在路径
-Dskywalking.agent.service_name=分组 + 微服务的服务名称(就是配置参数spring.application.name)
-Dskywalking.collector.backend_service=不用修改(日志收集地址的,固定端口11800)
配置完成后访问http://localhost:8888/
skywalking是根据请求生成这些数据的,所以需要访问项目中的路径才会有数据
skywalking指标:
2.Skywalking 进行日志配置:
为log日志增加 skywalking的 traceId(追踪ID)。便于排查
首先引入maven依赖
<!-- SkyWalking 的日志工具包 -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>9.0.0</version>
</dependency>
接着在 resources文件夹下创建 logback-spring.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false"><property name="LOG_HOME" value="D:/logs/"></property><conversionRule conversionWord="clr"converterClass="org.springframework.boot.logging.logback.ColorConverter" /><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><pattern>%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} [%X{tid}] %clr([%-10.10thread]){faint} %clr(%-5level) %clr(%-50.50logger{50}:%-3L){cyan} %clr(-){faint} %msg%n</pattern></layout></encoder></appender><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 修正日期格式 --><FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/pro.log</FileNamePattern><MaxHistory>30</MaxHistory></rollingPolicy><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread]%-5level %logger{50} - %msg%n</pattern>--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%-10.10thread]%-5level %-50.50logger{50}:%-3L - %msg%n</pattern></layout></encoder><!--日志文件最大的大小--><triggeringPolicyclass="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>10MB</MaxFileSize></triggeringPolicy></appender><!--skywalking grpc 日志收集--><appender name="grpc"class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread]%-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><!-- 日志输出级别 --><root level="INFO"><appender-ref ref="STDOUT"/><appender-ref ref="FILE"/><appender-ref ref="grpc"/></root>
</configuration>
请求接口就可以发现TID的输出
把TID放到追踪ID这里:
3.数据持久化:
skywalking默认使用内置内存h2来存储数据,这样的弊端就是重启后数据消失,虽然skywalking是实时的但是最好还是记录一下
打开\apache-skywalking-apm-bin\config\application.yml配置文件
将mysql驱动放入apache-skywalking-apm-bin\oap-libs下
h2改为mysql
修改路径,我这里是组长的数据库
如果报错加上时区
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/swtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC"}
创建数据库重启nacos,就会自动创建表