《springcloud alibaba》 六 微服务链路跟踪skywalking

news2024/11/15 17:05:54

目录

  • 准备
    • 调整配置
    • 接入多个微服务
      • 网关项目调整
      • order-seata项目
      • stock-seata项目
      • 测试
    • 接入网关微服务
  • skywalking持续化到mysql
  • 自定义链路跟踪
    • pom .xml
    • orderController
    • OrderService
    • OrderDao
    • OrderTblMapper.xml
    • 测试
  • 性能剖析
  • 日志
    • tid打印
      • pom.xml
      • logback-spring.xml
      • 日志收集
      • 启动项目

随着业务规模的不断的增大, 系统的复杂度也越来越高, 我们的软件架构也进入到了分布式的阶段, 服务按照不同的维度进入到了分布式的阶段, 服务按照不同的维度进行拆分, 每一次的请求可能跨越多个微服务, 这样就导致我们每一次请求都有可能出现异常. 传统的日志监控方式无法满足调用链路追踪, 这就导致定位/诊断服务异常变得异常复杂.
在这里插入图片描述

准备

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

webapp: Ul 前端(web 监控页面)的jar 包和配置文件;
oap-libs: 后台应用的 jar 包,以及它的依赖 jar 包,里边有一个 server-starter-.jar 就是启动程序;
config: 启动后台应用程序的配置文件,是使用的各种配置
。bin: 各种启动脚本,一般使用脚本 startup.来启动 web 页面 和对应的 后台应用
。oapService.“:默认使用的后台程序的启动脚本;(使用的是默认模式启动,还支持其他模式,各模式区别见 启动模式)。oapservicelnit.”:使用 init 模式启动;在此模式下,OAP服务器启动以执行初始化工作,然后退出oapServiceNolnit,
:使用 no init模式启动;在此模式下,OAP服务器不进行初始化。
webappService.
:Ul 前端的启动脚本:
。startup.:组合脚本,同时启动 oapService.:、webappService.* 脚本;
’agent:
。skywalking-agent.jar: 代理服务jar 包
config: 代理服务启动时使用的配置文件
。plugins:包含多个插件,代理服务启动时会加载改目录下的所有插件(实际是各种 jar 包),比-SiringCloud Gateway,则需要把对应的 jar 包拷贝到 plugins

调整配置

在这里插入图片描述

  • 修改webapp.yml
    在这里插入图片描述
    在这里插入图片描述

启动成功后会启动两个服务,一个是skywalking-oap·server,一个是skywalking-web·ui: 8868skywalking-oap-sen2服务启动后会暴露11800 和 12800 两个端口,分别为收集监控数据的端口11800和接受前端请求的端口12800,修改端口可以修改config/applicaiton.yml

接入多个微服务

输入localhost:8868,可以接入skywalking管理界面,
在这里插入图片描述
在这里插入图片描述

  • 在这三个项目上改造

网关项目调整

在这里插入图片描述

  • 改为order-seata项目的服务名

order-seata项目

下载客户端收集的jar

  • 注意: 很多文章没有说明

idea启动调整

-javaagent:D:\system\apache-skywalking-java-agent-8.10.0\skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=OrderSeata -Dskywalking.collector.backend_service=127.0.0.1:11800
  • Dskywalking.agent.service_name 服务名
  • -Dskywalking.collector.backend_service 暴露的端口
  • -javaagent:D:\system\apache-skywalking-java-agent-8.10.0\skywalking-agent/skywalking-agent.jar 是上面解压后的路径

stock-seata项目

idea启动调整

-javaagent:D:\system\apache-skywalking-java-agent-8.10.0\skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=StockSeata -Dskywalking.collector.backend_service=127.0.0.1:11800

测试

记得启动nacos、seata、sentinel服务端
访问项目http://127.0.0.1:8088/order-service/order/add
在这里插入图片描述

  • 到这里说明,skywalking集成微服务算成功咯

接入网关微服务

在这里插入图片描述

  • 在网关上新增配置
-javaagent:D:\system\apache-skywalking-java-agent-8.10.0\skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=api-service -Dskywalking.collector.backend_service=127.0.0.1:11800

先访问http://127.0.0.1:8088/order-service/order/add接口
在这里插入图片描述

  • 就显示了一个api-service得服务,但是对应的请求日志没有显示, why? 什么情况
  • api-service这个服务我都是刷新几次后,才显示,估计是有延迟。

找到下载解压后agent包
在这里插入图片描述
移动到如下目录下
在这里插入图片描述再重新启动 我们在测试的三个项目
在这里插入图片描述
现在显示访问记录,gateway的一个小问题,需要这样特殊处理一下

