• 猿创征文|链路追踪-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。这样一套运行环境直接就能用了。话不多说,直接开干

    整体架构如下:

    在这里插入图片描述

    用到的工具版本号如下表:

    工具版本号
    ElasticSearch7.14.2
    Kibana7.14.2
    skywalking-oap-server9.1.0
    skywalking-ui9.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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    2.1 Docker镜像加速

    按上述配好docker-compose.yml文件后,命令行到所在目录下执行docker-compose up可以拉起镜像,第一次运行时会下载镜像,docker默认的镜像仓库在国外,所以下载速度和蜗牛一样慢。为了加速下载,需要配置国内的docker镜像

    获取国内docker镜像库地址的方法:

    1. 阿里云官方镜像加速,获取加速器地址文档:阿里云官方镜像加速
    2. 网上搜索docker镜像加速,下面是测过有效的公共镜像库

    配置方法:

    Docker桌面版Preference -> Docker Engine 在Json配置里加上,加好之后重启Docker,然后再重新拉镜像,速度立马快得飞起🚀🚀🚀

      # 按需加上多个镜像库地址
      "registry-mirrors": [
    		"https://hub-mirror.c.163.com",
        "https://mirror.baidubce.com"
      ]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    IDEA运行方式

    在你需要运行的springboot应用的VM options里加上上面的参数,启动即可

    在这里插入图片描述

    启动完之后随便调用几个接口试试,然后再在Skywalking的界面查看效果

    2.3 追踪数据

    下面是我的服务的拓扑图,服务之间的依赖关系可以看的非常清楚,如果旁友的应用比较多的话,能铺满整个屏幕的

    在这里插入图片描述

    到此Skywalking的搭建就完成了

    3. Skywalking集成Logback实现Trace日志打印

    在之前的文章里,我们用了个简陋的方法实现了traceId的传递全链路追踪体验—TraceId的生成,现在我们用上Skywalking框架来打印traceId

    加上Maven依赖

            
            <dependency>
                <groupId>org.apache.skywalkinggroupId>
                <artifactId>apm-toolkit-logback-1.xartifactId>
                <version>8.10.0version>
            dependency>
    
            <dependency>
                <groupId>org.apache.skywalkinggroupId>
                <artifactId>apm-toolkit-traceartifactId>
                <version>8.10.0version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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">
            
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>infolevel>
            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-8charset>
            encoder>
        appender>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    简单测试看看

    随便写了个探活接口,看看接口耗时和日志打印效果

    服务日志打印:

    在这里插入图片描述

    界面traceId搜索

    在这里插入图片描述

    小结

    本篇文章讲了为什么用分布式链路追踪以及Skywalking框架的使用,是对上一篇最简陋traceId使用的进阶版。学东西就是要日拱一卒,量变引起质变。我是卷福同学,一个在福报厂修福报中的小社畜哦~

  • 相关阅读:
    理解FPGA中的亚稳态
    springboot vue街球社区网站java
    QT使用MSVC编译器时中文报错问题
    部署一个自己的GPT客户端[以ChatGPT-Next-Web为例]
    3.2docker镜像与容器基本的基本操作
    每日一练 | 华为认证真题练习Day132
    Object转List
    LeetCode·每日一题·864.获取所有钥匙的最短路径·广度优先搜索
    HTML
    市场调查与分析[市场调查员][抽样技术方案][抽样方法][F检验]
  • 原文地址:https://blog.csdn.net/qq_36624086/article/details/126823135