【SkyWalking】分布式环境下的链路追踪技术

SkyWalking链路追踪技术



一. 认识SkyWalking

SkyWalking解决了什么问题?-----》微服务架构中,各个服务之间调用关系错综复杂,所以需要一个能捋清复杂情况下调用关系的解决方案,这就是SkyWalking,目前最强大的链路追踪技术;

要使用SkyWalking,需要给我们的项目中绑定一个agent探针,绑定后,SkyWalking就会将你项目整体的监控数据反馈给SkyWalking oapservice,SkyWalking oapservice就是SkyWalking的服务端,oapservice会将这些监控数据做处理,然后存储到数据库中:SkyWalking支持的数据库有很多种:ES,Mysql等等很多都支持;然后SkyWalking 提供了一个前端的可视化ui界面,我们程序员可以通过这个ui界面方便的查看到我们项目整体的数据,因为这个前端界面会向oapservice发送请求查询数据;

二、下载SkyWalking

1.下载SkyWalking

下载网址:http://skywalking.apache.org/downloads/
点击Distribution选择要下载的版本----》我们可以看到skywalking它每一个版本都提供了两份:
其中v8.5.0 for ElasticSearch 6 是针对于es6的,也就是说它的oapservice收集到数据后并处理后,会将其存储到es6中;
另一个版本是针对于其他数据库进行存储,比如H2,Mysql,ES7等等(我也不知道为什么要把ES6,ES7分成两部分?)

在这里插入图片描述

2. 启动方式

下载好后,解压,然后打开bin文件夹,然后双击startup.bat命令就可以启动skywalking;
双击startup.bat—》它会帮我们同时启动oapservice.bat与webappService.bat;
假如你是用的liunx系统,那么你需要点击startup.sh进行启动,window系统下用startup.bat;

在这里插入图片描述


在这里插入图片描述

3. 目录文件解释

1.webapp文件夹

这个文件夹中放的是:skywalking的ui前端界面的jar包跟yaml配置文件;
如果你要修改它的前端ui界面的配置,就要在这个文件夹下的webapp.yaml中进行修改;
通过都是需要修改的,因为这个ui前端界面的默认端口号是8080,基本不会用这个端口,容易重复且易被攻击

在这里插入图片描述


在这里插入图片描述


这是前端界面配置文件打开后的样子;

在这里插入图片描述

2.config文件夹

这个文件夹中放的就是常用的配置文件

在这里插入图片描述


这里面最重要的文件就是这个application.yml

在这里插入图片描述

2.1 application.yml文件详解

2.1.1 监控数据存储方式修改

打开这个文件,里面有个
storage:
selector: ${SW_STORAGE: h2}
这个表示oapservice读取到的监控数据的存储方式,可以看到它默认的存储方式就是采用的h2数据库,这是一种基于内存的数据库,我们不用它,因为它基于内存,只要一重启skywalking,这些监控数据就会消失;
注意:skywalking最优的监控数据存储方式是es,但是很多人可能不懂es,也可以用mysql替代;

在这里插入图片描述

3. agent文件夹

这个文件夹里有个最重要的东西:skywalking-agent.jar,这个jar包到时候需要跟我们的微服务进行绑定,绑定后oapservice才能从我们的微服务中获取监控数据;

在这里插入图片描述

3. bin文件夹

这个文件夹里放的都是一些启动脚本;

5. oap-libs

这个文件夹下放的是:oapservice服务器所用的jar包

三、启动skywalking

1.启动成功界面

双击startup.bat命令后,出现下面这个界面就表示skywalking启动成功;

在这里插入图片描述

2.oapservice的日志文件

oapservice已经自己集成好了日志功能,它在使用过程中就会输出日志;
日志记录会被输出到logs文件夹中下的两个.log文件中,一个是记录的前端ui界面的日志,一个是记录后端oapservice的日志;

在这里插入图片描述

在这里插入图片描述

3. oapservice的端口

oapservice自动暴露了两个端口,11800端口和12800端口;
11800端口是oapservice用来收集微服务监控数据的端口,
12800是oapservice用来接收前端ui界面请求的端口;