skywalking持续化到mysql

默认使用h2存储,也就是所谓的存在内存中,服务重启后,记录就会丢失
在这里插入图片描述

在这里插入图片描述
修改成mysql
在这里插入图片描述
在这里插入图片描述

  • 修改mysql的账号和密码,以及url地址

在这里插入图片描述

  • 创建数据库,表会自动创建
    D:\system\apache-skywalking-apm-9.0.0\apache-skywalking-apm-bin\bin
    启动startup.bat,正常启动成功后,skywalking是有两个窗口的,但是这里启动后,会关闭skywalking-collector,说明这个服务报错咯
    在这里插入图片描述
    来到log日志查看原因
    在这里插入图片描述
    在这里插入图片描述
  • 有没有看着很熟悉的感觉?
    初步定位,感觉就是缺少mysql驱动导致的。

在这里插入图片描述

  • 随机找一个幸运儿项目,找到mysql驱动
    在这里插入图片描述
  • 把对应的jar,放到该目录下面,重启bin
    在这里插入图片描述
  • 对应的数据库会自动创建很多的表
    在这里插入图片描述
  • 记得这三个项目也要重新启动,不然,不会加载到skywalking里面去
    在这里插入图片描述
    访问http://127.0.0.1:8088/order-service/order/add,出现请求路径。
    这时,我们再重启一下服务,看看,数据是否存在,如果存在,则说明mysql持久化成功
    在这里插入图片描述

自定义链路跟踪

在这里插入图片描述

  • 在order-seata项目上,新增链路跟踪代码

pom .xml

  <!--skywalking自定义链路跟踪-->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
            <version>9.0.0</version>
        </dependency>
  • 注意跟下载的skywalking版本一直,我下载的是9.0.0版本的,所以,写这个版本,不然,会有一些奇奇怪怪的问题

orderController

 /**
     * 获取id获取数据
     * @param id
     * @return
     */
    @RequestMapping("/get")
    public OrderTbl get(Integer id){
        return  orderService.get(id);
    }

OrderService

package com.lcs.springcloud.service;

import com.lcs.springcloud.dao.OrderDao;
import com.lcs.springcloud.entity.OrderTbl;
import org.apache.skywalking.apm.toolkit.trace.Tag;
import org.apache.skywalking.apm.toolkit.trace.Tags;
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderService {

    @Autowired
    OrderDao orderDao;

    public void insert(OrderTbl orderTbl) {
        orderDao.insert(orderTbl);
    }

    /**
     * 获取id获取数据
     * @param id
     * @return
     */
    @Trace
    @Tags({
            @Tag(key = "id", value = "arg[0]"),
            @Tag(key = "order", value = "returnedObj")
    })
    public OrderTbl get(Integer id) {
        return orderDao.get(id);
    }
}

OrderDao

package com.lcs.springcloud.dao;

import com.lcs.springcloud.entity.OrderTbl;
import org.springframework.stereotype.Repository;

@Repository
public interface OrderDao {

    void insert(OrderTbl orderTbl);

    /**
     * 根据id获取数据
     * @param id
     * @return
     */
    OrderTbl get(Integer id);
}

OrderTblMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lcs.springcloud.dao.OrderDao">

    <!-- 主键自增长的插入 -->
    <insert id="insert" parameterType="com.lcs.springcloud.entity.OrderTbl" useGeneratedKeys="true" keyProperty="id">
        insert into order_tbl(product_id,total_amount,statu) values(
                                                                                   #{product_id},
                                                                                   #{total_amount},
                                                                                   #{statu}
                                                                               );
    </insert>

    <select id="get" resultType="com.lcs.springcloud.entity.OrderTbl">
        select * from order_tbl where id = #{id}
    </select>
</mapper>

测试

访问http://127.0.0.1:8088/order-service/order/get?id=12
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • id和order就是我们定义的名称,通过这里可以看到对应的传参以及返回值

性能剖析

controller的代码调整

    /**
     * 获取id获取数据
     * @param id
     * @return
     */
    @RequestMapping("/get")
    public OrderTbl get(Integer id) throws InterruptedException {
        //延迟2秒
        TimeUnit.SECONDS.sleep(2);
        return  orderService.get(id);
    }
  • 新增一个延迟2秒的代码,重新启动项目
    在这里插入图片描述
  • trace 是看界面
  • profile 是分析
    在这里插入图片描述
  • 新建一个任务
    在这里插入图片描述
    在这里插入图片描述
  • 奇葩问题,一直没有分析报告生成,搞不懂为什么
  • 还没有删除的入口,服了

