分布式之Skywalking

Skywalking

skywalking是一个apm系统,包含监控,追踪,并拥有故障诊断能力的 分布式系统

一、Skywalking介绍

1.什么是SkyWalking

  Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品,它同时吸收了Zipkin /Pinpoint /CAT 的设计思路。特点是:支持多种插件,UI功能较强,支持非侵入式埋点。目前使用厂商最多,版本更新较快。

  数据存储支持:Elasticsearch、MySQL、H2、TiDB。默认是H2,而且是存到内存。实际我们一般将其存到ES。

主页:http://skywalking.apache.org/
下载:https://skywalking.apache.org/downloads/
github:https://github.com/apache/skywalking
文档:https://github.com/apache/skywalking/tree/master/docs
配置:https://github.com/apache/skywalking/tree/master/docs/en/setup/backend

2.APM

  APM全称Application Performance Management应用性能管理,目的是通过各种探针采集数据,收集关键指标,同时搭配数据呈现以实现对应用程序性能管理和故障管理的系统化解决方案.

  Zabbix、Premetheus、open-falcon等监控系统主要关注服务器硬件指标与系统服务运行状态等,而APM系统则更重视程序内部执行过程指标和服务之间链路调用情况的监控,APM更有利于深入代码找到请求响应“慢”的根本问题,与Zabbix之类的监控是互补关系 目前市面上开源的APM系统主要有CAT、Zipkin、Pinpoint、SkyWalking,大都是参考Google的 Dapper实现的.

3.链路追踪工具对比

链路追踪工具一般要有如下功能:

  • 心跳检测(确定应用是否还在运行)
  • 记录请求的执行流程、执行时间
  • 资源监控(CPU、内存、带宽、磁盘)
  • 告警功能(监控执行时间、成功率等通过邮件、钉钉、短信、微信等进行通知)
  • 可视化页面

常用的工具有:

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

各维度对比

对比项ZipkinPinpointSkyWalkingCat
实现方式拦截请求,发送(Http,MQ)数据到Zipkin服务Java探针,字节码增强Java探针,字节码增强代码埋点(拦截器,注解,过滤器等)
接入方式基于linkerd或者sleuth方式javaagent字节码javaagent字节码代码侵入
agent到collector协议http,MQthriftgRPChttp/tcp
OpenTracing支持不支持支持不支持
颗粒度接口级方法级方法级代码级
全局调用统计不支持支持支持支持
traceid查询支持不支持支持不支持
报警不支持支持支持支持
JVM监控不支持不支持支持支持
UI功能支持支持支持支持
数据存储ES、MySQL等HBaseES/H2/MySQLMySQL/HDFS

性能对比图

image.png

4.SkyWalking的功能特性

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

二、SkyWalking环境搭建

1.Skywalking结构

  先来看看Skywalking的结构图

image.png

说明:

  • Skywalking agent 和业务系统绑定在一起,负责收集各种监控数据
  • Skywalking oapservice负责处理监控数据,比如接受Skywalking agent的监控数据,并且存储在数据库中,接受Skywalking webapp前端的请求,从数据库查询数据,并返回给前端,Skywalking oapservice通常会以集群的方式搭建
  • Skywalking webapp ,UI服务,用于可视化展示数据
  • 用户持久化监控数据的数据库,可以选用ElasticSearch、MySQL等

2.Skywalking部署

  从官网提供的下载地址下载安装文件,我们先通过windows操作来演示下:https://skywalking.apache.org/downloads/

image.png

点击对应的下载链接下载即可

image.png

启动服务:

image.png

启动成功后会启动两个服务,一个是Skywalking-oap-server,一个是Skywalking-web-ui:8080

Skywalking-oap-server服务启动后会暴露11800和12800两个端口,分别为收集监控数据的端口11800和接收前端请求的端口12800,修改端口可以修改config/application.yml

image.png

默认端口8080,访问效果如下:

image.png

3.Java Agent

  在新版本中Agent是需要单独下载的。

image.png

下载后解压出来放在了前面Skywalking的解压目录中

image.png

三、服务接入

  然后我们就可以把我们的微服务接入到Skywalking中来监控链路的执行。

1.开发环境的配置

  首先来看看在开发环境中的配置,因为Skywalking是无侵入式的。我们只需要在启动的时候通过相关的参数配置即可

# skywalking-agent.jar 的路径位置
-javaagent:d:\xxx\skywalking-agent.jar
# 在Skywalking中显示的服务名称
-DSW_AGENT_NAME=xxx-skywalking-service
# Skywalking的collector服务的IP及端口
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800

注意:-DSW_AGENT_COLLECTOR_BACKEND_SERVICES 可以指定远程服务,但是 -javaagent必须是本地的jar包.

2.gateway服务

  然后我们接入gateway的服务。在启动时设置对应的参数

image.png

启动服务后,我们进入Skywalking的UI服务中查看

image.png

可以看到有对应的服务信息,但是没有相关的链路信息,主要是因为默认Skywalking中是不支持Gateway的,我们需要显示的添加对应的gateway插件支持