我们也可以通过config文件夹下的application.yaml来修改这些端口号;

注意:在我们自己的微服务中,要将oapservice的端口号告诉给我们的微服务,否则我们自己的微服务是不知道oapservice的端口的,就没有传递监控数据给oapservice了

4. 打开前端ui界面

你在webapp文件夹下的webapp.yml中将前端ui界面的端口号配置好后,你可以直接在你的浏览器中使用 localhost:你配置好的端口号,来访问前端ui界面;
这就是打开后的样子;

5. 将skywalking与我们自己的微服务绑定

通过上面的操作:修改前端ui界面端口号,双击startup.bat,我们已经成功的启动好了前端ui界面,也成功了启动好了oapservice服务了;
现在还差的是:将我们自己的微服务与skywalking进行绑定,以便skywalking能从我们的微服务获取监控数据;

5.1 在windows环境下绑定skywalking

这种方式是在idea中配置,首先找到Edit Configuration,点击打开;

在这里插入图片描述


我们选择gateway这个服务,(这里只是以gateway服务作为一个例子用来讲解)
然后找到VM options,在里面按照图片中的格式进行配置;
注意点1:这里是通过jvm的参数来进行的配置,可以达到对代码无侵入的效果;
注意点2:下面截图中VM options中是写了注释的,这是为了我们学习时方便理解,你真正要去配的时候,不能往里面加注释,因为VM options中是识别不了的,会报错;

配置好后–》再点击ok完成配置

在这里插入图片描述

5.2.1 查看结果

我们进入到前端ui界面,点击右上角的刷新(我们可以点击左边的"自动",当"自动"变成蓝色后,前端ui界面就会按照你指定的频率每隔几秒刷新一次界面);
但是我们刷新后,只是在上面看到一个api-service,这是我们在gateway服务的VM options中给gateway服务取的名字,我们只看到了这个名字,刷新后下面的界面也看不到任何东西;
然后我们点击上方的拓扑图,

在这里插入图片描述


拓扑图里面也只是有一个服务名称,但是没有任何数据,这是为什么呢?

在这里插入图片描述

5.2.2 skywalking与gateway之间存在的问题

这里一定要注意:skywalking在默认情况下是不会显示gateway的,就算你把gateway服务跟skywalking的skywalking-agent.jar进行了绑定,在skywalking前端界面中也是不会显示gateway的任何信息的;

解决办法:
第一步:打开skywalking安装目录下的agent文件夹

在这里插入图片描述


第二步:再打开plugins文件夹,这个文件夹中是skywalking集成的所有插件,在这里面可以找到很多jar包,包括mysql,rocketmq等等很多,但你就是找不到gateway的jar包,所以才导致出现上面的问题;
所以你只需要将gateway的jar包放入plugins文件夹里面就可以了

在这里插入图片描述


第三步:gateway的jar包到哪里去拿呢?
其实skywalking已经帮我们准备好了gateway的jar包,在我们下载skywalking的安装包时,gateway的jar包已经包含在里面了;
我们找到optional-plugins文件夹,这个文件的意思是:可选的插件;

在这里插入图片描述


点开文件夹后,会看到里面就有gateway的jar包,有两个,我们可以选择2.1.x那个,这个更新一点;

然后将它复制一份,复制到plugins文件夹中,然后重启skywalking服务;这样就可以了;

在这里插入图片描述

5.2.3 再次查看结果

1. 全局响应时间与全局心跳时间

重启后,我们再次打开skywalking的前端ui界面,就能在下面的页面中看到两个板块;
左边的折线图表示:全局的响应时间
右边的图表示:全局的心跳时间

在这里插入图片描述


我们还可以点击界面下方的时间,选择最近多少分钟进行查看;

在这里插入图片描述

2. 服务,端点,实例

然后我们还可以看到下图圈起来的部分:
最左边的Services Load 表示当前服务的硬件性能,比如cpu等等;
Slow-Services表示慢加载;
Un-Health Services表示不健康的服务;
Slow Endpoints表示慢端点,就是慢接口的意思,就是说你当前服务有哪些接口比较慢;