日志

tid打印

pom.xml

  <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-logback-1.x</artifactId>
            <version>9.0.0</version>
        </dependency>

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 日志输出格式 -->
    <property name="FILE_LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] %green(%-5level) [%thread] %yellow([%tid]) %cyan(%logger{50}) : %msg%n" />

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 默认日志打印的格式 -->
        <!--<encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf-8</charset>
        </encoder>-->
        <!-- 配置了skywalking的traceId的日志打印的格式 -->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <Pattern>${FILE_LOG_PATTERN}</Pattern>
            </layout>
        </encoder>
    </appender>
    <!-- 异步输出 控制台 -->
    <appender name="ASYNC_STDOUT" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>256</queueSize>
        <appender-ref ref="STDOUT"/>
    </appender>

    <root level="info">
        <appender-ref ref="ASYNC_STDOUT"/>
    </root>
</configuration>


  • 配置logback并在日志中打印traceId,在日志输出格式中添加%tid即可
    启动项目
    在这里插入图片描述

日志收集

最后配置日志收集,需要在logback的配置文件中再添加一个appender

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod=" 5 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.mdc.TraceIdMDCPatternLogbackLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="STDOUT"/>
    </appender>


    <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%n</Pattern>
            </layout>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="grpc-log" />
        <appender-ref ref="ASYNC"/>
    </root>
</configuration>

启动项目

在这里插入图片描述

-javaagent:D:\system\apache-skywalking-java-agent-9.0.0\skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=OrderSeata -Dskywalking.collector.backend_service=127.0.0.1:11800
  • idea中配置
    在这里插入图片描述
  • 记得调整上面的时间,不然有时候不显示数据,这设计有点坑

项目代码

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

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

相关文章

2024年MathorCup数学应用挑战赛C题思路分析(妈妈杯)

2024年第十四届MathorCup数学应用挑战赛C题解析 文章目录 题目概览第一问&#xff1a;货量预测第二问&#xff1a;运输线路变化的预测第三问&#xff1a;单目标优化第四问&#xff1a;排班计划的优化 MATLAB代码框架货量预测人员排班 2024年的MathorCup数学应用挑战赛再次为我…

硬盘分区无法访问,数据恢复与防范全攻略

当我们尝试打开某个硬盘分区时&#xff0c;有时会遇到分区无法访问的困扰。这不仅让我们无法读取分区内的文件&#xff0c;还可能导致重要数据的丢失。面对这种情况&#xff0c;我们该如何应对呢&#xff1f;本文将详细解析硬盘分区无法访问的原因&#xff0c;并给出两种有效的…

加速度JUSDO | 电子元器件商城行业调研及运营方案

一、行业背景与竞品分析 随着电子元器件行业的快速发展&#xff0c;线上元器件商城已成为行业交易的重要渠道。目前市场上存在多个知名的元器件商城&#xff0c;如立创、云汉芯城、贸泽商城等&#xff0c;它们都提供了丰富的元器件产品和便捷的线上交易服务。 立创商城&#x…

构建第一个ArkTS应用之stateStyles:多态样式

Styles和Extend仅仅应用于静态页面的样式复用&#xff0c;stateStyles可以依据组件的内部状态的不同&#xff0c;快速设置不同样式。这就是我们本章要介绍的内容stateStyles&#xff08;又称为&#xff1a;多态样式&#xff09;。 概述 stateStyles是属性方法&#xff0c;可以…

Web前端 Javascript笔记1

为什么学习 JavaScript? JavaScript 是 web 开发人员必须学习的 3 门语言中的一门&#xff1a; HTML 定义了网页的内容CSS 描述了网页的布局JavaScript 控制了网页的行为 JavaScript 是可插入 HTML 页面的编程代码。 JavaScript 插入 HTML 页面后&#xff0c;可由所有的现代浏…

Qt实现XYModem协议(一)

1 概述 Kermit文件运输协议提供了一条从大型计算机下载文件到微机的途径。它已被用于进行公用数据传输。 其特性如下: Kermit文件运输协议是一个半双工的通信协议。它支持7位ASCII字符。数据以可多达96字节长度的可变长度的分组形式传输。对每个被传送分组需要一个确认。Kerm…

【剪映专业版】05常见视频专业术语

视频课程&#xff1a;B站有知公开课【剪映电脑版教程】 视频格式与编码 剪映支持导出MP4、MOV格式 视频分辨率与像素 常见分辨率&#xff1a;1080P 1080P&#xff1a;日常剪辑可用&#xff0c;日常拍摄时选择该分辨率 4K&#xff1a;比如演唱会大屏 剪映支持导出&#xff…

