zl程序教程

您现在的位置是:首页 >  其他

当前栏目

从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十四) 集成skywalking 全链路追踪 完整配置,使用案例及全链路追踪底层原理

2023-04-18 16:20:31 时间

在这里插入图片描述

什么是链路追踪?

即调用链监控,特点是通过记录多个在请求间跨服务完成的逻辑请求信息
帮助开发人员优化性能和进行问题追踪。链路追踪可以捕获每个请求遇到的异常和错误
以及即时信息和有价值的数据

为什么要集成链路追踪?

随着微服务应用数量的极速增加,服务与服务链路之间的调用关系也变得错综复杂。
此时,我们也会碰到各种难题。 系统出现问题后,由于服务链路过长或过于复杂,无法快速准确定位问题。客户端(如浏览器)或者移动端应用报出异常或者错误,也无法确定是哪个服务抛出的异常。
某个业务请求非常慢,且总是超时,无法确定系统哪个环节存在性能的问题。
如何快速发现问题?可以通过调用链结合业务日志快速定位错误信息。
如何判断故障影响范围?各个阶段链路耗时、服务依赖关系可以通过可视化界面展现出来,从而直观地审视故障的影响范围。
如何梳理服务依赖以及依赖的合理性?如何分析链路性能问题以及实时容量规划?
通过分析链路耗时、服务间的依赖关系,就可以得到用户的行为路径,汇总分析出具体出问题的场景。

场景例子(下单场景)

下单是我们常接触的场景,假设划分成了订单服务,商品服务,库存服务,积分服务,而且是集群部署的 首先订单服务到商品服务,商品服务到库存服务,最后再积分什么的服务
加入在某并发量的时候阻塞然后超时了,那么我们该如何尽快定位到执行慢是哪个服务造成的呢
这时候就需要上面提到的链路追踪了,可以通过可视化或者通过日志traceId查询整个链路涉及到的所有服务接口和所有接口耗时

目前主流链路追踪工具都有哪些?

Cat
Zipkin
Pinpoint
SkyWalking

skywalking 有什么优势?

Skywalking相比较其他的分布式链路监控工具,具有以下特点: 社区相当活跃。Skywalking已经进入apache孵化,目前的start数已经超过11K,最新版本6.5.0已
经发布。开发者是国人,可以直接和项目发起人交流进行问题的解决。 Skywalking支持Java,.NET
Core和Node.JS语言。相对于其他平台:比如Pinpoint支持Java和 PHP,具有较大的优势。
探针无倾入性。对比CAT具有倾入性的探针,优势较大。不修改原有项目一行代码就可以进行集 成。
探针性能优秀。有网友对Pinpoint和Skywalking进行过测试,由于Pinpoint收集的数据过多,所以
对性能损耗较大,而Skywalking探针性能十分出色。
支持组件较多。特别是对Rpc框架的支持,这是其他框架所不具备的。Skywalking对Dubbo、
gRpc等有原生的支持,甚至连小众的motan和sofarpc都支持。
对比图如下:

在这里插入图片描述
在这里插入图片描述

如上图,基本上我们常规微服务项目来说,Skywalking 无论从适配性还是性能上都是最佳的选择,如果定制化痕迹比较明显,建议使用Zipkin

skywalking 服务端启动完整配置

skywalking 下载

首先从官网下载 skywalking
下载地址:点这里

这里有个坑,就是最新版的报12800 端口找不到,稍早版本的报web ui启动不了,这里推荐使用8.7版本的

skywalking 配置文件修改 (基于nacos ,mysql)

本文是的注册中心是基于nacos的 ,storage 是基于mysql的,其他的也都根据自己组件修改就行,大同小异

下载解压后,进入apache-skywalking-apm-binconfig内,编辑application.yml

注册中心改为 nacos


cluster:
  selector: ${SW_CLUSTER:nacos}

首先这里改为nacos
在这里插入图片描述

storage 改为 mysql 配置同时创建一个数据库(名字自定义)

在这里插入图片描述

storage:
  selector: ${SW_STORAGE:mysql}

这里改为mysql

在这里插入图片描述

skywalking oapService 服务端启动

进入apache-skywalking-apm-binin下,双击startup.bat(windows环境)

在这里插入图片描述

如果没有问题,会有如下两个页面并且日志没有异常输出

在这里插入图片描述

进入skywalking web控制台

端口号如果没改就是默认8080,这时我们访问localhost:8080

在这里插入图片描述

进入首页后发现是空的,因为我们还没有集成客户端,客户端负责收集信息发送到服务端,服务端才有内容展示
下面我们开始整合agent,也就是客户端:

业务端集成入skywalking (基于agent 无代码入侵方式)

我这里使用的是之前章节《【万字原创】 从0~1实现 微服务下 下单/秒杀场景最终一致性解决方案(rocketmq):完整流程,模型,讲解,压测,部署介绍以及完整demo源码和源码说明(1)-整体介绍》的下单案例,链路如下图,源码都在里面,有兴趣的可以去看看

在这里插入图片描述

详细调用时序图如下:
在这里插入图片描述

启动各个服务并集成agent (基于minicloud框架下,大家按照自己业务就好)

idea 内源码启动

命令:-javaagent:xxxapache-skywalking-apm-binagentskywalking-agent.jar -Dskywalking.agent.service_name=your_server_name -Dskywalking.collector.backend_service=localhost:11800

在这里插入图片描述

jar 包启动

命令:java -javaagent:xxxapache-skywalking-apm-binagentskywalking-agent.jar -Dskywalking.agent.service_name=core-processer-biz -Dskywalking.collector.backend_service=localhost:11800 -Xmx1024m -Xms1024m -jar your.jar &

服务启动后查看是否连接成功

在这里插入图片描述

postman请求

在这里插入图片描述

查看skywalking 内追踪数据

在这里插入图片描述

可以看见,整个链路如上面流程图所示,均按步骤显示出来,都是一个traceId ,说明是一个请求下的

skywalking 全链路追踪原理

skywalking 整体架构

在这里插入图片描述

skywalking agent 如何收集各个服务信息的

skywalking agent 入口处用到了javaagent 探针技术,这里不做详细讲解,后续会单独写一篇介绍文章 主要说明一下javaagent 探针是可以直接通过jar 启动时用命令 -javaagent:path(探针路径) 指明一个外层拦截jar
这个javaagent 可以拦截启动端业务jar的所有执行类,参数和方法,我们可以这样达到对方法拦截并发送的目的,
如下图:

在这里插入图片描述

可以看到主要流程如下:
1.入口处业务由agent 生成全局唯一traceId,并按链路一路带过去(一般是通过http header)
2.agent 会获取并收集然后发送到oapserver端
3.oapserver端汇总并将唯一traceId的数据做关联展示