分布式链路追踪体验-skywalking入门使用
背景
旁友,你的线上服务是不是偶尔来个超时,或者突然抖动一下,造成用户一堆反馈投诉。然后你费了九牛二虎之力,查了一圈圈代码和日志才总算定位到问题原因了。或者公司内部有链路追踪系统,虽然可以很轻松地通过监控判断问题出现的原因,但是对其中的逻辑完全摸不着头脑。只能上网搜索一番。
旁友,skywalking分布式链路追踪框架了解一下。
有的旁友会有疑惑,我的Spring Boot 就是一个单体应用么,不需要链路追踪?有问题直接翻日志就行了,但是即使是一个 Spring Boot 单体应用,也会和以下服务打交道:
- 关系数据库,例如说 MySQL、PostgreSQL 等等。
- 缓存数据库,例如说 Redis、Memcached 等等。
- 外部三方服务,例如说微信公众号、微信支付、支付宝支付、短信平台等等
可见,仅仅一个 Spring Boot 单体应用,就已经涉及到分布在不同进程中的服务了。此时,就非常有必要用上skywalking。例如说,线上某个 接口访问非常慢,用SkyWalking 可以定位是MySQL 查询比较慢呢,还是调用的第三方服务比较慢。
而在分布式服务中,各个大厂内部系统成百上千的,链路关系更加复杂。比如你在外卖平台上的一个点击请求可能跨了内部几十个Java应用了,在这么长的链路里去排查问题,没有好使的工具怎么行呢。如图是当前分布式系统的现状,图片来源:鹰眼下的淘宝分布式调用跟踪系统介绍

根据上图,我们设想:
1.系统中有可能每天都在增加新服务或删除旧服务,也可能进行升级,当系统出现错误,我们如何定位问题?
2.当用户请求时,响应缓慢,怎么定位问题?
3.服务可能由不同的编程语言开发,1、2 定位问题的方式,是否适合所有编程语言?
Skywalking框架
1.介绍
SkyWalking 是什么?
官方网址 http://skywalking.apache.org/
skywalking是一个优秀的国产开源框架,2015年由个人吴晟(华为开发者)开源 , 2017年加入Apache孵化器。短短两年就被Apache收入麾下,实力可见一斑。
分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。
提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。
代码无侵入,通信方式采用GRPC,实现方式是java探针,支持告警,JVM监控,支持全局调用统计等等
skywalking的架构参考了谷歌的Dapper框架的论文,Dapper并没有开源,只给了篇论文,感兴趣但又不喜英文文档的旁友可以看看论文的中文翻译Dapper,大规模分布式系统的跟踪系统
整体架构如下:

- Tracing Metrics Logging :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。Java应用通常使用SkyWalking Agent 收集数据
- SkyWalking OAP :skywalking服务端(Transport layer,Receiver cluster,Aggregator cluster)负责接收 Agent 发送的 Tracing 数据信息,然后进行分析,存储到外部存储器( Storage ),最终提供查询功能。
- Storage option :Tracing 数据存储。目前支持 ES、H2 多种存储器。我们用ES存储即可 。
- GUI :负责提供可视化控台,查看链路等
- Alarm:提供告警功能,这里不展示讲
2.Docker方式搭建Skywalking环境
为了快速搭建环境,避免各种系统、配置环境不同造成踩坑的情况。我们用docker直接创建ElasticSearch、Skywalking-OAP、Skywalking-UI以及ES的管理工具Kibana。这样一套运行环境直接就能用了。话不多说,直接开干
整体架构如下:

