本篇文章介绍链路追踪的另外一种解决方案Skywalking,文章目录如下:

什么是Skywalking?

上一篇文章介绍了分布式链路追踪的一种方式:Spring Cloud Sleuth+ZipKin,这种方案目前也是有很多企业在用,但是作为程序员要的追逐一些新奇的技术,Skywalking作为后起之秀也是值得大家去学习的。

skywalking是一个优秀的国产开源框架2015年由个人吴晟(华为开发者)开源 , 2017年加入Apache孵化器。短短两年就被Apache收入麾下,实力可见一斑。

skywalking支持dubbo,SpringCloud,SpringBoot集成,代码无侵入,通信方式采用GRPC,性能较好,实现方式是java探针,支持告警,支持JVM监控,支持全局调用统计等等,功能较完善。

Skywalking和Spring Cloud Sleuth+ZipKin如何选型?

Skywalking相比于zipkin还是有很大的优势的,如下:

  • skywalking采用字节码增强的技术实现代码无侵入,zipKin代码侵入性比较高
  • skywalking功能比较丰富,报表统计,UI界面更加人性化

个人建议:如果是新的架构,建议优先选择skywalking。

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/

1、下载安装包

选择V8.7.0这个版本,如下图:

以上只是陈某的选择,可以按照自己的需要选择其他版本

解压之后完整目录如下图:

重要的目录结构分析如下:

  • agent:客户端需要指定的目录,其中有一个jar,就是负责和客户端整合收集日志
  • bin:服务端启动的脚本
  • config:一些配置文件的目录
  • logs:oap服务的日志目录
  • oap-libs:oap所需的依赖目录
  • webapp:UI服务的目录

2、配置修改

启动之前需要对配置文件做一些修改,修改如下:

1、/config/application.yml

这个是oap服务的配置文件,需要修改注册中心为nacos,如下图:

配置①:修改默认注册中心选择nacos,这样就不用在启动参数中指定了。

配置②:修改nacos的相关配置,由于陈某是本地的,则不用改动,根据自己情况修改。

2、webapp/webapp.yml

这个是UI服务的配置文件,其中有一个server.port配置,是UI服务的端口,默认8080,陈某将其改成8888,避免端口冲突,如下图:

3、启动服务

启动命令在/bin目录下,这里需要启动两个服务,如下:

  • oap服务:对应的启动脚本oapService.bat,Linux下对应的后缀是sh
  • UI服务:对应的启动脚本webappService.bat,Linux下对应的后缀是sh

当然还有一个startup.bat启动文件,可以直接启动上述两个服务,我们可以直接使用这个脚本,直接双击,将会弹出两个窗口则表示启动成功,如下图:

此时直接访问:http://localhost:8888/,直接进入UI端,如下图:

客户端如何搭建?

客户端也就是单个微服务,由于Skywalking采用字节码增强技术,因此对于微服务无代码侵入,只要是普通的微服务即可,不需要引入什么依赖。

还是上一篇Spring Cloud Sleuth的三个服务,如下:

  • skywalking-product1001:商品微服务
  • skywalking-order1002:订单微服务
  • skywalking-gateway1003:网关微服务

源码:GZH:码猿技术专栏,回复关键词 9528获取!

案例源码结构目录如下图:

想要传输数据必须借助skywalking提供的agent,只需要在启动参数指定即可,命令如下:

-javaagent:E:\springcloud\apache-skywalking-apm-es7-8.7.0\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=skywalking-product-service
-Dskywalking.collector.backend_service=127.0.0.1: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

上述参数可以在命令行通过java -jar xxx指定,在IDEA中操作如下图:

上述三个微服务都需要配置skywalking的启动配置,配置成功后正常启动即可。

注意:agent的jar包路径不能包含中文,不能有空格,否则运行不成功。

成功启动后,直接通过网关访问:http://localhost:1003/order/get/12,返回如下信息:

此时查看skywalking的UI端,可以看到三个服务已经监控成功了,如下图:

服务之前的依赖关系也是可以很清楚的看到,如下图:

请求链路的信息也是能够很清楚的看到,比如请求的url,执行时间、调用的服务,如下图:

感觉怎样?是不是很高端,比zipkin的功能更加丰富。

数据如何持久化?

你会发现只要服务端重启之后,这些链路追踪数据将会丢失了,因为skywalking默认持久化的方式是存储在内存中。

当然这里也是可以通过插拔方式的替换掉存储中间件,企业中往往是使用ES存储,陈某这章介绍一下MySQL的方式存储,ES方式后面单独开一篇文章介绍。

1、修改配置文件

