spring-cloud(八)微服务链路追踪篇-SkyWalking

spring-cloud-Hoxton.SR6 (八)微服务链路追踪篇-SkyWalking

本文spring-cloud 版本为:hoxton.sr6

本文spring-boot版本为:2.2.x-2.3.x

一、为什么需要链路追踪?

由于微服务化项目拆分,会导致系统服务间调用链路愈发复杂,此时,一个前端请求可能最终需要调用多个后端服务才能完成实现。

微服务间调用链路可能是这样:

image-20200912220349065

可能我画的不是很准确或者复杂,但是我的意图您需要清楚,就是微服务间啊,相互依赖,一个请求可能需要依赖多个微服务间调用,其整个调用链呢,可能非常复杂繁杂!服务越多,链路图一定会越乱,越复杂!

当整个请求不可用出现问题时,我们是没有办法判断请求是由哪个后端服务引发问题,这时我们需要快速定位故障点,找到调用异常的服务,跟进一个请求到底有哪些服务参与,参与顺序是怎样,从而达到每个请求的步骤清晰可见并且如果有新同事加入,不能快速的知道自己所负责的服务在哪一环等等…于是就有了分布式系统调用跟踪的需求。

为什么需要链路追踪总结如下:

  • 1.故障定位难

  • 2.链路梳理难

  • 无法快速上手

即使服务再多,微服务间相互依赖的关系再乱,链路再乱,有了链路追踪,每一个请求的调用链路都清晰明了了,我们可快速定位调用链路上的某一环节的问题以及帮助新同事快速梳理调用流程等…

链路追踪已经不是什么新兴技术和概念了,其可使用组件有很多,比如:sleuth、Zipkin、阿里鹰眼、大众点评Cat、SkyWalkIng等…

这些组件呢有一个共同的名字: APM 工具 (Application Performance Management)即应用性能监控工具…

今天呢,咱们学习一下链路追踪组件之 SkyWalkIng

二、链路追踪组件之SkyWalking

(1)是什么是SkyWalking

SkyWalking是中国人吴晟(华为)开源的一款APM工具,现在已属于Apache旗下开源项目, 是一个观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

(2)SkyWalkIng与ZipKin对比

至于为什么要采用此二者对比,因为我目前就用过这两个,zipkin是最早接触cloud项目用过,目前呢,是在学习SkyWalkIng

  • zipkin:Twitter公司开源的一个分布式追踪工具,被Spring Cloud Sleuth集成,使用广泛而稳定-
  • SkyWalking:中国人吴晟(华为)开源的一款分布式追踪,分析,告警的工具,现已属于Apache旗下开源项目
(1)ZipKin

zipKin 被Spring Cloud Sleuth所集成了,其分为客户端和服务端(如同eureka ,一个或集群下的服务端,然后所有被监控的服务都是其客户端)

Zipkin是一个分布式跟踪系统。它有助于收集解决服务体系结构中的延迟问题所需的时序数据。功能包括该数据的收集和查找。

戳我:ZipKin github文档:

ZipKin包含了一些核心组件有:

  • 追踪器:位于客户端,并记录有关发生的操作的时间和元数据,然后传输给服务端,这一点用户可见
  • Reporter: 将数据发送到Zipkin的检测应用程序
  • Collector:位于服务端中,收集传输来的数据
  • Storage :存储数据,默认存储在内存中
  • search :内置查询api,可删选链路追踪明细
  • UI :链路追踪控制台Web 管理界面,没有身份验证

架构图:

image-20200913104127100

使用一景:

image-20200913103430084

简单说下ZipKin的使用步骤:

1.安装ZipKIn服务端

可下载zip 可用docker,可像eureka版新建项目作为服务端

1.docker

docker run -d --restart always -p 9411:9411 --name zipkin openzipkin/zipkin 

2.新建项目作为服务端 (gradle版)

   compile 'io.zipkin.java:zipkin-server'
   compile 'io.zipkin.java:zipkin-autoconfigure-ui'

配置

server:
  port: 9411
spring:
  application:
    name: zipkin-server 