用到的工具版本号如下表:
| 工具 | 版本号 |
|---|---|
| ElasticSearch | 7.14.2 |
| Kibana | 7.14.2 |
| skywalking-oap-server | 9.1.0 |
| skywalking-ui | 9.1.0 |
其中skywalking的docker-compos.yml运行脚本可以从官方的Github上获取apache/skywalking/docker
脚本需要修改,直接参考我的就行,不懂的参数都有具体说明:
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.14.2
container_name: elasticsearch
ports:
- 9200:9200
- 9300:9300
environment:
- "cluster.name=elasticsearch"
- "bootstrap.memory_lock=true"
- "ES_JAVA_OPTS=-Xms256m -Xmx512m"
- "discovery.type=single-node"
kibana:
image: docker.elastic.co/kibana/kibana:7.14.2
container_name: kibana
depends_on:
- elasticsearch
ports:
- 5601:5601
environment:
# IP地址为运行电脑的IP地址,Mac上通过 ifconfig en0 命令获取
- "elasticsearch.hosts=http://192.168.1.5:9200"
skywalking-oap:
image: apache/skywalking-oap-server:9.1.0
container_name: skywalking-oap
depends_on:
- elasticsearch
ports:
- "11800:11800"
- "12800:12800"
healthcheck:
test: [ "CMD-SHELL", "/skywalking/bin/swctl ch" ]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
environment:
TZ: Asia/Shanghai
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
SW_HEALTH_CHECKER: default
SW_TELEMETRY: prometheus
skywalking-ui:
image: apache/skywalking-ui:9.1.0
container_name: skywalking-ui
depends_on:
- skywalking-oap
links:
- skywalking-oap
ports:
# UI界面程序占用的端口
- "8080:8080"
environment:
TZ: Asia/Shanghai
# IP地址为运行电脑的IP地址,Mac上通过 ifconfig en0 命令获取
SW_OAP_ADDRESS: http://192.168.1.8:12800
2.1 Docker镜像加速
按上述配好docker-compose.yml文件后,命令行到所在目录下执行docker-compose up可以拉起镜像,第一次运行时会下载镜像,docker默认的镜像仓库在国外,所以下载速度和蜗牛一样慢。为了加速下载,需要配置国内的docker镜像
获取国内docker镜像库地址的方法:
- 阿里云官方镜像加速,获取加速器地址文档:阿里云官方镜像加速
- 网上搜索docker镜像加速,下面是测过有效的公共镜像库
配置方法:
Docker桌面版Preference -> Docker Engine 在Json配置里加上,加好之后重启Docker,然后再重新拉镜像,速度立马快得飞起
# 按需加上多个镜像库地址
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]

2.2 Skywalking UI界面
docker启动后,Skywalking第一次运行会自行在ES里创建索引,运行日志没有报错,说明启动成功了,浏览器打开http://127.0.0.1:8080/可以看到Skywalking 的界面

2.3 Skywalking agent使用
数据的采集通过agent,Java应用启动时通过-javaagent参数配置Skywalking agent。在IDEA中运行时,在启动参数vm 中配置即可。
Skywalking Agent下载
官网上下载Java agent压缩包Skywalking Agent下载,当前最新的版本是v8.12.0,下载到自己电脑上找个位置解压。我的是放在/Users/longbig/opt/目录下
shell脚本方式
# 配置agent地址,agent服务名,skywalking-oap collector地址(注意IP地址,因为我是docker运行,需要使用本机的局域网IP)
export JAVA_AGENT=-javaagent:/Users/yuyunlong/opt/skywalking-agent/skywalking-agent.jar=agent.service_name=multi_function,collector.backend_service=192.168.1.8:11800
# jar启动
java -jar $JAVA_AGENT application.jar
IDEA运行方式
在你需要运行的springboot应用的VM options里加上上面的参数,启动即可

启动完之后随便调用几个接口试试,然后再在Skywalking的界面查看效果
2.3 追踪数据
下面是我的服务的拓扑图,服务之间的依赖关系可以看的非常清楚,如果旁友的应用比较多的话,能铺满整个屏幕的

到此Skywalking的搭建就完成了
3. Skywalking集成Logback实现Trace日志打印
在之前的文章里,我们用了个简陋的方法实现了traceId的传递全链路追踪体验—TraceId的生成,现在我们用上Skywalking框架来打印traceId
加上Maven依赖
<!-- SkyWalking 对 Logback 的集成 -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.10.0</version>
</dependency>
logback-spring.xml文件修改内容:
主要修改2个地方
- CONSOLE_LOG_PATTERN 里加上
%tid,配置traceId占位符 - layout通过TraceIdPatternLogbackLayout 实现对
%tid替换为Skywalking TraceId
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} [%tid] %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
</layout>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
简单测试看看
随便写了个探活接口,看看接口耗时和日志打印效果
服务日志打印:

界面traceId搜索

