七、搭建springCloudAlibaba2021.1版本分布式微服务-skywalking9.0链路追踪

前言

链路追踪介绍

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

  • 如何串联整个调用链路,快速定位问题?
  • 如何澄清各个微服务之间的依赖关系?
  • 如何进行各个微服务接口的性能分析?
  • 如何追踪各个业务流程的调用处理顺序?

Skywalking介绍

Skywalking是一个国产的开源框架,2015年有吴晟个人开源,2017年加入Apache孵化器,国人开源的产品,主要开发人员来自于华为,2019年4月17日Apache董事会批准SkyWalking成为顶级项目,支持Java、.Net、NodeJs等探针,数据存储支持Mysql、Elasticsearch等,跟Pinpoint一样采用字节码注入的方式实现代码的无侵入,探针采集数据粒度粗,但性能表现优秀,且对云原生支持,目前增长势头强劲,社区活跃。
Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等。

链路追踪框架对比

目前市面上开源的APM系统主要有CAT、Zipkin、Pinpoint、SkyWalking,大都是参考Google的Dapper实现的

功能和技术方案对比

  • Zipkin是Twitter开源的调用链路分析工具,目前基于Spingcloud sleuth得到了广泛的应用,特点是轻量,部署简单。
  • Pinpoint:一个韩国团队开源的产品,运用了字节码增强技术,只需要在启动时添加启动参数即可,对代码无侵入,目前支持Java和PHP语言,底层采用HBase来存储数据,探针收集的数据粒度非常细,但性能损耗大,因其出现的时间较长,完成度也很高,应用的公司较多
  • Skywalking是本土开源的基于字节码注入的调用链路分析以及应用监控分析工具,特点是支持多种插件,UI功能较强,接入端无代码侵入。
  • CAT是由国内美团点评开源的,基于Java语言开发,目前提供Java、C/C++、Node.js、Python、Go等语言的客户端,监控数据会全量统计,国内很多公司在用,例如美团点评、携程、拼多多等,CAT跟下边要介绍的Zipkin都需要在应用程序中埋点,对代码侵入性强。

下载

APM包下载地址: https://skywalking.apache.org/downloads/

这边下载的是 v9.0.0 版本

APM 全称为: Application Performance Management (应用程序性能监视工具),下载的APM包里面就已经包含了skywalking 服务端和UI前端,UI前端是一个web项目,用于展示链路追踪的数据;

注意事项:skywalking在8.8.0版本以后将agent单独拆分了出来,所以若要使用8.8.0版本以后的,需要下载apm和agent两个压缩包。因为我选择的是9.0.0版本。刚刚已经下载了apm包,所以还需要在下载 agent 的压缩包,

agent包下载地址:https://dlcdn.apache.org/skywalking/java-agent/8.11.0/apache-skywalking-java-agent-8.11.0.tgz

将这2个文件下载完并且解压缩后会得到2个目录:

  • apache-skywalking-apm-bin
  • skywalking-agent

配置

打开 .\apache-skywalking-apm-bin\config\application.yml 文件

skywalking-web-ui服务会占用 8080 端口, 修改端口可以修改webapp/webapp.yml

启动成功后会启动两个服务,一个是skywalking-oap-server,一个是skywalking-web-ui,
skywalking-oap-server服务启动后会暴露11800 和 12800 两个端口:

  • 11800 :收集监控数据的端口
  • 12800:接受前端请求的端口

修改端口可以通过 config/applicaiton.yml 文件来修改

agent 配置

修改探针默认配置 skywalking-agent/config/agent.config

# 将127.0.0.1修改为OAP所在的ip地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}# 默认值为:-1 (全量收集链路),在访问量较少时,链路全量收集不会对系统带来太大负担,能够完整的观测到系统的运行状况。但是在访问量较大时,全量的链路收集,对链路收集的客户端(agent探针)、服务端(SkyWalking OAP)、存储器(例如说 Elastcsearch)都会带来较大的性能开销,甚至会影响应用的正常运行。在访问量级较大的情况下,往往会选择抽样采样,只收集部分链路信息。agent.sample_n_per_3_secs 配置项,设置每 3 秒可收集的链路数据的数量。
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:1}

通过docker安装skywalking 9.0.0

docker中,服务端和 ui是分开的,所以需要安装2个docker

# 服务端docker run --name oap --restart always -d -p 11800:11800 -p 12800:12800 apache/skywalking-oap-server:9.0.0# Ui 端
docker run --name oap-ui --restart always -d -e SW_OAP_ADDRESS=http://192.168.31.250:12800 -p 8880:8080 apache/skywalking-ui:9.0.0

启动

根据系统不同,windows双击 startup.bat,linux 通过命令 nohup ./startup.sh & 后台运行

因为我用的windows,启动后会开启2个黑窗口

在浏览器输入地址: http://localhost:8080 即可访问 skywalking

追踪测试

准备2个服务,user 服务 和 order 服务,通过openfeign远程调用,

order 服务的controller层代码如下