启动类添加注解

@EnableZipkinServer 
2.客户端

客户端添加依赖

compile group: 'org.springframework.cloud', name: 'spring-cloud-sleuth-zipkin'

客户端yml配置指明zipkin服务端地址

spring:
  zipkin:
     #zipkin服务器地址
    base-url: http://localhost:9411 
  sleuth:
    sampler:
      #链路跟踪的数据上传的概率  0.1-1.0 
      percentage: 1.0
3.ZIpKIn优缺点

  • 轻量级,springcloud集成,使用人数多,成熟

  • 侵入性
  • 功能简单
  • 欠缺APM报表能力(能力弱)
(2)skyWalking

SkyWalking:中国人吴晟(华为)开源的一款分布式追踪,分析,告警的工具,现已属于Apache旗下开源项目, 探针将数据通过gRPC或者HTTP传输给后端平台(server),后端平台将数据存储在Storage中,并且分析数据将结果展示在UI中.

戳我:SkyWalking中文文档:

1.SkyWalking 组成部分
  • Probes:探针,探针因使用的语言不同而不通,收集数据并且格式化为skywalking所需的格式。
  • Platform backend :平台后端,对应于zipkin server,可以集群部署,聚合,分析,将数据展示在UI中
  • Storage:存储,可扩展的存储,可以使es,H2,MySQL集群默认 h2
  • UI :丰富的可视化功能,提供身份验证

官网架构图一:

image-20200913102624443

官网架构图二:

image-20200913104002732

2.SkyWalking 优缺点

  • 多种监控手段多语言自动探针,Java,.NET Core 和 Node.JS
  • 轻量高效,不需要大数据
  • 模块化,UI、存储、集群管理多种机制可选,
  • 支持告警
  • 社区活跃

缺:

  • 较为新兴,成熟度不够高

三、SkyWalking 环境搭建

本文,采用docker-compose 安装 SkyWalking 环境

项目采用SkyWalkIng 版本为8.0.1 目前最新版为:8.1.0…

使用Elasticsearch7.x 版本存储数据(链路追踪相关数据)

实际上本次docker-compsoe.yml共构建了启动三个镜像:

es7.8.0、skywalking-oap-server 8.0.1、skywalking-ui:8.0.1

#docker-compose 文件所用版本号 这个需要注意 不同版本写法还是有点小区别的
version: '3'
services:
  #依赖于es存储
  elasticsearch7:
    image: elasticsearch:7.8.0
    container_name: elasticsearch7
    restart: always
    ports:
    #es 外暴映射端口 
      - 9200:9200
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - TZ=Asia/Shanghai
    ulimits:
      memlock:
        soft: -1
        hard: -1
    networks:
      - skywalking
    volumes:
      - elasticsearch7:/usr/share/elasticsearch/data
  #构建SkyWalking 服务
  oap:
    image: apache/skywalking-oap-server:8.0.1-es7
    container_name: oap
    depends_on:
      - elasticsearch7
    links:
      - elasticsearch7
    restart: always
    ports:
      - 11800:11800
      - 12800:12800
    networks:
      - skywalking
    volumes:
      - ./ext-config:/skywalking/ext-config
  #SkyWalkIng 可视化web界面
  ui:
    image: apache/skywalking-ui:8.0.1
    container_name: ui
    depends_on:
      - oap
    links:
      - oap
    restart: always
    ports:
      - 8080:8080
    environment:
      SW_OAP_ADDRESS: oap:12800
      security.user.admin.password: lei..
    networks:
      - skywalking

networks:
  skywalking:
    driver: bridge

volumes:
  elasticsearch7:
    driver: local

四、SkyWalkIng的使用

(1)检查SkyWalking

当docker-compose 构建好SkyWalkIng 环境后,我们可以访问web界面查看!

端口号看你docker-compose 构建时映射的web端口号了

image-20200913120306318

image-20200913120200472

检查Es IP:9200

image-20200913154815857

(2)项目中使用

SkyWalkIng在我们的微服务项目中虽然不需要额外引入依赖包,但是为了给SkyWalkIng 发送我们的链路信息,实际上还需要一个探针