修改config/application.yml文件中的存储方式,总共需要修改两处地方。

  • 修改默认的存储方式为mysql,如下图:

  • 修改Mysql相关的信息,比如用户名、密码等,如下图:

2、添加MySQL的jdbc依赖

默认的oap中是没有jdbc驱动依赖,因此需要我们手动添加一下,只需要将驱动的jar放在oap-libs文件夹中,如下图:

好了,已经配置完成,启动服务端,在skywalking这个数据库中将会自动创建表,如下图:

陈某这里就不再测试了,自己耍耍吧.......

日志监控如何做?

在skywalking的UI端有一个日志的模块,用于收集客户端的日志,默认是没有数据的,那么需要如何将日志数据传输到skywalking中呢?

日志框架的种类很多,比较出名的有log4j,logback,log4j2,陈某就以logback为例子介绍一下如何配置,官方文档如下:

1、添加依赖

根据官方文档,需要先添加依赖,如下:

<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>${project.release.version}</version>
</dependency>

2、添加配置文件

新建一个logback-spring.xml放在resource目录下,配置如下图:

以上配置全部都是拷贝官方文档的,对于日志配置有不理解的地方,可以看陈某之前的文章:Spring Boot第三弹,一文带你搞懂日志如何配置?

配置完成之后,启动服务,访问:http://localhost:1003/order/get/12。

控制台打印的日志如下图:

可以看到已经打印出了traceId。

skywalking中的日志模块输出的日志如下图:

日志已经传输到了skywalking中..............

注意:如果agentoap服务不在同一台服务器上,需要在/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中定位这个问题。

在性能剖析模块->新建任务->选择服务、填写端点、监控时间,操作如下图:

上图中选择了最大采样数为5,则直接访问5次:http://localhost:1003/order/list,然后选择这个任务将会出现监控到的数据,如下图:

上图中可以看到 {GET}/order/list这个接口上耗费了2秒以上,因此选择这个接口点击分析,可以看到详细的堆栈信息,如下图:

如何定位到睡眠2秒钟的那一行代码呢?直接往下翻,如下图:

是不是很清楚了,在OrderController这个接口线程睡眠了两秒........

监控告警如何做?

对于服务的异常信息,比如接口有较长延迟,skywalking也做出了告警功能,如下图:

skywalking中有一些默认的告警规则,如下:

  • 最近3分钟内服务的平均响应时间超过1秒
  • 最近2分钟服务成功率低于80%
  • 最近3分钟90%服务响应时间超过1秒
  • 最近2分钟内服务实例的平均响应时间超过1秒

当然除了以上四种,随着Skywalking不断迭代也会新增其他规则,这些规则的配置在config/alarm-settings.yml配置文件中,如下图:

每个规则都由相同的属性组成,这些属性的含义如下图:

如果想要调整默认的规则,比如监控返回的信息,监控的参数等等,只需要改动上述配置文件中的参数即可。

当然除了以上默认的几种规则,skywalking还适配了一些钩子(webhooks)。其实就是相当于一个回调,一旦触发了上述规则告警,skywalking则会调用配置的webhook,这样开发者就可以定制一些处理方法,比如发送邮件微信钉钉通知运维人员处理。

当然这个钩子也是有些规则的,如下:

  • POST请求
  • application/json 接收数据
  • 接收的参数必须是AlarmMessage中指定的参数。

注意:AlarmMessage这个类随着skywalking版本的迭代可能出现不同,一定要到对应版本源码中去找到这个类,拷贝其中的属性。这个类在源码的路径:org.apache.skywalking.oap.server.core.alarm,如下图:

新建一个告警模块:skywalking-alarm1004,其中利用webhook定义一个接口,如下:

接口定制完成后,只需要在config/alarm-settings.yml配置文件中添加这个钩子,如下图:

好了,这就已经配置完成了,测试也很简单,还是调用上面案例中的睡眠两秒的接口:http://localhost:1003/order/list,多调用几次,则会触发告警,控制台打印日志如下:

总结

本篇文章介绍了链路追踪解决方案Skywalking,主要讲解了服务端搭建、客户端搭建、数据持久化、日志监控、性能剖析这几个知识点,每个知识点都非常重要。

