微服务链路追踪-SkyWalking

news2024/11/16 20:26:11

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

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

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

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

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

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

二、链路追踪组件之SkyWalking

(1)是什么是SkyWalking

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

(2)SkyWalkIng与ZipKin对比

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

ZipKin:Twitter公司开源的一个分布式追踪工具,被Spring Cloud Sleuth集成,使用广泛而稳定。

ZIpKIn优缺点:

优点:轻量级,springcloud集成,使用人数多,成熟。

缺点:侵入性,功能简单,欠缺APM报表能力(能力弱)。

Sleuth的作用是在系统中自动埋点并把数据发送给zipkin,zipkin的作用是存储这些数据并展现。

SkyWalking:中国人吴晟(华为)开源的一款分布式追踪,分析,告警的工具,现已属于Apache旗下开源项目。

SkyWalking 优缺点:

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

缺点:较为新兴,成熟度不够高。

(3) SkyWalking 组成部分

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

Platform backend :平台后端,对应于zipkin server,可以集群部署,聚合,分析,将数据展示在UI中。

Storage:存储,可扩展的存储,可以使es,H2,MySQL集群默认 h2。

UI :丰富的可视化功能,提供身份验证。

仪表盘:对项目的监控,看项目是如何运转的,链路过程情况。拓扑图:就是整个图形的演示。追踪:就是碰到一些问题。告警:碰到问题的告警。

官网架构图一:

官网架构图二:

三、SkyWalkIng的部署及使用

我们去官网下载es7-8.1.0 版本,下载界面如下:

解压之后,Windows环境中启动startup.bat,Linux环境中启动startup.sh即可(通过jps命令查看)。

 (1)本地开发部署探针处理(IDEA部署)

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

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

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

那么探针在哪里来呢?

Java Agent 服务器探针:

解压后,Java Agent 所处的位置在解压后文件夹

apache-skywalking-apm-es7-8.1.0\apache-skywalking-apm-bin-es7\agent 目录下:

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

-javaagent:D:\skywalking\agent\skywalking-agent.jar 
-Dskywalking.agent.service_name=demo 
-Dskywalking.collector.backend_service=localhost:11800

