文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring Cloud Alibaba全家桶——微服务链路追踪SkyWalking

2023-08-19 18:08

关注

前言

在这里插入图片描述

本文小新为大家带来 微服务链路追踪SkyWalking 相关知识,具体内容包括SkyWalking简介SkyWalking环境搭建部署SkyWalking接入微服务SkyWalking持久化跟踪数据自定义SkyWalking链路追踪SkyWalking集成日志框架SkyWalking告警功能SkyWalking高可用SkyWalking UI介绍等进行详尽介绍~

不积跬步,无以至千里;不积小流,无以成江海。每天进步一点点,在成为强者的路上,小新与大家共同成长!

📌博主主页:小新要变强 的主页
👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~
👉Java微服务开源项目可参考:企业级Java微服务开源项目(开源框架,用于学习、毕设、公司项目、私活等,减少开发工作,让您只关注业务!)

↩️本文上接:Spring Cloud Alibaba全家桶(十)——微服务网关Gateway组件


目录

在这里插入图片描述

一、SkyWalking简介

1️⃣链路追踪介绍

对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如:

在这里插入图片描述

2️⃣SkyWalking是什么

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

官网地址:http://skywalking.apache.org/

下载地址:http://skywalking.apache.org/downloads/

Github地址:https://github.com/apache/skywalking

文档地址: https://skywalking.apache.org/docs/main/v8.4.0/readme/

中文文档: https://skyapm.github.io/document-cn-translation-of-skywalking/

3️⃣链路追踪框架对比

在这里插入图片描述

模拟了三种并发用户:500,750,1000。使用jmeter测试,每个线程发送30个请求,设置思考时间为10ms。使用的采样率为1,即100%,这边与生产可能有差别。pinpoint默认的采样率为20,即50%,通过设置agent的配置文件改为100%。zipkin默认也是1。组合起来,一共有12种。下面看下汇总表:

在这里插入图片描述

从上表可以看出,在三种链路监控组件中,skywalking的探针对吞吐量的影响最小,zipkin的吞吐量居中。pinpoint的探针对吞吐量的影响较为明显,在500并发用户时,测试服务的吞吐量从1385降低到774,影响很大。然后再看下CPU和memory的影响,在内部服务器进行的压测,对CPU和memory的影响都差不多在10%之内。

4️⃣SkyWalking功能特性

二、SkyWalking环境搭建部署

在这里插入图片描述

1️⃣下载 SkyWalking

下载地址: http://skywalking.apache.org/downloads/

在这里插入图片描述

目录结构:

在这里插入图片描述

2️⃣搭建SkyWalking OAP 服务

🍀启动脚本bin/startup.sh

在这里插入图片描述

🍀日志信息存储在logs目录

在这里插入图片描述

🍀启动成功后会启动两个服务,一个是skywalking-oap-server,一个是skywalking-web-ui : 8868
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服务来获得;

🍀访问:http://192.168.3.100:8080/

在这里插入图片描述

页面的右下角可以中英文切换,可以切换选择要展示的时间区间的跟踪数据。

3️⃣SkyWalking中三个概念

服务(Service) : 表示对请求提供相同行为的一系列或一组工作负载,在使用Agent时,可以定义服务的名字;

服务实例(Service Instance) : 上述的一组工作负载中的每一个工作负载称为一个实例, 一个服务实例实际就是操作系统上的一个真实进程;

端点(Endpoint) : 对于特定服务所接收的请求路径, 如HTTP的URI路径和gRPC服务的类名 + 方法签名。

在这里插入图片描述

三、SkyWalking接入微服务

1️⃣linux环境——通过jar包方式接入

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

🍀startup.sh脚本启动

#!/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.jarjava $JAVA_AGENT ‐jar springboot‐skywalking‐demo‐0.0.1‐SNAPSHOT.jar #jar启动

启动日志:

在这里插入图片描述
🍀以上启动等同于:

java ‐javaagent:/usr/local/soft/apache‐skywalking‐apm‐bin‐es7/agent/skywalking‐agent.jar‐DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800‐DSW_AGENT_NAME=springboot‐skywalking‐demo ‐jar springboot‐skywalking‐demo‐0.0.1‐SNAPSHOT.jar

参数名对应agent/config/agent.config配置文件中的属性。

属性对应的源码:org.apache.skywalking.apm.agent.core.conf.Config.java。