image.png

从我们下载的agent包中的 optional-plugins中把gateway的jar拷贝的对应的plugins中即可

image.png

重启服务测试即可

image.png

3.对接多个服务

  接下来我们就可以把商城系统中的各个服务都对接到Skywalking中,给每个服务添加对应的配置

-Xmx512m
-javaagent:D:\software\apache-skywalking-apm-bin\skywalking-agent\skywalking-agent.jar
-DSW_AGENT_NAME=mall-product
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800

分别启动

image.png

image.png

四、Skywalking持久化

  持久化数据到MySQL中。修改下配置,把原来默认的H2修改为MySQL就可以了。

image.png

mysql://localhost:3306/swtest?rewriteBatchedStatements=true&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8

然后还需要把MySQL的驱动包拷贝到对应的目录中

image.png

然后重启服务即可

image.png

生成的表结构还很多

五、自定义SkyWalking链路

  在默认情况下Skywalking是没有记录我们的业务方法的,如果需要添加业务方法的链路监控我们就需要添加如下的依赖

<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>8.8.0</version>
</dependency>

然后在业务方法上添加@Trace注解。那么该方法就会被监控

image.png

重启服务并访问:

image.png

但是查看这个方法的详情中没有返回信息和参数

image.png

这时我们可以通过@Tags和@Tag来解决这个问题

@Trace@Tags({@Tag(key = "getCatelog2JSON",value = "returnedObj"),@Tag(key = "param",value = "arg[0]")})

key:方法名 value = returnedObj:是指定返回值

arg[0]:参数

重启测试

image.png

六、集成日志框架

  将微服务的日志框架去集成SkyWalking,我们希望在我们微服务中日志中,能够记录当前调用链路的id,然后我们再根据这个id去SkyWalking的前端界面中进行搜索找到对应的调用链路记录。

  因为springboot默认实现的日志框架是logback,这里也就拿logback举例

在微服务中导入maven坐标

<!-- skywalking 日志记录  -->
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.5.0</version>
</dependency>

在项目中 resources目录下创建 logback-spring.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration><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>%d{HH:mm:ss.SSS} [%thread] %-5level logger_name:%logger{36} - [%tid] - message:%msg%n</pattern></layout></encoder></appender><root level="INFO"><appender-ref ref="console" /></root></configuration>

在Skywalking UI的日志菜单中显示日志信息

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--  控制台日志输出的格式中添加tid  --><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>%d{HH:mm:ss.SSS} [%thread] %-5level logger_name:%logger{36} - [%tid] - message:%msg%n</pattern></layout></encoder></appender><!-- skywalking grpc 日志收集 8.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} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><root level="INFO"><appender-ref ref="console" /><appender-ref ref="grpc-log" /></root></configuration>
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:127.0.0.1}
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}

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/281256.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JS】替换文本为emjio表情

最终效果展示 T1 T2 T3 T4 需求 把评论你好帅啊啊啊[开心][开心]&#xff0c;[开心] 替换为图片 思路 正则match提取[开心]到一个数组数组去重创建img标签img标签转文本. 。例&#xff1a;&#xff08;el.outerHTML&#xff09;&#xff0c;将el元素转文本字符串replaceAll…

流畅的 Python 第二版(GPT 重译)(十三)

第二十四章&#xff1a;类元编程 每个人都知道调试比一开始编写程序要困难两倍。所以如果你在编写时尽可能聪明&#xff0c;那么你将如何调试呢&#xff1f; Brian W. Kernighan 和 P. J. Plauger&#xff0c;《编程风格的要素》 类元编程是在运行时创建或自定义类的艺术。在 P…

新版 mac 浏览器乱码

现象 如下图&#xff0c;chrome 浏览器有的乱码了 解决方法 删除字体集中的微软雅黑&#xff08;下图已删除&#xff09;&#xff0c;右键移除

算法打卡day18|二叉树篇07|Leetcode 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

算法题 Leetcode 530.二叉搜索树的最小绝对差 题目链接:530.二叉搜索树的最小绝对差 大佬视频讲解&#xff1a;二叉搜索树的最小绝对差视频讲解 个人思路 因为是在二叉搜索树求绝对差&#xff0c;而二叉搜索树是有序的&#xff0c;那就把它想成在一个有序数组上求最值&…

HTML + CSS 核心知识点- 定位

简述&#xff1a; 补充固定定位也会脱离文档流、不会占据原先位置 1、什么是文档流 文档流是指HTML文档中元素排列的规律和顺序。在网页中&#xff0c;元素按照其在HTML文档中出现的顺序依次排列&#xff0c;这种排列方式被称为文档流。文档流决定了元素在页面上的位置和互相之…

探索数据结构:双向链表的灵活优势

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 前言 前面我们学习了单链表&#xff0c;它解决了顺序表中插入删除需…

深度学习——数据预处理