Ubuntu安装VMVare Workstation pro 17.5.1

由于需要装Kali&#xff0c;我电脑是Ubuntu单系统&#xff0c;所以只能使用linux版本的虚拟机&#xff0c;通过这种方式来安装虚拟机和Kali镜像。 参考CSDN博客资料&#xff1a;https://blog.csdn.net/xiaochong0302/article/details/127420124 github代码资料&#xff1a;vm…

less+rem+媒体查询布局(主流)

rem适配布局 一.rem基础二.媒体查询1.概念2.语法&#xff08;1&#xff09;.mediatype查询类型&#xff08;2&#xff09;.关键字&#xff08;3&#xff09;.媒体特性&#xff08;4&#xff09;.应用 3.媒体查询rem实现元素动态大小变化4.引入资源&#xff08;针对不同媒体查询…

学习MQ异步

1.MQ异步调用的优势 事件驱动模式&#xff1a; 优势&#xff1a; 总结&#xff1a; 2.初识MQ 核心概念以及结构&#xff1a; 常见的消息模型&#xff1a; 基本消息队列模型&#xff1a; 生产者代码&#xff1a; Testpublic void testSendMessage() throws IOException, Timeo…

图片尺寸在线修改怎么改?修改图片方法详解

图片尺寸在线修改怎么改&#xff1f;在数字化时代&#xff0c;图片尺寸的调整与修改已成为我们日常生活和工作中不可或缺的一部分。无论是为了满足特定平台的上传要求&#xff0c;还是为了提升图片的视觉效果&#xff0c;对图片尺寸进行在线修改都显得尤为重要。本文将详细介绍…

推荐系统学习记录——数据稀疏性衡量

在推荐系统中&#xff0c;数据稀疏性通常通过计算用户-物品交互矩阵的稀疏度来衡量。用户-物品交互矩阵是一个二维矩阵&#xff0c;其中行表示用户&#xff0c;列表示物品&#xff0c;矩阵中的每个元素表示用户对物品的交互情况&#xff08;如评分、点击、购买等&#xff09;&a…

专访云仓酒庄《综合品酒师》培训带领酒水行业专业与形象新篇章

在春意盎然的季节里&#xff0c;云仓酒庄成功举办了首届《综合品酒师》培训&#xff0c;吸引了业界的广泛关注。本次培训不仅为酒水行业注入了新的活力&#xff0c;更在提升行业专业性和形象方面迈出了坚实的步伐。我们有幸采访到了云仓酒庄的负责人&#xff0c;就此次培训的背…

使用DNSTOP进行DNS流量分析

一、前言 dnstop 是一个用于监听和解析 DNS 流量的实用工具。它可以帮助您监视网络中的 DNS 查询&#xff0c;并提供有关域名、IP 地址、查询类型等信息的实时统计。 当我们在分析DNS 服务器日志时&#xff0c;想去了解哪些用户在使用DNS 服务器&#xff0c;同时也希望对DNS …

完美提升Stable Diffusion生成质量和效率!UniFL:统一反馈学习框架(字节中山)

文章链接&#xff1a;https://arxiv.org/pdf/2404.05595 git链接&#xff1a;https://uni-fl.github.io/ 扩散模型已经彻底改变了图像生成领域&#xff0c;导致高质量模型和多样化的下游应用不断涌现。然而&#xff0c;尽管取得了重大进展&#xff0c;当前竞争性解决方案仍然存…

李廉洋;4.12现货黄金,美原油最新走势分析及策略。

现货黄金在美盘末将历史新高刷至2377美元/盎司。美国3月份PPI指数较上年同期上升2.1%&#xff0c;为11个月来的最高增幅&#xff0c;这份数据加之此前火爆的CPI指数&#xff0c;为美联储实现2%目标所面临的坎坷之路奠定了基础。不过&#xff0c;PPI报告中的细节让担心通胀再度加…

【Go语言快速上手(一)】 初识Go语言

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Go语言专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; Go快速上手 1. 前言2. Go语言简介(为…

spring Task 定时任务

导入maven坐标 spring-context&#xff08;已存在&#xff09; <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.34</version> <!-- 请根据需要选择合适的版本 -->…

考研数学|660对比真题的难度如何?有必要做比660再难的题吗?

660整体难度属于基础阶段到强化阶段。而且是选填部分的题目&#xff0c;所以还是要做一些其他题 然后说一下推荐的习题册&#xff1a;基础不好先做1800、强化之前660&#xff0c;强化可选880/1000题。 首先&#xff0c;传统习题册存在的一个问题是题量较大&#xff0c;但难度波…