Probes:探针,探针因使用的语言不同而不通,收集数据并且格式化为skywalking所需的格式。

因为我开发语言为jaava,则需要java探针,即Java Agent 服务器探针

那么探针在哪里来呢?在SkyWalkIng项目中,我们需要下载

下载:es7-8.0.1 版本

下载:SkyWalking历史版本

image-20200913150456879

Java Agent 服务器探针:

下载完解压如下:

image-20200913150520511

java agent 所处的位置在 解压后文件夹 apache-skywalking-apm-es7-8.0.1\apache-skywalking-apm-bin-es7\agent 目录下

image-20200913150554576

参考官网给出的帮助 Setup java agent,我们需要使用官方提供的探针为我们达到监控的目的

image-20200913150819700

image-20200913150836378

其实说白了就是我们要把 skywalkIng-agent.jar 放在我们启动参数之中

要想把当前服务让SkyWalkIng 管理监控起来,需要进行以下jvm参数设置(每一个想要使用SkyWalkIng的服务均要进行参数设置)

-javaagent: skywalkIng-agent.jar所在位置
-Dskywalking.agent.service_name=当前项目在skywalking想要叫啥名字
-Dskywalking.collector.backend_service=SkyWalkIng 服务端本地址
1、IDEA 部署探针 (本地开发)

我们需要给每个想要由SkyWalkIng管理的项目添加JVM 启动参数

image-20200913151748906

image-20200913151808057

image-20200913151849030

-javaagent:D:\google\apache-skywalking-apm-es7-8.0.1\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=demo-order
-Dskywalking.collector.backend_service=xxxxx:11800

SkyWalking服务端IP 由开始docker-compose 映射指定 11800 为外部通信地址

image-20200913152017834

就近采用前边的项目 ,均设置探针参数后启动

image-20200913152106669

这时候,我们再来看一下SKyWalkIng管理端,有信息,则说明探针部署成功了

image-20200913152300578

2、JAR包方式部署微服务探针处理(jar包部署)

注意:我这里执行语句不能直接copy 你需要自己更改skywalkIng.jar 包位置 以及 服务名字,jar包名字

java -javaagent:D:/google/apache-skywalking-apm-es7-8.0.1/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar -Dskywalking.agent.service_name=demo-order -Dskywalking.collector.backend_service=xxxx:11800 -jar springcloud-openfeign-hystrix-order-0.0.1-SNAPSHOT.jar

image-20200913153445791

3、Docker方式部署 探针处理(docker部署)

方式一:
构建基础镜像,将我们的skywalking-agent 文件包含在内,提供给java服务使用

FROM centos:7

WORKDIR /app

RUN yum install -y wget && \
    yum install -y java-1.8.0-openjdk

ADD https://mirror.bit.edu.cn/apache/skywalking/8.0.1/apache-skywalking-apm-es7-8.0.1.tar.gz /app

RUN tar -xf apache-skywalking-apm-es7-8.0.1.tar.gz && \
    mv apache-skywalking-apm-bin-es7 skywalking

RUN ls /app
docker build -t base/skywalking:1.0 .

构建服务镜像 order

FROM base/skywalking:1.0
 
COPY springcloud-openfeign-hystrix-order-1.0.jar /app/app.jar
 
EXPOSE 9002
 
ENTRYPOINT java -javaagent:/app/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=docker-order-demo -Dskywalking.collector.backend_service=xxxx:11800 -Dserver.port=9002 -jar app.jar
 docker build -t order-demo:1.0 -f /docker/lei/Dockerfile  .

image-20200913172538289

这样,在构建好 order-demo后,其容器内部也会有一个skywalking-agent.jar 的文件了

方式二:
使用数据卷挂载(-v 将探针位置挂载到容器内部)

(3)SKyWalkIng的使用

清晰的看到了服务负载情况以及访问接口,缓慢的点在哪里

image-20200913174932907

image-20200913175218839