启动项目后,我们再来看一下SKyWalkIng管理UI端(http://localhost:8080),有信息,则说明探针部署成功了。

(2)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 -Dskywalking.collector.backend_service=localhost:11800 
-jar springcloud-demo-0.0.1-SNAPSHOT.jar

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

拉取镜像

docker pull elasticsearch:7.6.2

指定单机启动

注:通过ES_JAVA_OPTS设置ES初始化内存,否则在验证时可能会起不来

docker run --restart=always -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
--name='elasticsearch' --cpuset-cpus="1" -m 2G -d elasticsearch:7.6.2

验证es安装成功

浏览器地址栏输入:http://IP:9200/

可以安装 kibana 一起使用

2、部署Skywalking OAP

拉取镜像

docker pull apache/skywalking-oap-server:8.1.0-es7

启动Skywalking OAP

注:–link后面的第一个参数和elasticsearch容器名一致;

-e SW_STORAGE_ES_CLUSTER_NODES:es7也可改为你es服务器部署的Ip地址,即ip:9200

docker run -d --name skywalking-oap \
--restart=always \
-e TZ=Asia/Shanghai \
-p 12800:12800 \
-p 11800:11800 \
--link elasticsearch:elasticsearch \
-e SW_STORAGE=elasticsearch7 \
-e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 \
apache/skywalking-oap-server:8.1.0-es7
3、部署Skywalking UI

拉取镜像

docker pull apache/skywalking-ui:8.1.0

启动Skywalking UI

注:–link后面的第一个参数和skywalking OAP容器名一致;

docker run -d --name skywalking-ui \
--restart=always \
-e TZ=Asia/Shanghai \
-p 8088:8080 \
--link oap:oap \
-e SW_OAP_ADDRESS=oap:12800 \
apache/skywalking-ui:8.1.0
4、应用程序配合Skywalking Agent部署

构建基础镜像,将我们的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.1.0/apache-skywalking-apm-es7-8.1.0.tar.gz /app

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

RUN ls /app


docker build -t base/skywalking:1.0 .

构建服务镜像 order-demo

FROM base/skywalking:1.0
 
COPY springcloud-order-1.0.jar /app/app.jar
 
EXPOSE 9002

ENTRYPOINT [“java”,
“-javaagent:/app/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=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  .
5、通过挂载的方式(推荐)

在启动脚本中把把服务器上的agent文件挂载在容器内部

-v /usr/local/apache-skywalking/agent/:/app/agent/  \

在Dockerfile文件中添加启动参数

ENTRYPOINT ["java", "-javaagent:/app/agent/skywalking-agent.jar","-Dskywalking.collector.backend_service=IP:11800","-Dskywalking.agent.service_name=order-demo"]
(4)k8s方式部署探针处理

先在服务器中部署elasticsearch用来做存储,在oap中修改以es来做存储方式。

1、创建skywalking-oap的yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: skywalking-oap
  namespace: default
  labels:
    app: skywalking-oap
spec:
  replicas: 1
  selector:
    matchLabels:
      app: skywalking-oap
  template:
    metadata:
      labels:
        app: skywalking-oap
    spec:
      containers:
	    - env:
         - name: SW_STORAGE
		   value: elasticsearch7  ##存储方式
		 - name: SW_STORAGE_ES_CLUSTER_NODES
		   value: 10.0.24.5:9200 ##es地址
          name: skywalking-oap
          image: apache/skywalking-oap-server:8.1.0-es7  ##镜像
          imagePullPolicy: IfNotPresent ##如果存在就不拉去取
          ports:
            - containerPort: 11800
              name: grpc
            - containerPort: 12800
              name: rest
---
apiVersion: v1
kind: Service
metadata:
  name: skywalking-oap
  namespace: default
  labels:
    service: skywalking-oap
spec:
  ports:
    - port: 12800
      name: rest
    - port: 11800
      name: grpc
  selector:
    app: skywalking-oap
2、创建skywalking-ui的yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: skywalking-ui
  namespace: default
  labels:
    app: skywalking-ui
spec:
  replicas: 1
  selector:
    matchLabels:
      app: skywalking-ui
  template:
    metadata:
      labels:
        app: skywalking-ui
    spec:
      containers:
        - name: skywalking-ui
          image: apache/skywalking-ui:8.1.0
          ports:
            - containerPort: 8080
              name: page
          env:
            - name: SW_OAP_ADDRESS
              value: skywalking-oap:12800 ##skywalking-oap监听端口
---
apiVersion: v1
kind: Service
metadata:
  name: skywalking-ui
  namespace: default
  labels:
    service: skywalking-ui
spec:
  ports:
    - port: 8080
      name: page
      nodePort: 30200
  type: NodePort
  selector:
    app: skywalking-ui
3、k8s中部署 skywalking-oap.yaml、skywalking-ui.yaml
kubectl create -f skywalking-oap.yaml
kubectl create -f skywalking-ui.yaml

4、k8s 部署项目增加skywalking链路追踪(通过挂载的方式)
apiVersion: extensions/v1beta1 #版本
kind: Deployment  #资源类型
metadata:
  labels:
    workload.user.cattle.io/workloadselector: deployment-cloud-web-monitor  #标签,k8s对于资源控制主要是根据labels和selector进行的
  name: web-monitor  #资源名称
  namespace: deafult #所属命名空间
spec:
  progressDeadlineSeconds: 600  
  replicas: 1  #一个pod
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      workload.user.cattle.io/workloadselector: deployment-cloud-web-monitor
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate #发布策略
  template:    #创建模板
    metadata:
      labels:
        workload.user.cattle.io/workloadselector: deployment-cloud-web-monitor
    spec:
      containers:
      - env:
        - name: JAVA_OPTS
          value: -Xmx3550M -Xms3550M -Xmn2G -Xss256k
		- name: SKYWALKING_OPTS
          value: -javaagent:/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=web-monitor -Dskywalking.collector.backend_service=skywalking-oap:11800
        image: 192.1.1.1/project/web-monitor:stable  #镜像
        imagePullPolicy: Always  #镜像拉取策略
        name: web-monitor   #容器名称
        ports:
        - containerPort: 8513  #暴露端口
          name: 8513tcp02
          protocol: TCP
        resources:
          limits:
            memory: 4Gi
        stdin: true
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        tty: true
        volumeMounts:  #容器内挂载点
        - mountPath: /log
         name: vol1
- mountPath: /skywalking/agent/    #挂载在容器内的路径
         name: skywalking
      dnsPolicy: ClusterFirst
      restartPolicy: Always  #重启策略
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:  
      - name: vol1
        persistentVolumeClaim: #挂载的pvc
          claimName: log-pvc
      - name: skywalking  
        hostPath:
path:/usr/local/apache-skywalking/agent/   #宿主机挂载点

K8s快速生成yaml模板文件

kubectl create deployment nginx --image=nginx -o yaml --dry-run > mynginx.yaml
或者
kubectl get deploy nginx -o=yaml --export > mynginx2.yaml

四、配置SkyWalking日志收集(logback为例)

pom 中依赖 SkyWalking 的 logback 插件包:

<!-- SkyWalking log collection -->
<dependency>
  <groupId>org.apache.skywalking</groupId>
  <artifactId>apm-toolkit-logback-1.x</artifactId>
  <version>8.1.0</version>
</dependency>

添加或修改 logback.xml,启用 SkyWalking 提供的 appender,示例配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">

  <appender name="stdout" 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{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
          </layout>
      </encoder>
  </appender>

  <appender name="grpc" 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%n</Pattern>
          </layout>
      </encoder>
  </appender>
  
  <root level="INFO">
      <appender-ref ref="stdout"/>
      <appender-ref ref="grpc"/>
  </root>
</configuration>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity】Transform、Rigidbody、CharacterController移动

前言 在使用Unity开发的时候&#xff0c;移动是最最基础的一个需求&#xff0c;我来给大家简单的讲一下Unity中的几种常见的移动方法。 1.Transform移动 Transform移动就是修改物体的position ①修改位置 这里要注意&#xff1a;坐标分为世界坐标和本地坐标 //将物体的世界坐…

完整的通过git命令框和windows窗口将本地文件上传到gitee远程仓库流程步骤

1.下载git 这个网站搜索git官方&#xff0c;去下载就行了 2.打开git安装后的Git Bash命令框 3.在Git Bash命令框设置一下要远程链接的gitee账号 git config --global user.name “名字”Git config --global user.email “邮箱” 4.查看一下账号设置 git config --global -…

【Datawhale组队学习:Sora原理与技术实战】使用KAN-TTS合成女生沪语音频

Sambert-Hifigan模型介绍 拼接法和参数法是两种Text-To-Speech(TTS)技术路线。近年来参数TTS系统获得了广泛的应用&#xff0c;故此处仅涉及参数法。 参数TTS系统可分为两大模块&#xff1a;前端和后端。 前端包含文本正则、分词、多音字预测、文本转音素和韵律预测等模块&am…

Maven深入了解

Maven深入了解 前言一、Maven的核心概念1.1 Maven-Jar包模块化管理1.2 POM1.3 坐标及其命名规范1.4 仓库的概念1.5 生命周期1.6 插件和目标 二、依赖管理2.1 自己写的模块和模块之间也可以互相依赖2.2 依赖的生效范围(scope标签)2.3 依赖的传递性2.4 依赖冲突问题2.5 依赖的排除…

【刷题节】美团2024年春招第一场笔试【技术】

1.小美的平衡矩阵 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int[][] nums new int[n][n], sum new int[n][n];char[] chars;for (int i 0; i < n; i) {…

Prompt Engineering(提示工程)

Prompt 工程简介 在近年来&#xff0c;大模型&#xff08;Large Model&#xff09;如GPT、BERT等在自然语言处理领域取得了巨大的成功。这些模型通过海量数据的训练&#xff0c;具备了强大的语言理解和生成能力。然而&#xff0c;要想充分发挥这些大模型的潜力&#xff0c;仅仅…

【Python】新手入门学习:详细介绍单一职责原则(SRP)及其作用、代码示例

【Python】新手入门学习&#xff1a;详细介绍单一职责原则&#xff08;SRP&#xff09;及其作用、代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyT…

【深度学习】YOLOv9继续训练——断点训练方法

YOLOv9继续训练主要分为两个情况&#xff1a; 其一、训练过程中意外中断&#xff0c;未完成训练预期的epoch数量&#xff1b; 其二、训练完了&#xff0c;但是未收敛&#xff0c;在这个基础上&#xff0c;还想用这个权重、学习率等参数继续训练多一些轮次 一、训练过程中意外…

梦百合将在深圳展发布定制新品牌“榀至”

3月17日,下午2点,蓄势已久的梦百合定制品牌发布会将在深圳时尚家居设计周暨深圳国际家具设计展隆重召开!这将是梦百合旗下定制品牌——“榀至”的首度亮相! 发布会主题为“0压升级定制生活”,诠释着梦百合0压生活方式的拓展和延伸。 作为0压概念的提出者、0压绵专利的拥有者,十…

CMOS低噪声运算放大器D721-D722-D724对比分析

一 应用领域 D721、D722、D724是芯谷科技推出的三款低噪声、轨至轨运算放大器芯片&#xff0c;其中D721为单运放&#xff0c;D722为双运放&#xff0c;D724为四运放。适合用于音频领域、传感器等的信号放大处理&#xff0c;比如K歌宝、音响、测距、滤波器、AD转换器前级信号处…

OWASP TOP 10漏洞原理和应对策略

1. 注入 当将不受信任的数据作为命令或查询的一部分发送到解释器时&#xff0c;会发生注入缺陷&#xff0c;例如SQL&#xff0c;NoSQL&#xff0c;OS和LDAP注入。攻击者的敌对数据可能会诱使解释器执行未经预期的命令或未经适当授权而访问数据。 2. 失效的身份验证 与身份验…

通过日志恢复sql server数据库

在SQL Server中&#xff0c;通过日志恢复数据库是一个精细的过程&#xff0c;主要用于在数据库出现错误、数据丢失或需要回滚到特定时间点时恢复数据。以下是一般步骤概述&#xff1a; 设置恢复模式&#xff1a; 首先&#xff0c;数据库必须配置为“完整恢复模式”或“大容量…

基于深度学习的图像去雨去雾

基于深度学习的图像去雨去雾 文末附有源码下载地址 b站视频地址&#xff1a; https://www.bilibili.com/video/BV1Jr421p7cT/ 基于深度学习的图像去雨去雾&#xff0c;使用的网络为unet&#xff0c; 网络代码&#xff1a; import torch import torch.nn as nn from torchsumm…

人工智能迷惑行为大赏——需求与科技的较量

目录 前言 一、 机器行为学 二、人工智能迷惑行为的现象 三、产生迷惑行为的技术原因 四、社会影响分析 五、解决措施 总结 前言 随着ChatGPT热度的攀升&#xff0c;越来越多的公司也相继推出了自己的AI大模型&#xff0c;如文心一言、通义千问等。各大应用也开始内置…

Netty架构详解

文章目录 概述整体结构Netty的核心组件逻辑架构BootStrap & ServerBootStrapChannelPipelineFuture、回调和 ChannelHandler选择器、事件和 EventLoopChannelHandler的各种ChannelInitializer类图 Protocol Support 协议支持层Transport Service 传输服务层Core 核心层模块…

多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测

多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测 目录 多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现VMD-CN…

软件测试面试都问了什么?中级软件测试岗面试(4面)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 一面&#xff08;…

Excel判断CD两列在EF两列的列表中是否存在

需求 需要将CD两列的ID和NAME组合起来&#xff0c;查询EF两列的ID和NAME组合起来的列表中是否存在&#xff1f; 比如&#xff0c;判断第二行的“123456ABC”在EF的第二行到第四行中是否存在&#xff0c;若存在则显示Y&#xff0c;不存在则显示N 实现的计算公式 IF(ISNUMBER…

全视智慧机构养老解决方案,以科技守护长者安全

2024年2月28日凌晨1时许&#xff0c;在上海浦东大道的一家养护院四楼杂物间内发生了一起火灾事故。尽管火势不大&#xff0c;过火面积仅为2平方米&#xff0c;但这场小火却造成了1人死亡和3人受伤的悲剧。这一事件再次提醒我们&#xff0c;养老院作为老年人聚集的场所&#xff…

阿里云免费证书改为3个月,应对方法很简单

情商高点的说法是 Google 积极推进90天免费证书&#xff0c;各服务商积极响应。 情商低点的话&#xff0c;就是钱的问题。 现在基本各大服务商都在2024年停止签发1年期的免费SSL证书产品&#xff0c;有效期都缩短至3个月。 目前腾讯云倒还是一年期。 如果是一年期的话&#x…