一、数据预处理 为了能用深度学习来解决现实世界的问题&#xff0c;我们经常从预处理原始数据开始&#xff0c; 而不是从那些准备好的张量格式数据开始。 在Python中常用的数据分析工具中&#xff0c;我们通常使用pandas软件包。 像庞大的Python生态系统中的许多其他扩展包一样…

知识蒸馏——深度学习的简化之道 !!

文章目录 前言 1、什么是知识蒸馏 2、知识蒸馏的原理 3、知识蒸馏的架构 4、应用 结论 前言 在深度学习的世界里&#xff0c;大型神经网络因其出色的性能和准确性而备受青睐。然而&#xff0c;这些网络通常包含数百万甚至数十亿个参数&#xff0c;使得它们在资源受限的环境下&…

中霖教育:注册会计师考试难度大吗?

注册会计师被很多人认为是非常具有挑战性的考试&#xff0c;内容涵盖《会计》《审计》《税法》《经济法》《财务成本管理》《公司战略与风险管理》&#xff0c;考的知识点多而复杂&#xff0c;需要牢牢掌握&#xff0c;所以很多人认为这项考试的难度非常大。 注册会计师考试分…

uniapp使用Echarts图表H5显示正常 打包app显示异常

uniapp使用Echarts在H5页面调试 调试完在H5正常显示 然后通过安卓机调试的时候 发现直接空白了 还有这个爆错 Initialize failed: invalid dom 我有多个图表、图表是通过v-for循环出来的 解决方案 原来是yarn直接安装Echarts 然后改成本地JS文件引入 gitbub文件地址 — dist/…

[python]bar_chart_race绘制动态条形图

最近在 B 站上看到了一个宝藏 up 主&#xff0c;名叫 "Jannchie见齐"&#xff0c;专门做动态条形图相关的数据可视化。 可以看到做出的效果还是很不错的&#xff0c;但工具使用的是 JS&#xff0c;不是 Python&#xff0c;于是尝试搜索了一下&#xff0c;看看 Python…

[C语言]——函数递归

目录 一.什么是递归 1.递归的思想&#xff1a; 二.递归的限制条件 三.递归举例 1.举例1&#xff1a;求n的阶乘 1.1分析和代码实现 1.2画图推演 2.举例2&#xff1a;顺序打印⼀个整数的每⼀位 2.1分析和代码实现 2.2画图推演 四.递归与迭代 1.举例3&#xff1a;求第…

Git全套教程一套精通git.跟学黑马笔记

Git全套教程一套精通git.跟学黑马笔记 文章目录 Git全套教程一套精通git.跟学黑马笔记1.版本管理工具概念2. 版本管理工具介绍2.1版本管理发展简史(维基百科)2.1.1 SVN(SubVersion)2.1.2 Git 3. Git 发展简史4. Git 的安装4.1 git 的下载4.2 安装4.3 基本配置4.4 为常用指令配置…

【机器学习】深入解析线性回归模型

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

STM32CubeMX+freeRTOS+事件组 多任务处理LED和串口打印

摘要:利用CubeMx配置freeeRTOS建立任务并使用事件组实现按键按下时 LED开关和打印信息到串口,上位机接收显示。 验证STM32CubeMx配置的FreeRTOS的任务和事件组使用 方案:按下Key1,绿灯亮或者灭,同时串口打印Key1被按下了到上位机;相关端口和串口配置省略。 新建三个任务…

VMware部署银河麒麟遇到的问题记录

1. 解决VMware Workstation安装VMware Tools显示灰色的办法 1.关闭虚拟机; 2.在虚拟机设置分别设置CD/DVD、CD/DVD2和软盘为自动检测三个步骤; 3.再重启虚拟机,灰色字即点亮。 2.Linux安装vmTool

Linux - 线程互斥和互斥锁

文章目录 前言一、为什么要线程互斥原子性 二、互斥锁互斥锁的创建与销毁互斥锁进行互斥 前言 前几节课&#xff0c;我们学习了多线程的基础概念&#xff0c;这节课&#xff0c;我们来对线程互斥和互斥锁的内容进行学习。 一、为什么要线程互斥 首先我们要明白&#xff0c;对…

Python模块-基础知识

Python模块-基础知识 1.模块分类&#xff1a; &#xff08;1&#xff09;自定义模块&#xff1a; 如果你自己写一个py文件&#xff0c;在文件内写入一堆函数&#xff0c;则它被称为自定义模块&#xff0c;即使用python编写的.py文件 &#xff08;2&#xff09;第三方模块&…

面向对象(C# )

面向对象&#xff08;C# &#xff09; 文章目录 面向对象&#xff08;C# &#xff09;ref 和 out传值调用和引用调用ref 和 out 的使用ref 和 out 的区别 结构体垃圾回收GC封装成员属性索引器静态成员静态类静态构造函数拓展方法运算符重载内部类和分布类 继承里氏替换继承中的…

BM23 二叉树的前序遍历

public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param root TreeNode类 * return int整型一维数组*/public void preorder(List<Integer> list,TreeNode root){if(root null)return;l…