SpringCloud集成SkyWalking链路追踪并收集日志2

news2025/1/12 11:55:53

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌

博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+MySQL+Vue等前后端分离项目,可以在左边的分类专栏找到更多项目。《Uniapp项目案例》有几个有uniapp教程,企业实战开发。《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦

🍅uniapp微信小程序🍅面试题软考题免费使用,还可以使用微信支付,扫码加群。由于维护成本问题得不到解决,可能将停止线上维护。

点击这里预览

抖音体验版

🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟

Java项目案例《100套》
https://blog.csdn.net/qq_57756904/category_12173599.html
uniapp小程序《100套》

https://blog.csdn.net/qq_57756904/category_12173599.html

有需求代码永远写不完,而方法才是破解之道,抖音有实战视频课程,某马某千等培训都是2万左右,甚至广东有本科院校单单一年就得3万4年就12万学费,而且还没有包括吃饭的钱。所以很划算了。另外博客左侧有源码阅读专栏,对于求职有很大帮助,当然对于工作也是有指导意义等。在大城市求职,你面试来回一趟多多少少都在12块左右,而且一般不会一次性就通过,还得面试几家。而如果你对源码以及微服务等有深度认识,这无疑给你的面试添砖加瓦更上一层楼。

最后再送一句:最好是学会了,而不是学废了!!

2

前言

在上一篇文章skywalking安装教程中我们介绍了skywalking的作用以及如何将其集成到我们的微服务项目中。本篇文章我们介绍在微服务架构中,如何使用skywalking对一次客户端请求进行全链路追踪。

何为全链路追踪?

个人理解:在微服务架构中,一次客户端请求在对应的接口中可能需要通过多次跨服务调用完成,以skywalking安装教程中的项目演示为例,一次成功结束的请求可能需要经过商品微服务、订单微服务以及支付微服务三个服务共同处理,其中商品服务调用订单服务,订单服务调用支付服务。这就是微服务架构的调用链。skywalking通过一个请求上下文将一次客户端请求中涉及到的服务调用进行追踪,列出该调用链中涉及的微服务名微服务中的接口名,这样我们就容易找到对应的接口,查看相应的代码排查遇到的bug问题等

通过skywalking支持全链路追踪,可以将微服务架构中的服务调用转变为实例调用。

全链路追踪

为了方便我们可用启动4个服务,eureka-server、cloud-pay、cloud-order、cloud-goods

微服务逻辑:

1、商品微服务

@Slf4j
@RestController
@RequestMapping("/goods")
public class GoodsController {

    @Value("${server.port}")
    private Integer port;

    private final IOrderClient orderClient;

    public GoodsController(IOrderClient orderClient) {
        this.orderClient = orderClient;
    }

    @GetMapping("/buy")
    public Integer buy(@RequestParam Integer id) {
        log.info("商品服务,服务端口号:{}", port);
        log.info("商品id:{}", id);

        Integer result = orderClient.create(id);
        log.info("下单结果:{}", result);
        if (result == 0) {
            log.info("购买成功");
        } else {
            log.error("购买失败");
        }

        return result;
    }
}

2、订单微服务

@Slf4j
@RestController
@RequestMapping("/order")
public class OrderClient implements IOrderClient {

    @Value("${server.port}")
    private Integer port;

    private final IPayClient payClient;

    public OrderClient(IPayClient payClient) {
        this.payClient = payClient;
    }

    @Override
    @GetMapping("/create")
    public Integer create(@RequestParam("goodsId") Integer goodsId) {
        log.info("订单服务feign接口,服务端口号:{}", port);
        log.info("商品id:{}", goodsId);
        if (goodsId % 2 == 0) {
            log.error("下单失败:商品id为2的倍数");
            return 1;
        }

        Integer result = payClient.pay(goodsId);
        if (result == 0) {
            log.info("支付成功");
        } else {
            log.error("支付失败");
        }
        return result;
    }
}

3、支付微服务

@Slf4j
@RestController
@RequestMapping("/pay")
public class PayClient implements IPayClient {

    @Value("${server.port}")
    private Integer port;

    @GetMapping("/pay")
    @Override
    public Integer pay(@RequestParam("goodsId") Integer goodsId) {
        log.info("支付服务feign接口,服务端口号:{}", port);
        log.info("商品id:{}", goodsId);
        if (goodsId % 3 == 0) {
            log.error("支付失败:商品id为3的倍数");
            return 1;
        }

        if (goodsId % 5 == 0) {
            log.error("支付失败:商品id为5的倍数");
            throw new RuntimeException("支付异常:商品id为5的倍数");
        }
        // 支付成功
        return 0;
    }
}