# The service name in UIagent.service_name=${SW_AGENT_NAME:Your_ApplicationName}# Backend service addresses.collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}

我们也可以使用skywalking.+配置文件中的配置名作为系统配置项来进行覆盖。 javaagent参数配置方式优先级更高。

🍀测试: 访问你的微服务

在这里插入图片描述

2️⃣Windows环境——在IDEA中使用SkyWalking

在运行的程序配置jvm参数,如下图所示:

在这里插入图片描述

# skywalking‐agent.jar的本地磁盘的路径‐javaagent:D:\apache\apache‐skywalking‐apm‐es7‐8.4.0\apache‐skywalking‐apm‐bin‐es7\agent\skywalking‐agent.jar# 在skywalking上显示的服务名‐DSW_AGENT_NAME=springboot‐skywalking‐demo# skywalking的collector服务的IP及端口‐DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.3.100:11800

-DSW_AGENT_COLLECTOR_BACKEND_SERVICES 可以指定远程地址, 但是-javaagent必须绑定你本机物理路径的skywalkingagent.jar。

3️⃣SkyWalking跨多个微服务跟踪

Skywalking跨多个微服务跟踪,只需要每个微服务启动时添加javaagent参数即可。

测试:
启动微服务mall-gateway,mall-order,mall-user ,配置skywalking的jvm参数,
访问http://localhost:8888/user/findOrderByUserId/1

在这里插入图片描述

在这里插入图片描述
注意: 此处存在bug,跟踪链路不显示gateway

拷贝agent/optional-plugins目录下的gateway插件到agent/plugins目录。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

四、SkyWalking持久化跟踪数据

默认使用的H2数据库存储,config/application.yml配置文件如下:

在这里插入图片描述

基于mysql持久化:

🍀(1)修改config目录下的application.yml,使用mysql作为持久化存储的仓库

在这里插入图片描述

🍀(2) 修改mysql连接配置

在这里插入图片描述

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}      #密码      dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}

注意: 需要添加mysql数据驱动包,因为在lib目录下是没有mysql数据驱动包的,所以修改完配置启动是会报错,启动失败的。

在这里插入图片描述

🍀(3) 添加mysql数据驱动包到oap-libs目录下

在这里插入图片描述

🍀(4)启动Skywalking

在这里插入图片描述

查看swtest数据库,可以看到生成了很多表:

在这里插入图片描述

这说明启动成功了,打开配置对应的地址http://192.168.3.100:8080/,j就可以看到skywalking的web界面。

在这里插入图片描述

🍀(5)测试:重启skywalking,验证跟踪数据会不会丢失

五、自定义SkyWalking链路追踪

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

<!‐‐ SkyWalking 工具类 ‐‐><dependency>  <groupId>org.apache.skywalkinggroupId>  <artifactId>apm‐toolkit‐traceartifactId>  <version>8.4.0version>dependency>

1️⃣@Trace将方法加入追踪链路

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

在这里插入图片描述

测试:

在这里插入图片描述

2️⃣加入@Tags或@Tag

我们还可以为追踪链路增加其他额外的信息,比如记录参数和返回信息。实现方式:在方法上增加@Tag或者@Tags。

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

@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);}

在这里插入图片描述
在这里插入图片描述

性能分析:

skywalking的性能分析,在根据服务名称、端点名称,以及相应的规则建立了任务列表后,在调用了此任务列表的端点后。skywalking会自动记录,剖析当前端口,生成剖析结果,具体流程如图:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

六、SkyWalking集成日志框架

🍀(1)引入依赖

<!‐‐ apm‐toolkit‐logback‐1.x ‐‐><dependency>  <groupId>org.apache.skywalkinggroupId>  <artifactId>apm‐toolkit‐logback‐1.xartifactId>  <version>8.5.0version>dependency>

🍀(2)添加logback-spring.xml文件,并配置 %tid 占位符

<configuration>  <!‐‐ 引入 Spring Boot 默认的 logback XML 配置文件 ‐‐>  <include resource="org/springframework/boot/logging/logback/defaults.xml"/>    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">    <!‐‐ 日志的格式化 ‐‐>    <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>    encoder>  appender>  <!‐‐ 设置 Appender ‐‐>  <root level="INFO">    <appender‐ref ref="console"/>  root>configuration>

🍀(3)测试

在这里插入图片描述