import com.alibaba.cloud.client.OpenFeignOrderClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/open/feign")
public class OpenFeignController  {@Autowiredprivate OpenFeignOrderClient openFeignOrderClient;/*** 调用远程openFeign 接口* @return*/@RequestMapping("/getOrderList")public String getOrderList() {return openFeignOrderClient.getOrderList();}
}

openFeign 接口 ,将此文件放到公共模块,user和order服务都引用这个公共模块;

import com.alibaba.cloud.fallback.OpenFeignFallBack;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;@FeignClient(value = "order-demo",path = "order",fallback = OpenFeignFallBack.class)
public interface OpenFeignOrderClient {/*** 获取订单列表* @return*/@RequestMapping("/getOrderList")String getOrderList();
}

降级回调处理,也放到公共模块中

import com.alibaba.cloud.client.OpenFeignOrderClient;
import org.springframework.stereotype.Component;/*** 降级回调类*/
@Component
public class OpenFeignFallBack implements OpenFeignOrderClient {@Overridepublic String getOrderList() {return "openFeign远程调用暂时不可用,可能的原因是远程服务未开启,或者是远程服务超时或者报错导致";}
}

order服务添加一个controller,实现openFeign接口,其中,通过代码int i=1/0;来抛出异常,


import com.alibaba.cloud.client.OpenFeignOrderClient;
import com.alibaba.cloud.dto.UserDto;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/order")
public class OrderController implements OpenFeignOrderClient {// openFeign 的实现接口@Overridepublic String getOrderList() {int i=1/0;return "get Order list success! ";}
}

在启动前,两个服务都需要添加vm参数

user
-javaagent:D:\java\skywallking\skywalking-agent\skywalking-agent.jar
-Dskywalking.agent.service_name=user_app

order
-javaagent:D:\java\skywallking\skywalking-agent\skywalking-agent.jar
-Dskywalking.agent.service_name=order_app

skywalking-agent.jar 是什么文件

刚刚我们不是下载了2个压缩包吗,skywalking-agent.jar这个文件就在另一个压缩包内

启动user服务和order服务

启动后,在skywalking上就可以看到这2个服务了

在浏览器访问地址http://localhost:8089/open/feign/getOrderList, 毫无疑问,报错了,因为有降级路基,所以页面上直接显示了友好提示,

但order服务确实是报错了

接下来我们进入到user服务的链路追踪

然后切换到 Topology 页,这里可以看直观地看到服务之间的调用关系,第一个User表示是客户端,谁调用谁都能看的很清楚; 但是必须先调用过之后 skywalking 才知道是谁调用的谁,没调用的话,是看不到他们之间的关系的,右上角有个调用深度,可以查看最多5级调用,因为我这边只有3个,所以调整到3就够了

然后切换到 Trace 页,这里才是真正的链路追踪,可以看到每个服务之间调用的 controller 层接口; 红色表示报错的接口,蓝色表示正常访问的接口;

然后点击最下面的controller 链接,就可以看到抛出的具体异常了

除零异常,跟order的控制台报的错误是一样一样的

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

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

相关文章

深入理解大语言模型生成参数:temperature、top\_k、top\_p 等全解析

在使用大语言模型(如 GPT-4、LLaMA、ChatGLM 等)进行文本生成任务时,很多开发者会面对各种“生成参数”,如 temperature、top_k、top_p、repetition_penalty 等。这些参数虽然看起来抽象,但掌握它们的意义和配置技巧&a…

vulhub Web Machine(N7)靶场攻略

下载地址: https://download.vulnhub.com/webmachine/Web-Machine-N7.ova 使用方法: 靶场下载好以后不用解压,需要使用Oracle VirtualBox虚拟机打开,用VMware会报错。安装Oracle VirtualBox虚拟机时安装地址不能随便选择&#…

【机器学习深度学习】模型微调:多久才算微调完成?——如何判断微调收敛,何时终止训练

目录 前言 一、微调过程的目标:优化模型表现 二、微调需要多久? 微调时间无法确定 三、如何判断微调何时收敛? 3.1 观察Loss的下降趋势 3.2 损失值趋于平稳,意味着收敛 如何识别收敛? 3.3 验证Loss的波动&…

红队视角:实战渗透测试中漏洞利用的进阶技巧与防御

红队作为渗透测试的 “攻击方”,其核心价值不仅在于发现漏洞,更在于挖掘漏洞的深度利用方式 —— 通过绕过防护措施、组合低危漏洞形成攻击链,暴露企业真实安全风险。从红队视角解析漏洞利用的进阶技巧,既能帮助防御方理解攻击思路…

OpenHarmony BUILD.gn中执行脚本

在OpenHarmony编译构建中笔者经常遇到这样的场景——需要执行sh脚本完成某些操作。笔者将OpenHarmony BUILD.gn中执行脚本的方法分享如下: 前置知识点 1.能够把自定义的子系统加入OpenHarmony源码的编译构建,请参考:https://ost.51cto.com/…

QUIC协议如何在UDP基础上解决网络切换问题

一、UDP 四元组的本质局限UDP 本身无连接状态,其数据包仅通过四元组寻址。但 QUIC 在 UDP 之上构建了完整的连接语义。二、QUIC 的连接迁移核心机制1. 连接标识符(Connection ID)关键设计:每个 QUIC 连接拥有全局唯一 64-bit Conn…

