关于分布式系统:分布式链路追踪体验skywalking框架入门

1次阅读

共计 6050 个字符,预计需要花费 16 分钟才能阅读完成。

背景

旁友,你的线上服务是不是偶然来个超时,或者忽然抖动一下,造成用户一堆反馈投诉。而后你费了九牛二虎之力,查了一圈圈代码和日志才总算定位到问题起因了。或者公司外部有链路追踪零碎,尽管能够很轻松地通过监控判断问题呈现的起因,然而对其中的逻辑齐全摸不着头脑。只能上网搜寻一番。

旁友,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 镜像库地址的办法:

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

    • 网易云 https://hub-mirror.c.163.com
    • 百度云 https://mirror.baidubce.com

配置办法:

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 应用的进阶版。学货色就是要日拱一卒,质变引起量变。我是 卷福同学,一个在福报厂修福报中的小社畜哦~

正文完
 0