🍀(4)Skywalking通过grpc上报日志 (需要v8.4.0+)

gRPC报告程序可以将收集到的日志转发到SkyWalking OAP服务器上。

logback-spring.xml中添加:

<!‐‐ v8.4.0提供 ‐‐><appender name="grpc‐log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">  <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">    <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">      <Pattern>%d{yyyy‐MM‐dd HH:mm:ss.SSS} [%X{tid}] [%thread] %‐5level %logger{36} ‐%msg%nPattern>    layout>  encoder>appender><root level="info">  <appender‐ref ref="grpc‐log" />root>

在这里插入图片描述

打开agent/config/agent.config配置文件,添加如下配置信息:

plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:192.168.3.100}plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}

以上配置是默认配置信息,agent与oap在本地的可以不配。

agent配置信息:

配置名解释默认值
plugin.toolkit.log.transmit_formatted是否以格式化或未格式化的格式传输记录的数据true
plugin.toolkit.log.grpc.reporter.server_host指定要向其报告日志数据的grpc服务器的主机127.0.0.1
plugin.toolkit.log.grpc.reporter.server_port指定要向其报告日志数据的grpc服务器的端口11800
plugin.toolkit.log.grpc.reporter.max_message_size指定grpc客户端要报告的日志数据的最大大小10485760
plugin.toolkit.log.grpc.reporter.upstream_timeout客户端向上游发送数据时将超时多长时间。单位是秒30

Skywalking UI效果:

在这里插入图片描述

访问:https://github.com/apache/skywalking-rocketbot-ui/pull/428

在这里插入图片描述

七、SkyWalking告警功能

SkyWalking 告警功能是在6.x版本新增的,其核心由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中。

告警规则的定义分为两部分:

1️⃣告警规则

SkyWalking 的发行版都会默认提供config/alarm-settings.yml文件,里面预先定义了一些常用的告警规则。如下:

这些预定义的告警规则,打开config/alarm-settings.yml文件即可看到。

告警规则配置项的说明:

2️⃣Webhook(网络钩子)

Webhook可以简单理解为是一种Web层面的回调机制,通常由一些事件触发,与代码中的事件回调类似,只不过是Web层面的。由于是Web层面的,所以当事件发生时,回调的不再是代码中的方法或函数,而是服务接口。例如,在告警这个场景,告警就是一个事件。当该事件发生时,SkyWalking就会主动去调用一个配置好的接口,该接口就是所谓的Webhook。

SkyWalking的告警消息会通过 HTTP 请求进行发送,请求方法为 POST,Content-Type 为 application/json,其JSON 数据实基于List

[{  "scopeId": 1,  "scope": "SERVICE",  "name": "serviceA",  "id0": "12",  "id1": "",  "ruleName": "service_resp_time_rule",  "alarmMessage": "alarmMessage xxxx",  "startTime": 1560524171000}, {  "scopeId": 1,  "scope": "SERVICE",  "name": "serviceB",  "id0": "23",  "id1": "",  "ruleName": "service_resp_time_rule",  "alarmMessage": "alarmMessage yyy",  "startTime": 1560524171000}]

字段说明:

3️⃣邮件告警功能实践

SkyWalking是不支持直接向邮箱、短信等服务发送告警信息的,SkyWalking只会在发生告警时将告警信息发送至配置好的Webhook接口。

但我们总不能人工盯着该接口的日志信息来得知服务是否发生了告警,因此我们需要在该接口里实现发送邮件或短信等功能,从而达到个性化的告警通知。
接下来开始动手实践,这里基于Spring Boot进行实现。

🍀(1)首先是添加依赖

<dependency>  <groupId>org.springframework.bootgroupId>  <artifactId>spring‐boot‐starter‐mailartifactId>dependency>

🍀(2)配置邮箱服务

server:  port: 9134  #邮箱配置  spring:    mail:      host: smtp.163.com      #发送者邮箱账号      username: 你的邮箱@163.com      #发送者密钥      password: 你的邮箱服务密钥      default‐encoding: utf‐8      port: 465 #端口号465或587      protocol: smtp  properties:    mail:      debug:        false    smtp:      socketFactory:        class: javax.net.ssl.SSLSocketFactory

🍀(3)根据SkyWalking发送的JSON数据定义一个DTO,用于接口接收数据