然后还有个部分叫"当前实例",如果你当前这个服务是做了集群的,那么你点击当前实例是可以看到好几个实例的,下图只显示了一个,因为我们作为案例的这个gateway服务没有做集群;

在这里插入图片描述

3. 拓扑图

然后我们再点击拓扑图,就会显示成这个样子;
意思就是:User用户发送请求到了api-service,也就是gateway,然后gateway又调用一台192.168.65.106:8020的机器(这台机器实际上是订单服务),为什么订单服务在拓扑图中没有显示服务名称而是显示ip地址跟端口呢?这是因为我们现在只是将gateway服务与skywalking-agent.jar绑定了,订单服务没有跟它绑定,所以只是显示ip与端口;

在这里插入图片描述

4. 追踪

我们可以点到追踪界面,追踪界面有三种查看形式,列表,树结构,表格;
图中展示的是表格的显示形式:
图中红色圈起来这里有个"/order/get",意思就是你这次发起的请求是"/order/get",
然后发起这次请求,从上往下看,你首先经过了gateway的RoutingFilter接口,也就是经过了路由过滤器,
然后再经过了gateway的sendRequest接口,将请求发送了出去;
那既然是发送请求给订单服务的"/order/get"接口,那为什么sendRequest接口下面就没有显示了呢?
这是因为我们还没有把订单服务跟skywalking-agent.jar进行绑定,skywalking就不会显示在订单服务中的调用链路,所以这里调用链路只显示到了gateway;

在这里插入图片描述

5. 性能剖析,日志,告警

这三个部分如果我们要看的话,需要做单独的处理,这里还没处理所以看不到,后面再讲;

在这里插入图片描述

5.2 在linux环境下绑定skywalking

5.3 将多个服务与skywalking进行绑定

以上案例只将gateway一个服务与skywalking进行了绑定,实际开发过程中,我们会将很多服务都跟skywalking进行绑定,也很简单,还是只需要在每个服务的VM options中配置就行了;

6. skywalking中持久化数据到数据库

6.1 h2数据库:skywalking的默认存储方式

skywalking默认是将数据存储到h2数据库中的,这是一个内存数据库;
如果将这些监控数据存储到内存中,有两个弊端:
1.一旦你的skywalking重启,内存中的这些监控数据必然会丢失,但其实影响也不是很大,因为监控数据基本都是实时的,没有必要保存下来,更没有必要查看一个月以前的监控数据;就这个方面来说,h2数据库也不是不可以;
2.但是当我们skywalking长期启动,会有越来越多的监控数据被存入内存中,最终就会导致内存爆满,到时候我们依然要重启skywalking,所以从这个方面来说,h2数据库并不合适,所以可以采用mysql,存储到mysql后,我们定时去清空就好了;

在这里插入图片描述

6.2 skywalking的持久化方式

1. 修改配置文件

我们如何修改skywalking的存储数据库?—》找到config文件夹------》找到application.yml,找到110行,将h2改成mysql,----》最后找到172行,配置mysql的ip地址,端口号,数据库名称,账户密码等信息;

在这里插入图片描述


在这里插入图片描述

2. mysql中建数据库

然后在mysql中建好配置文件中的数据库,这个库名要跟我们配置文件中配置的名称swtest一致,建好库之后我们就不用管了,因为skywalking在被启动时,自动在我们建好的这个库中创建它需要的表;

在这里插入图片描述

3.skywalking启动时的bug

在我们修改好配置文件,将h2改成mysql后,再启动skywalking就会出现bug:双击startup.bat时出现闪退,无法启动成功,此时我们找到logs文件夹下的skywalking-oap-server.log这个日志文件,我们点进去拉到下面,就能看到如下报错提示:获取不到驱动实例;

造成这个bug的原因是什么呢?是因为skywalking的plugins文件夹下没有mysql的驱动jar包,我们可以到自己的maven仓库中找到mysql驱动包,复制到plugins文件夹下即可

在这里插入图片描述


maven仓库中mysql驱动包长这个样子

在这里插入图片描述

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340