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

ops/2024/10/18 8:34:31/

目录

  • 准备
    • 调整配置
    • 接入多个微服务
      • 网关项目调整
      • 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

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
在这里插入图片描述

接入网关微服务

在这里插入图片描述

  • 在网关上新增配置
-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的一个小问题,需要这样特殊处理一下

skywalkingmysql_78">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 {@AutowiredOrderDao 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.ppmy.cn/ops/6457.html

相关文章

计算机网络(王道考研)笔记个人整理——第一章

第一章 OSI/ISO参考模型 下层向上层服务&#xff0c;每一层次有特定的协议和功能&#xff0c;协议为功能服务&#xff0c;是打包和拆包的过程 物联网淑 慧试用 应用层&#xff1a;所有能和用户交互产生网络流量的程序 典型应用层服务&#xff1a;文件传输&#xff08;FTP&#…

小例子Flask网站开发—args(三)

在Flask当中args充当的角色与任务。 在 Flask 中&#xff0c;args 通常用于从 URL 查询参数中获取值。它主要用在路由函数中&#xff0c;通过 request.args.get() 方法来获取 URL 中的查询参数。以下是一些使用 args 的常见场景&#xff1a;1. 构建动态路由&#xff1a;通过在路…

CSS3 max/min-content及fit-content、fill-available值的详解

c3中对width的值多了几个值&#xff1a;fill-available, max-content, min-content, 以及fit-content。 1.width:fill-available 我们在页面中扔一个没有其他样式的<div>元素&#xff0c;则&#xff0c;此时&#xff0c;该<div>元素的width表现就是fill-availabl…

.NET 发布,部署和运行应用程序

.NET应用发布 发布.Net应用有很多种方式&#xff0c;下面列举三种发布方式&#xff1a; 单文件发布跨平台发布Docker发布 单文件发布 右键工程&#xff0c;选择“发布”&#xff0c;部署模式选择“独立”&#xff0c;目标运行时选择自己想要部署到的系统&#xff0c;我这里用…

Python 数据结构和算法实用指南(二)

原文&#xff1a;zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第四章&#xff1a;列表和指针结构 我们已经在 Python 中讨论了列表&#xff0c;它们方便而强大。通常情况下&#xff0c;我们使用 Python…

03-JAVA设计模式-迭代器模式

迭代器模式 什么是迭代器模式 迭代器模式&#xff08;demo1.Iterator Pattern&#xff09;是Java中一种常用的设计模式&#xff0c;它提供了一种顺序访问一个聚合对象中各个元素&#xff0c;而又不需要暴露该对象的内部表示的方法。迭代器模式将遍历逻辑从聚合对象中分离出来…

OpenCV基本图像处理操作(十一)——图像特征Sift算法

图像尺度空间 在一定的范围内&#xff0c;无论物体是大还是小&#xff0c;人眼都可以分辨出来&#xff0c;然而计算机要有相同的能力却很难&#xff0c;所以要让机器能够对物体在不同尺度下有一个统一的认知&#xff0c;就需要考虑图像在不同的尺度下都存在的特点。 尺度空间的…

gpt能生成ppt吗

gpt能生成ppt吗 GPT是一个高度通用的工具&#xff0c;适用于多种场景和领域&#xff0c;制作ppt只是它强大功能的冰山一角&#xff0c;具体包括&#xff1a; 信息查询与解释&#xff1a; 提供科学、技术、历史、文化等领域的详细解释和背景信息。 解答疑问&#xff0c;帮助…