小结
本篇文章讲了为什么用分布式链路追踪以及Skywalking框架的使用,是对上一篇最简陋traceId使用的进阶版。学东西就是要日拱一卒,量变引起质变。我是卷福同学,一个在福报厂修福报中的小社畜哦~
分布式链路追踪体验-skywalking入门使用的更多相关文章
- 在spring boot中三分钟上手apache顶级分布式链路追踪系统skywalking
原文:https://juejin.im/post/5cd10e81e51d453b560f2d53 skywalking在apache里全票通过成为了apache顶级链路追踪系统 项目地址:gith ...
- NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享
对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk或splunk进行定位及分析问题,更有甚者直接远程服务器,直接操作查看日志,那么,随着业务越来越复杂,企业应用也进入了分布式服务化的 ...
- SkyWalking+SkyApm-dotnet分布式链路追踪系统
SkyWalking+SkyApm-dotnet分布式链路追踪系统 对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk或splunk进行定位及分析问题,更有甚者直接远程服务器,直接操 ...
- 使用Skywalking分布式链路追踪系统
使用Skywalking分布式链路追踪系统 https://www.cnblogs.com/sunyuliang/p/11424848.html 当我们用很多服务时,各个服务间的调用关系是怎么样的?各 ...
- .NET Core集成SkyWalking+SkyAPM-dotne实现分布式链路追踪
.NET Core集成SkyWalking+SkyAPM-dotnet实现分布式链路追踪 SkyWalking是一款APM(应用性能管理),其他的还有Cat.Zipkin.Pinpoint等. 随着微 ...
- 分布式链路追踪自从用了SkyWalking,睡得真香!
本篇文章介绍链路追踪的另外一种解决方案Skywalking,文章目录如下: 什么是Skywalking? 上一篇文章介绍了分布式链路追踪的一种方式:Spring Cloud Sleuth+ZipKin ...
- 基于Dapper的分布式链路追踪入门——Opencensus+Zipkin+Jaeger
微信搜索公众号 「程序员白泽」,进入白泽的编程知识分享星球 最近做了一些分布式链路追踪有关的东西,写篇文章来梳理一下思路,或许可以帮到想入门的同学.下面我将从原理到demo为大家一一进行讲解,欢迎评论 ...
- 个推基于 Zipkin 的分布式链路追踪实践
作者:个推应用平台基础架构高级研发工程师 阿飞 01业务背景 随着微服务架构的流行,系统变得越来越复杂,单体的系统被拆成很多个模块,各个模块通过轻量级的通信协议进行通讯,相互协作,共同实现系统 ...
- 分布式链路追踪之Spring Cloud Sleuth+Zipkin最全教程!
大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第九篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...
随机推荐
- 国外价值10K+美金的Python面试题,珍藏已久,含泪放了出来
兄弟们,没吹牛皮,一哥们在国外面试的时候,就是要他做的这个,直接给他说,做出来了给你15K(单位是刀),做不出来就拜拜~ 大兄弟当时就不服了,这不是看不起我么,分分钟就给整完了~ 我上我也行系列: 唠 ...
- who is the next one?
Turn-Taking: 参加会话的人参加整个会话的过程中轮流说话,end-of-utterance detection systems,是对说话转变的预测,既什么时候发生对话者之间的转变. Eva ...
- 0016:单源最短路径(dijkstra算法)
题目链接:https://www.luogu.com.cn/problem/P4779 题目描述:给定一个 n 个点,m 条有向边的带非负权图,计算从 s 出发,到每个点的距离. 这道题就是一个单源最 ...
- 2022-7-12 第五组 pan小堂 js
JavaScript Switch 语句 (熟悉掌握) 请使用 switch 语句来选择多个需被执行的代码块之一. 语法: switch(表达式){ case n: 代码块 break; case n ...
- 钡铼BL102分布式IO系统如何应用于锂电池行业
近年来,全球新能源汽车的蓬勃发展促进了锂电池行业的发展.随着锂电池标准化程度的提高,电池和模块规格的标准化是未来的发展趋势,也促进了自动化模块生产线的发展. 锂电池模块生产线通过涂胶-电池堆叠-组装- ...
- k8s QoS与pod驱逐
概述 QoS是Quality of Service的缩写,即服务质量.每个pod属于某一个QoS分类,而Kubernetes会根据pod的QoS级别来决定pod的调度.抢占调度和驱逐优先级,而且pod ...
- scrollTop实例
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- 一篇文章带你搞定BFC~
一.什么是BFC 是 Block Formatting Contexts 的缩写,名为"块级格式化上下文". 是指浏览器中创建了一个独立的渲染区域,并且拥有一套渲染规则,他决定了其 ...
- PROFIBUS,PROFINET,Ethernet三者的区别
PROFIBUS,PROFINET,Ethernet三者的区别 简单一点说,PROFINET=PROFIbus+etherNET,把Profibus的主从结构移植到以太网上,所以profinet会有C ...
- 关于微信豆苹果(IOS)用户1比10充值方法
微信iOS端微信7.0.20版本之后就上线了微信豆功能,相比大家对微信豆已经不陌生了. 微信官方现在给出了微信豆的含义,微信豆是用于支付微信内虚拟物品的道具,支持在视频号中购买虚拟礼物.也可以对公 ...