力扣131:分割回文串

力扣131:分割回文串题目思路代码题目 给你一个字符串 s,请你将 s 分割成一些 子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 思路 从题目中我们可以总结出这道题的三个需要解决的问题: 如何判断回文串如何找到一种方案里的所…

代驾小程序系统开发:引领出行行业数字化转型

随着数字技术的飞速发展,出行行业正经历着深刻的数字化转型。代驾小程序系统作为这一转型的重要推手,以其高效、便捷、智能的特点,引领着出行行业向数字化、网络化、智能化方向发展。一、数字化管理,提升运营效率代驾小程序系统通…

数独求解器与生成器(回溯算法实现)

摘要本毕业设计旨在利用MATLAB技术实现一个基于回溯算法的数独求解器与生成器。通过深入分析数独游戏的规则和回溯算法的原理,设计并实现了数独求解的核心算法,同时开发了数独生成功能,能够生成符合规则的有效数独谜题。系统采用MATLAB图形用…

[数据结构]#7 哈希表

哈希表(Hash Table),有时也称为散列表,是一种数据结构,它提供了一种快速存取数据的方法。哈希表利用一个被称为哈希函数的机制将键映射到表中的一个位置来直接访问记录,以此加快查找的速度。哈希表通常支持…

C++ 23种设计模式-工厂模式

工厂模式是一种创建型的设计模式,他提供了一种创建对象的最佳方式,而无需指定将要创建对象的具体类。包括:简单工厂模式、工厂方法模式、抽象工厂模式。简单工厂模式组成成员:抽象产品类、具体产品类 A、B、C等、工厂类工作原理&a…

vue3 el-table 行的某个特定值来决定某些列是否显示

在 Vue 3 中使用 Element Plus 的 <el-table> 组件时&#xff0c;如果你想要根据行的某个特定值来决定某些列是否显示&#xff0c;你可以通过自定义列渲染函数&#xff08;render 函数&#xff09;来实现这一需求。下面是一个如何实现该功能的步骤说明和示例代码。步骤 1…

电商数据采集API与爬虫技术结合的全网比价方案

一、技术选型与工具准备API优先策略官方API接入&#xff1a;京东、淘宝、拼多多等平台提供商品详情API&#xff0c;需注册开发者账号获取API Key。例如&#xff1a;京东API支持实时获取商品价格、库存、评价数据。淘宝API通过RESTful接口返回JSON格式的商品信息&#xff0c;需O…

Socket详解

一.定义Socket&#xff08;套接字&#xff09;是网络编程的核心&#xff0c;它允许不同主机或同一主机的不同进程之间进行通信&#xff0c;Socket API 提供了一套标准的接口&#xff0c;支持 TCP、UDP、IP 等协议分为以下三个类型&#xff1a;SOCK_STREAM: 用于tcp协议&#xf…

如何实现打印功能

一、AI赋能提供思路基本框架<!-- 隐藏的打印内容&#xff08;默认不显示&#xff09; --> <div id"print-container" style"display: none;"><h1>退货单打印内容</h1><table><!-- 打印专用的表格结构 --></table&g…

Android 架构演进:从 MVC 到 MVVM 的设计之道

在 Android 开发初期&#xff0c;很多开发者会把所有逻辑塞进 Activity—— 网络请求、数据处理、UI 更新全堆在一起&#xff0c;导致代码超过数千行&#xff0c;改一个按钮点击都要翻半天。这种 “面条式代码” 的根源是缺乏架构设计。随着应用复杂度提升&#xff0c;MVC、MVP…

使用 gh-pages 将 next.js15 静态项目部署到 github pages

以下我使用 next.js15 写的 Todo List 为例,假设我们本地已经存在一个 next.js15 的 Todo List 项目。 说明:解决了项目部署到 github pages 后访问不到 css、js、字体以及访问不到 public 目录下的图片问题。 第一步 安装 gh-pages: npm i gh-pages第二步 在 public 目…

rename系统调用及示例

21. rename - 重命名文件或目录 函数介绍 rename系统调用用于重命名文件或目录&#xff0c;也可以将文件或目录移动到另一个位置。如果目标文件已存在&#xff0c;则会被替换。 函数原型 #include <stdio.h>int rename(const char *oldpath, const char *newpath);功能 将…

PHP框架之Laravel框架教程:3. 数据库操作(简要)

3. 数据库操作&#xff08;简要&#xff09; 配置 数据库的配置文件在 config/database.php 文件中&#xff0c;你可以在这个文件中定义所有的数据库连接配置&#xff0c;并指定默认的数据库连接。这个文件中提供了大部分 Laravel 能够支持的数据库配置示例。 mysql > [driv…

项目七.AI大模型部署

环境准备此处使用的是rock linux8.9操作系统k8s集群三个设备&#xff0c;使用centos7.9操作系统设备配置##上传ollama工具的压缩包 [rootproject ~]# ll total 1497732 -rw-r--r-- 1 root root 1533674176 Jul 21 11:27 ollama-linux-amd64.tgz [rootproject ~]# tar -C /usr -…