分别在后面三个微服务中加上logback.xml日志配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>  
    <!-- 控制台输出 -->
    <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>
    <!-- 配置异步记录 AsyncAppender -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="STDOUT"/>
    </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="DEBUG">  
        <appender-ref ref="STDOUT"/> 
        <appender-ref ref="ASYNC"/> 
        <appender-ref ref="grpc-log"/>
    </root>
</configuration>

启动4个服务

刷新Skywalking

在服务集成到skywalking初期,skywalking是无法显示服务中的业务接口的,当我们调用服务中的接口时,对应的接口才会出现在skywalking中

正常调用

正常调用跟异常调用区别在于异常是红色告警,所以我们看下面的异常调用

异常调用

当我们调用商品服务的接口并传入商品id为5时,发现响应状态为500,说明接口中出现异常

我们进入skywalking页面查看该调用链路

首先我们知道此次请求调用的是商品微服务暴露的接口,所以我们进入商品服务查看调用链路

进来后找到对应时间的请求

由图我们可用清晰地看到调用链路中的微服务名(spring.application.name)、接口(请求类型GET、POST、PUT等)。

与前面正常请求的界面不同的是,当接口中出现异常导致响应500时,该链路采用红色重点标记,其调用链中也通过使用红色的点进行标记,方便我们知道异常发生在哪些服务中。

我们点击调用链路的其中一环,如下所示,可以发现,商品服务处理请求的实例为端口号为9527的实例,从中也可以看到异常信息

我们点击接口查看接口日志,下面是GET:/goods/buy

商品服务调用订单服务,我们再点击订单服务中接口请求的一行

订单服务调用支付服务,我们再点击支付服务中接口请求的一行

好了,去消化消化吧

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

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

相关文章

第6章 6.1.1 文本格式化 sprintf函数(MATLAB入门课程)

sprintf函数源自 C 语言标准库中的同名函数&#xff0c;这个函数在 C 语言中用于创建格式化的字符串&#xff0c;且使用频率非常高。作为一门高级编程语言&#xff0c;MATLAB借鉴了 C 语言和其他编程语言中的许多特性和命名惯例。在MATLAB中&#xff0c;sprintf函数主要有两种用…

使用unicloud-map 无法展示poi的天坑

天坑&#xff01;天坑&#xff01;天坑 使用unicloud-map的天坑 202404121722&#xff0c;昨天晚上发现uni-admin中导入了unicloud-map管理端之后在chrome浏览器由于地图定位失败&#xff0c;一直没有办法新增poi,不过后面发现safari浏览器是可以定位出来的&#xff0c;所以今…

大厂Java笔试题之找出组成一个偶数最大的两个素数

题目&#xff1a;找出组成一个大于2的偶数最接近的两个素数。 比如 输入20 输出7 13 注意&#xff1a;这里有一个理论&#xff0c;任意一个大于2的偶数&#xff0c;都能找到2个素数&#xff0c;相加等于这个偶数。 public class Demo10 {public static void main(String[] ar…

python入门(一)配置环境和选择IDE

Python&#xff0c;作为一种简洁易懂的编程语言&#xff0c;近年来在全球范围内受到了广泛的关注和追捧。它不仅语法简单明了&#xff0c;易于上手&#xff0c;而且拥有强大的第三方库和广泛的应用领域。从数据分析、机器学习到Web开发&#xff0c;Python都能发挥出色的性能&am…

Python 全栈体系【四阶】(三十)

第五章 深度学习 四、Tensorflow 8. 模型保存与加载 8.1 什么是模型保存与加载 模型训练可能是一个很长的过程&#xff0c;如果每次执行预测之前都重新训练&#xff0c;会非常耗时&#xff0c;所以几乎所有人工智能框架都提供了模型保存与加载功能&#xff0c;使得模型训练完…

2024年MathorCup数模竞赛B题问题一二三+部分代码分享

inputFolderPath E:\oracle\images\; outputFolderPath E:\oracle\process\; % 获取文件夹中所有图片的文件列表 imageFiles dir(fullfile(inputFolderPath, *.jpg)); % 设置colorbar范围阈值 threshold 120; % 遍历每个图片文件 for i 1:length(imageFiles) % 读…

【NLP练习】调用Gensim库训练Word2Vec模型

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、准备工作 1.安装Gensim库 使用pip安装&#xff1a; !pip install gensim2. 对原始语料分词 选择《人民的民义》的小说原文作为语料&#xff0c;先采用…

12.4.1 实验1:配置CDP