分布式链路追踪自从用了SkyWalking,睡得真香!的更多相关文章

  1. NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享

    对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk或splunk进行定位及分析问题,更有甚者直接远程服务器,直接操作查看日志,那么,随着业务越来越复杂,企业应用也进入了分布式服务化的 ...

  2. SkyWalking+SkyApm-dotnet分布式链路追踪系统

    SkyWalking+SkyApm-dotnet分布式链路追踪系统 对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk或splunk进行定位及分析问题,更有甚者直接远程服务器,直接操 ...

  3. 使用Skywalking分布式链路追踪系统

    使用Skywalking分布式链路追踪系统 https://www.cnblogs.com/sunyuliang/p/11424848.html 当我们用很多服务时,各个服务间的调用关系是怎么样的?各 ...

  4. .NET Core集成SkyWalking+SkyAPM-dotne实现分布式链路追踪

    .NET Core集成SkyWalking+SkyAPM-dotnet实现分布式链路追踪 SkyWalking是一款APM(应用性能管理),其他的还有Cat.Zipkin.Pinpoint等. 随着微 ...

  5. 分布式链路追踪体验-skywalking入门使用

    背景 旁友,你的线上服务是不是偶尔来个超时,或者突然抖动一下,造成用户一堆反馈投诉.然后你费了九牛二虎之力,查了一圈圈代码和日志才总算定位到问题原因了.或者公司内部有链路追踪系统,虽然可以很轻松地通过 ...

  6. 个推基于 Zipkin 的分布式链路追踪实践

    作者:个推应用平台基础架构高级研发工程师 阿飞   01业务背景   随着微服务架构的流行,系统变得越来越复杂,单体的系统被拆成很多个模块,各个模块通过轻量级的通信协议进行通讯,相互协作,共同实现系统 ...

  7. 分布式链路追踪之Spring Cloud Sleuth+Zipkin最全教程!

    大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第九篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...

  8. Go微服务框架go-kratos实战05:分布式链路追踪 OpenTelemetry 使用

    一.分布式链路追踪发展简介 1.1 分布式链路追踪介绍 关于分布式链路追踪的介绍,可以查看我前面的文章 微服务架构学习与思考(09):分布式链路追踪系统-dapper论文学习(https://www. ...

  9. 一文详解|Go 分布式链路追踪实现原理

    在分布式.微服务架构下,应用一个请求往往贯穿多个分布式服务,这给应用的故障排查.性能优化带来新的挑战.分布式链路追踪作为解决分布式应用可观测问题的重要技术,愈发成为分布式应用不可缺少的基础设施.本文将 ...

随机推荐

  1. App内容分享

    1.发送文本内容 发送简单的数据到其他应用,比如社交分分享的内容,意图允许用户快速而方便的共享信息. //分享简单的文本内容 public void btnShareText(View view) { ...

  2. Spring Boot中使用模板引擎Thymeleaf

    一.Thymeleaf简介 Thymeleaf[taɪm lif],百里香叶,是一个流行的模板引擎,该模板引擎采用Java语言开发.Java中常见的模板引擎有Velocity.Freemaker.Th ...

  3. 【Java 8】Stream中flatMap方法

    在java 8 Stream中,flatMap方法是一个维度升降的方法 举例说明 给 定 单 词 列 表["Hello","World"] ,要返回列表 [&q ...

  4. 替换错误Table.ReplaceErrorValues(Power Query 之 M 语言)

    数据源: 任意数据源,数据中有错误值 目标: 将错误值替换为0 操作过程: [转换]>[替换值]>[替换错误] M公式: = Table.ReplaceErrorValues( 表, {{ ...

  5. CF336A Vasily the Bear and Triangle 题解

    Content 一个矩形的顶点为 \((0,0)\),其对顶点为 \((x,y)\),现过 \((x,y)\) 作直线,分别交 \(x\) 轴和 \(y\) 轴于 \(A,B\) 两点,使得 \(\t ...

  6. CF1494B Berland Crossword 题解

    Content 有一种叫做 Berland crossword 的拼图游戏.这个拼图由 \(n\) 行 \(n\) 列组成,你可以将里面的一些格子涂成黑色.现在给出 \(T\) 个这样的拼图,每个拼图 ...

  7. Go语言核心36讲(Go语言实战与应用二十七)--学习笔记

    49 | 程序性能分析基础(下) 在上一篇文章中,我们围绕着"怎样让程序对 CPU 概要信息进行采样"这一问题进行了探讨,今天,我们再来一起看看它的拓展问题. 知识扩展 问题 1: ...

  8. Python的动态语言特性; __slots__属性

    python是动态语言 1. 动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被 ...

  9. Tornado WEB服务器框架 Epoll

    引言: 回想Django的部署方式 以Django为代表的python web应用部署时采用wsgi协议与服务器对接(被服务器托管),而这类服务器通常都是基于多线程的,也就是说每一个网络请求服务器都会 ...

  10. C++ 11新特性:std::future & std::shared_future) (转载)

    上一讲<C++11 并发指南四(<future> 详解二 std::packaged_task 介绍)>主要介绍了 <future> 头文件中的 std::pack ...