【11】微服务链路追踪SkyWalking

1、skywalking是什么

1.1 链路追踪介绍

  • 对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如:
    • 如何串联整个调用链路,快速定位问题?
    • 如何缕清各个微服务之间的依赖关系?
    • 如何进行各个微服务接口的性能分折?
    • 如何跟踪整个业务流程的调用处理顺序?

1.2 skywalkig简介

  • skywalking是一个国产开源框架,2015年由吴晟开源 , 2017年加入Apache孵化器。
  • skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。
  • 它是一款优秀的 APM(Application Performance Management)工具,包括了分布式追踪、性能指标分析、应用和服务依赖分析等。
  • 官网下载地址Github中文文档

1.3 链路追踪框架对比

  • Zipkin 是Twitter开源的调用链分析工具,目前基于springcloud sleuth得到了广泛的使用,特点是轻量,使用部署简单。
  • Pinpoint 是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。
  • SkyWalking 是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。
  • Cat 是大众点评开源的基于编码和配置的调用链分析,应用监控分析,日志采集,监控报警等一系列的监控平台工具。

1.4 Skywalking主要功能特性

  • 1、多种监控手段,可以通过语言探针和service mesh获得监控的数据;
  • 2、支持多种语言自动探针,包括 Java,.NET Core 和 Node.JS;
  • 3、轻量高效,无需大数据平台和大量的服务器资源;
  • 4、模块化,UI、存储、集群管理都有多种机制可选;
  • 5、支持告警;
  • 6、优秀的可视化解决方案;

2、 SkyWalking 环境搭建部署

  • Skywalking agent和业务系统绑定在一起,负责收集各种监控数据;
  • Skywalking oapservice是负责处理监控数据的,比如接受skywalking agent的监控数据,并存储在数据库中;接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。它通常以集群的形式存在。
  • Skywalking webapp,前端界面,用于展示数据。
  • 数据库指的是用于存储监控数据的数据库,比如mysql、elasticsearch等。

2.1 下载 SkyWalking

2.2 搭建 SkyWalking OAP 服务

  • 启动脚本bin/startup.sh
  • 日志信息存储在logs目录
  • 启动成功后,会有两个服务被启动分别是:skywalking-oap-serverskywalking-web-ui ;
  • skywalking-oap-server服务启动后会暴露11800 和 12800 两个端口,分别为收集监控数据的端口11800和接受前端请求的端口12800,修改端口可以修改config/applicaiton.yml;
  • skywalking-web-ui服务会占用 8080 端口, 修改端口可以修改webapp/webapp.yml;
    • server.port:SkyWalking UI服务端口,默认是8080;
    • collector.ribbon.listOfServers:SkyWalking OAP服务地址数组,SkyWalking UI界面的数据是通过请求SkyWalking OAP服务来获得;
  • 请求UI服务

2.3 SkyWalking中的三个概念

  • 服务(Service) :表示对请求提供相同行为的一系列或一组工作负载,在使用Agent时,可以定义服务的名字;
  • 服务实例(Service Instance) :上述的一组工作负载中的每一个工作负载称为一个实例, 一个服务实例实际就是操作系统上的一个真实进程;
  • 端点(Endpoint) :对于特定服务所接收的请求路径, 如HTTP的URI路径和gRPC服务的类名 + 方法签名;

3、SkyWalking 接入微服务

3.1 Linux环境通过jar包方式接入

  • 准备一个SpringBoot程序,打成可执行jar包,写一个shell脚本,在启动项目的Shell脚本中,通过 -javaagent 参数进行配置SkyWalking Agent来跟踪微服务;

    bash 复制代码
    #!/bin/sh
    # SkyWalking Agent配置
    export SW_AGENT_NAME=springboot-skywalking-demo #Agent名字,一般使用`spring.application.name`
    export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 #配置 Collector 地址。
    export SW_AGENT_SPAN_LIMIT=2000 #配置链路的最大Span数量,默认为 300。
    export JAVA_AGENT=-javaagent:/usr/local/soft/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar
  • 启动的日志信息:

4、Skywalking持久化跟踪数据

  • 默认使用的H2数据库存储
  • config/application.yml

4.1 基于mysql持久化

  • 修改config目录下的application.yml,使用mysql作为持久化存储的仓库
  • 修改mysql连接配置
  • 编辑配置文件
yaml 复制代码
storage:
  #选择使用mysql   默认使用h2,不会持久化,重启skyWalking之前的数据会丢失
  selector: ${SW_STORAGE:mysql}
  #使用mysql作为持久化存储的仓库
  mysql:
    properties:
      #数据库连接地址
      jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://1ocalhost:3306/swtest"}
      #用户名
      dataSource.user: ${SW_DATA_SOURCE_USER:root}
      #密码
  • 启动Skywalking,查看swtest数据库,可以看到生成了很多表。

5、 自定义SkyWalking链路追踪

  • 如果我们希望对项目中的业务方法,实现链路追踪,方便我们排查问题,可以使用如下的代码:

  • 引入依赖

    xml 复制代码
    	<!-- SkyWalking 工具类 -->
    	<dependency>
        <groupId>org.apache.skywalking</groupId>
        <artifactId>apm-toolkit-trace</artifactId>
        <version>8.4.0</version>

5.1 @Trace将方法加入追踪链路

  • 如果一个业务方法想在ui界面的跟踪链路上显示出来,只需要在业务方法上加上@Trace注解即可;
  • 测试:

5.2 加入@Tags或@Tag

  • 我们还可以为追踪链路增加其他额外的信息,比如记录参数和返回信息。

  • 实现方式:在方法上增加@Tag或者@Tags。

  • @Tag 注解中 key = 方法名 、value = returnedObj 返回值 、 arg[0] 参数

    java 复制代码
    @Trace
    @Tag(key = "list", value = "returnedObj")
    public List<User> list(){
        return userMapper.list();
    }
    
    @Trace
    @Tags({@Tag(key = "param", value = "arg[0]"),
            @Tag(key = "user", value = "returnedObj")})
    public User getById(Integer id){
        return userMapper.getById(id);
    }


相关推荐
DT辰白3 小时前
如何解决基于 Redis 的网关鉴权导致的 RESTful API 拦截问题?
后端·微服务·架构
老猿讲编程5 小时前
技术发展历程:从 CORBA 到微服务
微服务·云原生·架构
time_silence9 小时前
微服务——服务通信与接口设计
微服务
Java程序之猿1 天前
微服务分布式(一、项目初始化)
分布式·微服务·架构
Yvemil71 天前
《开启微服务之旅:Spring Boot Web开发举例》(一)
前端·spring boot·微服务
Yvemil71 天前
《开启微服务之旅:Spring Boot Web开发》(二)
前端·spring boot·微服务
维李设论1 天前
Node.js的Web服务在Nacos中的实践
前端·spring cloud·微服务·eureka·nacos·node.js·express
jwolf21 天前
基于K8S的微服务:一、服务发现,负载均衡测试(附calico网络问题解决)
微服务·kubernetes·服务发现
Yvemil71 天前
《开启微服务之旅:Spring Boot Web开发举例》(二)
前端·spring boot·微服务