12.4.1 实验1&#xff1a;配置CDP 1、实验目的 通过本实验可以掌握: CDP特征。CDP配置和调试方法。通过CDP查看设备直连邻居信息的方法。 2、实验拓扑 配置CDP的实验拓扑如上图所示。 3、实验步骤 &#xff08;1&#xff09;配置路由器R1 R1(config)#interface serial 0…

js解密心得,记录一次抓包vue解密过程

背景 有个抓包结果被加密了 1、寻找入口&#xff0c;打断点 先正常请求一次&#xff0c;找到需要的请求接口。 寻找入口&#xff0c;需要重点关注几个关键字&#xff1a;new Promise 、new XMLHttpRequest、onreadystatechange、.interceptors.response.use、.interceptors.r…

SpringBoot与MyBatisPlus的依赖版本冲突问题

记录使用SpringBoot和MyBatisPlus时遇到的版本冲突问题解决。 java版本&#xff1a;jdk17 废话&#xff1a;&#xff09;目前在IDEA中使用Spring官方的脚手架最低jdk版本竟然是jdk17了。 当使用SpringBoot3.0版本(3.2.4)&#xff0c;配合使用MP3.5.2版本时报错&#xff1a; Er…

MongoDB的安装和使用

1.MongoDB 安装 1.1 基于Docker安装 docker run --restartalways -d --name mongo -v /opt/mongodb/data:/data/db -p 27017:27017 mongo:4.0.6 1.2 客户端工具使用 MongoDB Compass | MongoDB 2.MongoDB 使用 2.1 引用依赖包 <dependency><groupId>org.sprin…

基于单片机的智能居家火灾报警系统

摘要:采用STC15L2K32单片机设计了一种智能火灾报警系统,它是控制中心与多个不同功能的探测模块构成,实现了一个中心、多点辐射的火灾检测和报警功能。 关键词:智能居家,火灾报警系统,单片机,模块化设计。 0 引言 近些年电子技术、计算机技术为火灾报警系统和灭火系统在…

element-ui的年份范围选择器,选择的年份需等于或小于当前年份,选择的年份范围必须在三年之内

写在前面 日期限制处理&#xff08;禁用&#xff09;&#xff0c;下面我以我这边的需求为例&#xff0c; 选择的年份需等于或小于当前年份 选择的年份范围必须在三年之内 1.限制起始日期小于截止日期 1&#xff09;根据用户选中的开始日期&#xff0c;置灰不可选的日期范围&…

地理空间分析中的深度学习应用

深度学习与地理信息系统 (GIS) 的结合彻底改变了地理空间分析和遥感的格局。这种结合将遥感和地理空间分析领域带到了全球研究人员和科学家的前沿。 深度学习是机器学习的一个复杂子集&#xff08;更多关于机器学习的内容&#xff0c;请参阅我的其他文章&#xff09;&#xff0…

Harmony鸿蒙南向外设驱动开发-Camera

功能简介 OpenHarmony相机驱动框架模型对上实现相机HDI&#xff08;Hardware Device Interface&#xff09;接口&#xff0c;对下实现相机Pipeline模型&#xff0c;管理相机各个硬件设备。 该驱动框架模型内部分为三层&#xff0c;依次为HDI实现层、框架层和设备适配层。各层基…

【c 语言】结构体的定义格式及变量初始化

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

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅳ)其他配置项

vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#xff09;配置项文档 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅱ&#xff09;搜索及数据获取配…

可视化大屏的应用(13):在智慧校园的九项应用

实时数据展示 可视化大屏可以将各类实时数据以图表、图形等形式展示出来&#xff0c;如学生人数、教职工分布、教室使用情况、图书馆座位情况等。通过直观的数据展示&#xff0c;帮助学校管理人员和教职工了解校园的运行状况&#xff0c;及时做出决策和调整。 信息发布与通知 …

BERT论文解读及情感分类实战

文章目录 简介BERT文章主要贡献BERT模型架构技术细节任务1 Masked LM&#xff08;MLM&#xff09;任务2 Next Sentence Prediction (NSP)模型输入 下游任务微调GLUE数据集SQuAD v1.1 和 v2.0NER 情感分类实战IMDB影评情感数据集数据集构建模型构建超参数设置训练结果注意事项 简…

MES实施优势有哪些?MES制造执行系统的主要内容

各个行业之间也开始进入到了激烈的竞争当中&#xff0c;很多企业为了能够有效提升企业竞争力&#xff0c;都会通过提升自身实力的方式来提升竞争力。一些制造业也会在经营过程当中使用到MES系统&#xff0c;那么&#xff0c;mes系统的优势有哪些呢&#xff1f; 1、优化企业现场…