@Datapublic class SwAlarmDTO {  private Integer scopeId;  private String scope;  private String name;  private Integer id0;  private Integer id1;  private String ruleName;  private String alarmMessage;  private Long startTime;}

🍀(4)接着定义一个接口,实现接收SkyWalking的告警通知,并将数据发送至邮箱

@Slf4j@RestController@RequiredArgsConstructor@RequestMapping("/alarm")public class SwAlarmController {  private final JavaMailSender sender;  @Value("${spring.mail.username}")  private String from;    @PostMapping("/receive")  public void receive(@RequestBody List<SwAlarmDTO> alarmList) {    SimpleMailMessage message = new SimpleMailMessage();    // 发送者邮箱    message.setFrom(from);    // 接收者邮箱    message.setTo(from);    // 主题    message.setSubject("告警邮件");    String content = getContent(alarmList);    // 邮件内容    message.setText(content);    sender.send(message);    log.info("告警邮件已发送...");  }   private String getContent(List<SwAlarmDTO> alarmList) {    StringBuilder sb = new StringBuilder();    for (SwAlarmDTO dto : alarmList) {      sb.append("scopeId: ").append(dto.getScopeId())        .append("\nscope: ").append(dto.getScope())        .append("\n目标 Scope 的实体名称: ").append(dto.getName())        .append("\nScope 实体的 ID: ").append(dto.getId0())        .append("\nid1: ").append(dto.getId1())        .append("\n告警规则名称: ").append(dto.getRuleName())        .append("\n告警消息内容: ").append(dto.getAlarmMessage())        .append("\n告警时间: ").append(dto.getStartTime())        .append("\n\n‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐\n\n");    }     return sb.toString();  }}

🍀(5)最后将该接口配置到SkyWalking中,Webhook的配置位于config/alarm-settings.yml文件的末尾,格式为http://{ip}:{port}/{uri}。

如下示例:

[root@ip‐236‐048 skywalking]# vim config/alarm‐settings.ymlwebhooks:  ‐ http://127.0.0.1:9134/alarm/receive

🍀(6)测试告警功能

完成告警接口的开发及配置后,我们来进行一个简单的测试。这里有一条调用链路如下:

在这里插入图片描述

在/producer接口中增加一行睡2秒的代码:

@Override@Trace@Tag(key="getAll",value="returnedObj")public List<Order> all() throws InterruptedException {  TimeUnit.SECONDS.sleep(2);  return orderMapper.selectAll();}

访问http://localhost:8072/order/all,执行完测试代码,等待约两分钟后,告警接口的控制台输出了一段日志信息:

在这里插入图片描述

八、SkyWalking高可用

在大多数生产环境中,后端应用需要支持高吞吐量并且支持高可用来保证服务的稳定,所以你始终需要在生产环境进行集群管理。

skywalking集群是将skywalking oap作为一个服务注册到nacos上,只要skywalking oap服务没有全部宕机,保证有一个skywalking oap在运行,就能进行跟踪。

搭建一个skywalking oap集群需要:

🍀(1)修改config/application.yml文件

使用nacos作为注册中心:

在这里插入图片描述

修改nacos配置:

在这里插入图片描述

可以选择性修改监听端口:

在这里插入图片描述

修改存储策略,使用elasticsearch7作为storage:

在这里插入图片描述

在这里插入图片描述

🍀(2)配置ui服务webapp.yml文件的listOfServers,写两个地址

在这里插入图片描述

🍀(3)启动服务测试

启动Skywalking服务,指定springboot应用的jvm参数:

‐DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.3.10:11800,192.168.3.12:11800

九、SkyWalking UI介绍

1️⃣菜单栏

在这里插入图片描述

2️⃣控制栏

在这里插入图片描述

3️⃣展示栏

Global全局维度:

在这里插入图片描述

Service服务维度:

在这里插入图片描述

Instance服务维度:

在这里插入图片描述

Endpoint端点(API)维度:

在这里插入图片描述

4️⃣拓扑图

在这里插入图片描述

5️⃣追踪

在这里插入图片描述

6️⃣性能剖析

在这里插入图片描述

## 7️⃣

分析线程栈信息:

在这里插入图片描述

8️⃣告警

不同维度告警列表,可分为服务、端点和实例。

在这里插入图片描述


后记

在这里插入图片描述

👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~

来源地址:https://blog.csdn.net/qq_42146402/article/details/129923040

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