【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提供了大量能使我们快速便捷地处理数据的函数和方法。

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...