从上图可以看出,访问/product/demo/{id} 接口。负载到demo-product-one 服务时候,接口 /product/demo/{id}整个响应比较缓慢,demo-product-one 这个接口耗时达到了4032ms,而到了demo-product-two时候,接口/product/demo/{id} 只用了15ms

出现这个的原因!!! 那当然是因为我前边设置的线程睡眠4000毫秒测试OpenFeign 和Hystrix的问题呀!

image-20200913175427173

image-20200913175522519

这个呢,是全局的接口响应统计记录,我们可以根据此报表看出,再某一个时间段的响应情况

我们再测试一下其他的接口

额…报错了!

image-20200913181749892注意:SkyWalkIng OPenFeign 报错org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept

image-20200913181938660

解决:

服务调用方yml 配置添加

feign:
  httpclient:
    enabled: true

服务调用方依赖包添加

        <!-- 使用Apache HttpClient替换Feign原生httpclient -->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

OK!解决!

image-20200913182456069

SkyWalkIng 提供的微服务间拓扑图

有了这个甚至无需我们自己手绘调用链路图…

image-20200913182557406

image-20200913183213964

Service ApdexScore :性能指标分数 0-1 越接近1 ,则说明服务性能越好…

点击微服务图标,会出现对应选择按钮,有服务器性能监控,整个服务调用链路、端点(请求过得url)监控等等

image-20200913182700346

比如我们要查看order 的调用链路

image-20200913182852429

image-20200913183447300

左侧这一栏呢,则为请求链路了,目前这一大排呢,是我自己Consul对客户端的健康检查…

image-20200913183731138

OK。好的,我们自己发送一些请求到demo-order服务

image-20200913183840230

image-20200913183920992

image-20200913184006855

image-20200913184031415

服务故障模拟

我们down掉两个product服务,然后请求order服务

image-20200913190628260

image-20200913190552706

可以看到,失败的请求在SkyWalking 调用链路中,标记为了红色,请调用链路图中了,/product/demo/{id}、Hystrix也变为了红色

点击报红链路—可以查看到改链路的错误信息

image-20200913190948166

综上:用了SkyWalkIng 整个服务的调用链路信息是十分的明显了。。。。。每段链路的耗时,以及整个请求所涉及的服务,都非常的清晰明显!!!很方便问题的排查!!!

SkyWalking 其报表能力非常的出色,也支持报表图片直接导出功能!很方便出了问题,同事间互相探讨以及项目组ppt讲义问题排查等等,自带高清无码图片下载,,,杠杠的!!

SkyWalkIng呢,其整个页面涉及以及功能还是比较完善的,虽然较之老牌王者 ZipKIn等可能还欠缺点火候,但依然影响不了其实用性,生产环境,还是可以使用的!


那么,本次的SkyWalkIng 使用就到这里了!

  • 6
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Skywalking是一种用于微服务链路追踪的开源工具,它可以帮助开发人员分析和监控微服务架构中各个服务之间的调用关系和性能指标。 通过Skywalking,我们可以实现对微服务之间的调用链路进行追踪。它的工作原理是在每个微服务中嵌入一个Skywalking Agent,该Agent负责采集和发送调用链数据和指标信息到Skywalking Collector。 这些数据可以包括请求的来源、目标服务、请求的参数和响应时间等信息。通过收集和分析这些数据,我们可以了解到整个微服务架构中各个服务之间的调用关系和性能状况。 要实现微服务链路追踪,我们可以使用Zipkin或Skywalking这样的工具。这些工具提供了可视化界面,用于展示微服务之间的调用链路和性能指标。我们只需要在每个微服务中添加相应的Agent,并配置好Collector的地址,就可以开始进行链路追踪了。 总结起来,Skywalking是一种用于微服务链路追踪的工具,通过在每个微服务中嵌入Agent并将数据发送到Collector,可以帮助我们分析和监控微服务架构中各个服务之间的调用关系和性能指标。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [分布式链路追踪原理详解及SkyWalking、Zipkin介绍](https://blog.csdn.net/weixin_38004638/article/details/115975798)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [分布式链路追踪SkyWalking](https://blog.csdn.net/swimming_in_IT_/article/details/130250233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值