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

目录

  • 准备
    • 调整配置
    • 接入多个微服务
      • 网关项目调整
      • 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中配置
    在这里插入图片描述
  • 记得调整上面的时间,不然有时候不显示数据,这设计有点坑

项目代码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity类银河恶魔城学习记录12-7-2 p129 Craft UI - part 2源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_CraftWindow.cs using UnityEngine.UI; using TMPro; using UnityEngin…

OpenCV轻松入门(七)——HSV颜色模型图像特效案例:判断白天夜晚抠图颜色过滤替换背景图

HSV模型解释 HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。 这个模型中颜色的参数分别是&#xff1a; 色调&#xff08;H&#xff09;饱和度&#xff08;S&#xff09;明度&#xff08;V&…

为什么不用低代码平台制作网站,套用这11个商城主题模板,让程序员解放双手

随着人工智能技术的迅猛发展&#xff0c;众多复杂工作变得愈发简便。二十年前&#xff0c;构建一个在线商城并处理支付交易是一项艰巨任务&#xff0c;而正是在那个时代&#xff0c;零售巨头淘宝和京东崭露头角。如今&#xff0c;我们迎来了新时代&#xff0c;众多高效工具应运…

Dinov2 + Faiss 图片检索

MetaAI 通过开源 DINOv2&#xff0c;在计算机视觉领域取得了一个显着的里程碑&#xff0c;这是一个在包含1.42 亿张图像的令人印象深刻的数据集上训练的模型。产生适用于图像级视觉任务&#xff08;图像分类、实例检索、视频理解&#xff09;以及像素级视觉任务&#xff08;深度…

看完不会来揍我 | 孟德尔随机化(二)—— 代码实操 | 附代码注释 + 结果解读

最近真的是超超超超超超超级多的小伙伴们在咨询孟德尔随机化相关的问题和课程&#xff0c;意想不到的那种多&#xff01;那我怎么办嘞&#xff01;整呗&#xff01;主打的就是一个宠粉&#xff01; 关于孟德尔随机化&#xff0c;我们之前就已经在孟德尔随机化&#xff08;一&am…

PHP学习(二)

一、php 数据类型之查看和判断数据类型 查看数据类型 1.gettype(传入一个变量) 能够获得变量的类型 2.var_dump(传入一个变量) 输出变量类型和值 <?php //声明一个变量 88.8 $f 88.8; $type gettype($f); echo $type; ?> <?php //多换几个类型试试 $str 你…

【wu-framework-parent】官网介绍

官网地址 介绍 springboot 版本3.2.1 wu-framework-parent 是一款由Java语言开发的框架&#xff0c;目标不写代码但是却能完成功能。 框架涵盖无赖ORM( wu-framework-lazy-orm-spring-starter)、仿生组件 、easy框架系列【Easy-Excel、easy-listener、easy-upsert】 授权框架…

数字乡村创新实践探索农业现代化与农村治理现代化新路径:科技赋能农村全面振兴与农民幸福生活

目录 引言 一、数字乡村与农业现代化 1、智慧农业技术的应用 2、农业产业链的数字化转型 二、数字乡村与农村治理现代化 1、农村信息化水平的提升 2、农村治理模式的创新 三、科技赋能农村全面振兴与农民幸福生活 1、提升农业生产效益与农民收入 2、促进农村产业结构…

[每周一更]-第93期:探索大型生成式聊天工具:从ChatGPT到未来

随着人工智能技术的不断进步&#xff0c;生成式聊天工具正逐渐成为人们日常生活中的一部分。这些工具利用深度学习技术和大规模语言模型的强大能力&#xff0c;能够与用户进行自然、流畅的对话&#xff0c;为我们提供了更加智能和个性化的交流体验。 ChatGPT&#xff1a;开启生…

mac电脑软件 Magnet v2.14.0免激活中文版

