一、Skywalking
skywalking 是一个优秀的国产开源框架,2015 年由个人吴晟(华为开发者)开源 , 2017 年加入 Apache 孵化器。
skywalking 支持 dubbo,SpringCloud,SpringBoot 集成,代码无侵入,通信方式采用 GRPC,性能较好,实现方式是 java 探针,支持告警,支持 JVM 监控,支持全局调用统计等等,功能较完善。
二、Skywalking & Spring Cloud Sleuth+ZipKin
Skywalking 相比于 zipkin 还是有很大的优势的,如下:
Skywalking 采用字节码增强的技术实现代码无侵入,zipKin 代码侵入性比较高。
Skywalking 功能比较丰富,报表统计,UI 界面更加人性化。
三、Skywalking 架构
skywalking 和 zipkin 一样,也分为服务端和客户端,服务端负责收集日志数据并且展示,架构如下:
上述架构图中主要分为四个部分,如下:
上面的 Agent
:负责收集日志数据,并且传递给中间的 OAP 服务器中间的 OAP
:负责接收 Agent 发送的 Tracing 和 Metric 的数据信息,然后进行分析 (Analysis Core) ,存储到外部存储器 ( Storage ),最终提供查询 ( Query ) 功能。左面的 UI
:负责提供 web 控制台,查看链路,查看各种指标,性能等等。右面 Storage
:负责数据的存储,支持多种存储类型。
Agent 负责收集日志传输数据,通过 GRPC 的方式传递给 OAP 进行分析并且存储到数据库中,最终通过 UI 界面将分析的统计报表、服务依赖、拓扑关系图展示出来。
三、服务端搭建
skywalking 同样是通过 jar 包方式启动,需要下载 jar 包,地址:
https://skywalking.apache.org/downloads/
3.1、下载安装包
选择 V8.7.0 或其他版本,如下图:
重要的目录结构分析如下:
agent
:客户端需要指定的目录,其中有一个 jar,就是负责和客户端整合收集日志bin
:服务端启动的脚本config
:一些配置文件的目录logs
:oap 服务的日志目录oap-libs
:oap 所需的依赖目录webapp
:UI 服务的目录
3.2、配置修改
启动之前需要对配置文件做一些修改,修改如下:
3.2.1、/config/application.yml
这个是 oap 服务的配置文件,需要修改注册中心为 nacos,如下图:
配置 1:修改默认注册中心选择 nacos,这样就不用在启动参数中指定了。
配置 2:修改 nacos 的相关配置,由于陈某是本地的,则不用改动,根据自己情况修改。
3.2.2、webapp/webapp.yml
这个是 UI 服务的配置文件,其中有一个 server.port 配置,是 UI 服务的端口,默认 8080,可将其改成 8081,避免端口冲突。
3.3、启动服务
启动命令在 /bin 目录下,这里需要启动两个服务,如下:
oap 服务
:对应的启动脚本 oapService.bat,Linux 下对应的后缀是 sh。UI 服务
:对应的启动脚本 webappService.bat,Linux 下对应的后缀是 sh。
当然还有一个 startup.bat
启动文件,可以直接启动上述两个服务,我们可以直接使用这个脚本,直接双击,将会弹出两个窗口则表示启动成功。
此时直接访问:http://localhost:8888/
,直接进入 UI 端。
四、客户端搭建
客户端也就是单个微服务,由于 Skywalking 采用字节码增强技术,因此对于微服务无代码侵入,只要是普通的微服务即可,不需要引入什么依赖。
想要传输数据必须借助 skywalking 提供的 agent,只需要在启动参数指定即可,命令如下:
-javaagent:E:\SOFTWARE\skywalking\apache-skywalking-apm-bin\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=jeecg-cloud-gateway
-Dskywalking.collector.backend_service=localhost:11800
上述命令解析如下:
-javaagent
:指定 skywalking 中的 agent 中的 skywalking-agent.jar 的路径-Dskywalking.agent.service_name
:指定在 skywalking 中的服务名称,一般是微服务的 spring.application.name-Dskywalking.collector.backend_service
:指定 oap 服务绑定的地址,由于陈某这里是本地,并且 oap 服务默认的端口是 11800,因此只需要配置为 127.0.0.1:11800。
五、数据持久化
服务端重启之后,这些链路追踪数据将会丢失了,因为 skywalking 默认持久化的方式是存储在内存中。
当然这里也是可以通过插拔方式的替换掉存储中间件,企业中往往是使用 ES 存储,此处介绍一下 MySQL 的方式存储。
5.1、修改配置文件
修改 config/application.yml
文件中的存储方式,总共需要修改两处地方。
修改默认的存储方式为 mysql,如下:
storage:
selector: ${SW_STORAGE:h2}
修改 Mysql 相关的信息,比如用户名、密码等,如下:
mysql:
properties:
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:306/skywalking?ueUnicode-truescharacterEncoding=Unp-8 serverimezone=Asia/shanghai"}
dataSource.user: ${SW_DATA_SOURCE_USER:root}
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root@1234}
dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}
dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}
dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}
dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true}
metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE:5000}
maxSizeOfArrayColumn: ${SW_STORAGE_MAX_SIZE_OF_ARRAY_COLUMN:20}
numOfSearchableValuesPerTag: ${SW_STORAGE_NUM_OF_SEARCHABLE_VALUES_PER_TAG:2}
5.2、添加 MySQL 的 jdbc 依赖
默认的 oap 中是没有 jdbc 驱动依赖,因此需要我们手动添加一下,只需要将驱动的 jar 放在 oap-libs 文件夹中:mysql-connector-java-8.0.15.jar
已经配置完成,启动服务端,在 skywalking 这个数据库中将会自动创建表。
六、日志监控
在 skywalking 的 UI 端有一个日志的模块,用于收集客户端的日志,默认是没有数据的,那么需要如何将日志数据传输到 skywalking 中呢?
日志框架的种类很多,比较出名的有 log4j,logback,log4j2,此处以 logback 为例子介绍一下如何配置。
6.1、添加依赖
根据官方文档,需要先添加依赖,如下:
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>${project.release.version}</version>
</dependency>
6.2、添加配置文件
新建一个 logback-spring.xml 放在 resource 目录下,配置如下图:
<configuration scan="true" scanPeriod=" 5 seconds">
<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>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>1024</queueSize>
<neverBlock>true</neverBlock>
<appender-ref ref="STDOUT"/>
</appender>
<root level="INFO">
<appender-ref ref="ASYNC"/>
</root>
</configuration>
当你使用 -javaagent 激活 skywalking tracer 后,logback 将会输出 traceId(如果存在的话)。如果 tracer 未激活,输出将是 TID: N/A。
注意:
如果 agent 和 oap 服务不在同一台服务器上,需要在 /agent/config/agent.config
配置文件末尾添加如下配置:
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:10.10.10.1}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}
七、性能剖析
skywalking 在性能剖析方面真的是非常强大,提供到基于堆栈的分析结果,能够让运维人员一眼定位到问题。
新建一个 /order/list 接口,代码中休眠了 2 秒,看看如何在 skywalking 中定位这个问题。
在性能剖析模块 -> 新建任务 -> 选择服务、填写端点、监控时间,操作如下图:
选择这个任务将会出现监控到的数据,如下图:
上图中可以看到 {GET}/order/list
这个接口上耗费了2秒以上,因此选择这个接口点击分析,可以看到详细的堆栈信息,如下图:
如何定位到睡眠 2 秒钟的那一行代码,直接往下翻,如下图:
评论