Magnet是一款窗口管理工具&#xff0c;适用于Mac操作系统。它可以帮助用户轻松地管理和组织多个应用程序的窗口&#xff0c;提高工作效率。 Magnet支持多种窗口布局和组合方式&#xff0c;可以将窗口分为左右、上下、四分之一等不同的比例和位置&#xff0c;用户可以根据实际需…

Linux:Redis7.2.4的简单在线部署(1)

注意&#xff1a;我写的这个文章是以最快速的办法去搭建一个redis的基础环境&#xff0c;作用是为了做实验简单的练习&#xff0c;如果你想搭建一个相对稳定的redis去使用&#xff0c;可以看我下面这个文章 Linux&#xff1a;Redis7.2.4的源码包部署&#xff08;2&#xff09;-…

测试人必看,小程序常见问题

小程序是一种轻盈的存在&#xff0c;用户无需为了使用它而下载和安装。它依附于微信这个强大的平台&#xff0c;只需轻轻一扫或一搜&#xff0c;它便跃然屏上&#xff0c;随时服务。小程序为我们带来更多前所未有的惊喜和便利&#xff0c;以下分享关于小程序相关的热门问题。 …

Adaptive Influence Maximization in DynamicSocial Networks

Abstract 为了通过社交网络传播信息和思想&#xff0c;种子策略旨在找到一小部分能够最大化影响力传播的种子用户&#xff0c;这被称为影响力最大化问题。尽管有大量的工作研究了这个问题&#xff0c;但现有的播种策略仅限于静态社交网络。事实上&#xff0c;由于数据传输速度快…

即席查询笔记

文章目录 一、Kylin4.x1、Kylin概述1.1 定义1.2 Kylin 架构1.3 Kylin 特点1.4 Kylin4.0 升级 2、Kylin 环境搭建2.1 简介2.2 Spark 安装和部署2.3 Kylin 安装和部署2.4 Kylin 启动环境准备2.5 Kylin 启动和关闭 3、快速入门3.1 数据准备3.2 Kylin项目创建入门3.3 Hive 和 Kylin…

【详细讲解下Photoshop】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

如何远程连接电脑?

远程连接电脑是一种技术&#xff0c;能够使用户在不同地点的电脑之间建立连接&#xff0c;实现互相访问和控制的功能。这项技术为我们提供了便利和效率&#xff0c;使得随时随地的协同办公、异地统一管理和远程数据采集管理成为可能。 【天联】的使用场景 远程连接电脑的应用非…

澳大利亚游戏音效巨头 Firelight Technologies 全面采用 Helix Core,助力打造热门游戏音效

Firelight Technologies 是一家总部位于澳大利亚墨尔本的公司&#xff0c;主营业务是电子游戏的音乐和音效制作&#xff0c;像《极限竞速》系列、《Roblox》和《我的世界》等爆款游戏的音效就出自该公司。其行业领先的工具 FMOD 为团队提供了一个强大的平台&#xff0c;用于实现…

Maven超详细使用

定义 是一款用于管理和构建java项目的工具 作用 1. 依赖管理 2. 统一项目结构 3. 项目构建 项目目录结构 POM 项目对象模型 (Project Object Model) POM (Project Object Model) &#xff1a;指的是项目对象模型&#xff0c;用来描述当前的maven项目。 仓库 本地仓库&#…

【大语言模型】基础:余弦相似度(Cosine similarity)

余弦相似度是一种用来确定两个向量之间相似性的度量。它在数据科学、信息检索和自然语言处理&#xff08;NLP&#xff09;等多个领域被广泛使用&#xff0c;用于度量在多维空间中两个向量之间角度的余弦。这个指标捕捉的是方向上的相似性而非大小&#xff0c;使其非常适合比较长…

前端页面显示时间与数据库时间差8小时

环境 jdk11mysql 8.0docker部署的 问题 突然发现页面上的数据比数据库的时间差了八个小时&#xff0c;然后我就开始排查问题。 首先看数据库的信息&#xff0c;发现时间都是没错的。 然后看一下ymal文件&#xff0c;是否是数据源链接写的有问题。 spring:datasource:url:…