基于Ko-time的Springboot单体化调用链追踪实践

目录

前言

一、关于Ko-Time

1、是什么?

 2、ko-time更新时间线

二、Ko-time怎么用?

1、依赖引入

2、配置集成

3、权限放行

三、链路追踪 

1、系统运行

 2、链路追踪

 3、长时间调用模拟

 总结


前言

        熟悉微服务的老司机一定了解,在微服务模式下,在一次调用链路中,可能设计到多个微服务,如果在线上,某个微服务出现故障,如何快速定位故障所在额微服务呢?解决思路是可以使用链路追踪技。通常在链路追踪领域有以下的一些备选技术,比如可以用由大众点评开源,基于Java开发的实时应用监控平台Cat,包括实时应用监控,业务监控 。集成 方案是通过代码埋点的方式来实现监控,比如: 拦截器,过滤器等。 对代码的侵入性很大,集成成本较高。风险较大。也可以采用韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具Pinpoint。它的特点是支持多种插件,UI功能强大,接入端无代码侵入。 还可以采用本土开源的基于字节码注入的调用链分析以及应用监控分析工具SkyWalking。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前已加入Apache孵化器--开源。

        上述场景是解决微服务的链路追踪的,那么一般采用单体化架构的开发模式时,在小场景下,您是如何定位代码的性能,在出现问题时,是通过log+调用起始时间进行分段汇总吗?这样费时又费力,主要还不直观。那么怎么在Springboot架构下进行单体开发时,快速集成单体化模式下的链路追踪呢?本文介绍一款开源的基于Java开发的监控组件,同时详细讲解如何在你的项目中进行深度集成,最后给出详细的实现案例。不仅方便进行调用链路追踪,还自带可视化UI,甚至有报警配置,喜欢的朋友可以前来看看。

一、关于Ko-Time

1、是什么?

        koTime是一个轻量级的springboot项目性能分析工具,通过追踪方法调用链路以及对应的运行时长快速定位性能瓶颈,ko-time gitee地址。

  • ✅ 实时监听方法,统计运行时长
  • ✅ web展示方法调用链路,瓶颈可视化追踪
  • ✅ 追踪系统异常,精确定位到方法
  • ✅ 接口超时邮件通知,无需实时查看
  • ✅ 线上热更新:无需重启更新代码
  • ✅ 线程管理:线程实时统计与状态查看
  • ✅ 使用简单,无技术学习成本
  • ✅ pom依赖即可,无代码侵入,无多余部署成本

 2、ko-time更新时间线

二、Ko-time怎么用?

1、依赖引入

 <dependency><groupId>cn.langpy</groupId><artifactId>ko-time</artifactId><version>2.4.1</version></dependency><!--阿里云maven仓库更新会慢一两天左右,拉取失败的切换到maven中央仓库-->

2、配置集成

        本次代码集成以ruoyi单体化架构集成为例,ruoyi的配置文件主要配置在yml中,需要进行一定的配置才能运行。官网提供的是基于properties的配置模式,下面提供yml的配置转换,具体代码如下:

ko-time: # 是否开启koTime,默认开启,当为false时,关闭koTime enable: true# 是否开启控制输出,默认falselog-enable: false    # 语言(english/chinese)默认chineselanguage: chinese  # 时间阈值,用于前端展示,大于阈值显示红色,小于阈值显示绿色,默认800threshold: 800.0   # context-path: http://localhost:80 # 前端页面调用接口的上下文环境,无法自动获取时可手动配置,一般情况切记不要配置   v2.0.1开始支持  exception-enable: true # 是否开启异常检测,默认为false,开启后会对方法内部抛出的异常进行统计 v2.0.0开始支持  # 是否开启认证,默认为false,开启后需要登录才能访问调用链路 v2.0.2开始支持auth-enable: false   # 登录用户 v2.0.2开始支持#user-name: admin   # 登录密码 v2.0.2开始支持 #password: 123456  # 使用静态的token值进行认证访问(/koTime?kotoken=xxx) v2.3.7开始支持,该模式和user-name认证模式二选一 #static-token: xxxx # 是否开启入参组合分析 默认开启 v2.0.8开始支持 双击方法节点即可看到效果param-analyse: true  # 启动时是否删除过往数据 默认false v2.2.3开始支持data-reset: false # 调用信息存储线程数(为了不影响项目本身性能,链路存储异步进行),默认2,该值并非越大越好,瓶颈取决于数据库性能和服务器配置,尽可能少占用项目资源为上  v2.2.0-BETA开始支持thread-num: 2 # 丢弃率(0-1) 同一个方法在多次连续调用时,耗时差距并不大,为了存储的IO性能考虑,可以随机丢弃一部分耗时数据。默认30% v2.2.5开始支持discard-rate: 0.3 # 登录超时时间考虑 默认43200s(12个小时) v2.3.0开始支持auth-expire: 43200 # 获取最新版本通知开关 在页面上可以看到 默认true v2.3.3开始支持version-notice: true #需要监测的范围,是链路包含的范围,不仅仅是接口层,参考aop的@pointcutpointcut: execution(public * com.ruoyi.project..*.*(..)) 

        请注意,以上部分参数的值请根据具体的代码进行修改,请不要直接复制,以免造成必须要的误解。比如,在这里ko-time的web-ui访问页面的访问权限我已经设置关闭,实际项目中一定要打开,并且设置一个用户名和密码。在这里可以配置代码的时间阈值,这里采用默认值,单位是毫秒。最后需要注意的是,由于这种单体化切入的模式都是采用AOP模式,因此必须要设置合理的切入点。见配置文件中的pointcut参数配置,这里我选择监控的是com.ruoyi.project下的任意方法。

关于切入配置参考如下:

假设项目的包路径为:

com.huoyo.demo|-controller|-service|-mapper|-others|-other1|-other2|-Test.java

  想要切cn.langpy.demo下面的所有方法(包括子包中的),可以写:

execution(public * com.huoyo.demo..*.*(..)) #切记,是两个点.

只想要切cn.langpy.demo.controller下面的类的所有方法(不包括子包的),可以写:

execution(public * com.huoyo.demo.controller.*.*(..)) #切记,是一个点.

只想要切cn.langpy.demo.others下面的类的所有方法(不包括other1和other2下面的),可以写:

execution(public * com.huoyo.demo.others.*.*(..))

只想要切cn.langpy.demo.others下面的类的所有方法(包括other1和other2),可以写:

execution(public * com.huoyo.demo.others..*.*(..))

如果想排除某些类如Test.class,可以

execution(public * com.huoyo.demo.others..*.*(..)) && !execution(public * com.huoyo.demo.others.Test(..))

3、权限放行

        由于系统配置的权限,因此要在后台系统中将ko-time的访问权限放开。在ShiroConfig中进行配置。

//设置/koTime允许匿名访问
filterChainDefinitionMap.put("/koTime/**","anon");
filterChainDefinitionMap.put("/koTime", "anon");

三、链路追踪 

1、系统运行

        不管是微服务的链路追踪或者单体化链路追踪,其原理都是需要进行服务和接口的调用,所以我们模拟进行服务访问。点击登录和进行一些方法的操作。

 2、链路追踪

        在进行了页面访问之后,在浏览器中输入http://ip:port/koTime就可以访问到链路追踪的web界面。这里就详细的列出了调用信息,比如接口总数,列表,异常列表,线程列表。

 3、长时间调用模拟

为了模拟实际的访问慢的接口,我们在代码中进行了休眠设置(线上代码不建议如此)。

/*** 修改子元素关系* * @param deptId 被修改的部门ID* @param newAncestors 新的父ID集合* @param oldAncestors 旧的父ID集合*/public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors){try {for(int i =0;i<5;i++) {Thread.sleep(200);}} catch (InterruptedException e) {}List<Dept> children = deptMapper.selectChildrenDeptById(deptId);for (Dept child : children){child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));}if (children.size() > 0){deptMapper.updateDeptChildren(children);}}

 总结

        以上就是本文的主要内容,本文介绍一款开源的基于Java开发的监控组件,同时详细讲解如何在你的项目中进行深度集成,最后给出详细的实现案例。不仅方便进行调用链路追踪,还自带可视化UI,甚至有报警配置,喜欢的朋友可以前来看看。更多的功能,希望朋友们一起来挖掘。行文仓促,如有不当之处,欢迎评论区留言批评。

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

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

相关文章

Web端即时通讯技术(SEE,webSocket)

目录 背景简介个人见解被动推送轮询简介实现 长轮询&#xff08;comet&#xff09;简介实现 比较 主动推送长连接&#xff08;SSE&#xff09;简介实现GETPOST 效果 webSocket简介WebSocket的工作原理:WebSocket的主要优点:WebSocket的主要缺点: 实现用法一用法二 **效果** 比较…

学习笔记|大模型优质Prompt开发与应用课(二)|第四节:大模型帮你写代码,小白也能做程序

文章目录 01软件开发产业趋势与技术革新软件开发产业趋势与技术革新技术性人才很受欢迎软件开发产业趋势与技术革新技术门槛越来越低 02 大模型驱动的软件开发需求分析prompt 产品设计开发和测试prompt输出回复promptpromptprompt回复 发布和部署promptprompt 维护和更新prompt…

Docker中的网络

文章目录 网络网桥&#xff08;bridge&#xff09;创建网桥接口hostnonecontaineroverlayoverlay底层原理 网络 网桥&#xff08;bridge&#xff09; 在Docker中&#xff0c;网桥&#xff08;Bridge&#xff09;是一种网络驱动&#xff0c;用于实现Docker容器之间和容器与宿主…

SpringBoot中接口幂等性实现方案-自定义注解+Redis+拦截器实现防止订单重复提交

场景 SpringBootRedis自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数)&#xff1a; SpringBootRedis自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数)_redis防刷_霸道流氓气质的博客-CSDN博客 以下接口幂等性的实现方式与上面博客类似&#xff0c;…

python pygbag教程 —— 在网页上运行pygame程序(全网中文教程首发)

pygame是一款流行的游戏制作模块&#xff0c;经过特殊的方式编译后&#xff0c;可以在浏览器web网页上运行。web上的打包主要使用第三方模块pygbag。 pygame教程&#xff1a;Python pygame(GUI编程)模块最完整教程&#xff08;1&#xff09;_pygame模块详解_Python-ZZY的博客-…

【配置环境】Windows下 VS Code 远程连接虚拟机Ubuntu

一&#xff0c;环境 Windows 11 家庭中文版VMware Workstation 16 Pro &#xff08;版本&#xff1a;16.1.2 build-17966106&#xff09;ubuntu-22.04.2-desktop-amd64 二&#xff0c;关键步骤 Windows下安装OpenSSHVS Code安装Remote - SSH插件 三&#xff0c;详细步骤 在Ubun…

React 前端应用中快速实践 OpenTelemetry 云原生可观测性(SigNoz/K8S)

OpenTelemetry 可用于跟踪 React 应用程序的性能问题和错误。您可以跟踪从前端 web 应用程序到下游服务的用户请求。OpenTelemetry 是云原生计算基金会(CNCF)下的一个开源项目&#xff0c;旨在标准化遥测数据的生成和收集。已成为下一代可观测平台的事实标准。 React(也称为 Re…

Kotlin 内联函数语法之let、apply、also、run、with的用法与详解

一、介绍 kotlin的语法千奇百怪&#xff0c;今天我们将介绍项目中频率使用比较高的几个内联函数。 二、什么叫内联函数&#xff1f; 内联函数 的语义很简单&#xff1a;把函数体复制粘贴到函数调用处 。使用起来也毫无困难&#xff0c;用 inline关键字修饰函数即可。 语法&a…

详解zookeeper安装使用

目录 1.概述 1.1.功能 1.2.特点 1.3.数据结构 2.安装 2.1.Windows 2.2.Linux 3.基础操作 3.1.增 3.2.删 3.3.改 3.4.查 3.5.监听 4.JAVA操作Zookeeper 4.1.依赖 4.2.客户端 4.3.增 4.4.删 4.5.查 4.6.改 1.概述 1.1.功能 zookeeper&#xff0c;Apache旗下…

pdf转换word软件哪个好?式?这款软件帮你轻松实现转换

在工作中&#xff0c;我们常常遇到这样的情况&#xff1a;我们的文件可能是PDF格式的&#xff0c;但对方要求我们以Word形式发送&#xff0c;因为Word相对于PDF占用更小的内存&#xff0c;打开更方便&#xff0c;发送时间更短。这时我们需要将PDF转换为Word格式&#xff0c;然而…

【跨代码仓库合并方案】

1、背景&#xff1a; 1、wiser绑定的uiidA的定制修改内容和ELKO绑定的uiidB基本是一样的&#xff0c;需要手动粘贴同步&#xff0c;增加测试保障风险&#xff0c;还会浪费开发资源投入&#xff1b; 2、施耐德wiser和elko面板两套面板基本一致&#xff0c;但是经过new art升级后…

机器学习深度学习——感知机

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——softmax回归的简洁实现 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们…

市面上的ipad国产触控笔怎么样?精选的性价比电容笔

要知道&#xff0c;真正的苹果品牌的那款原装电容笔&#xff0c;光是一支电容笔就价格近千元。实际上&#xff0c;平替电容笔对没有太多预算的用户是个不错的选择。一支苹果品牌的电容笔&#xff0c;价格是平替品牌的四倍&#xff0c;但电容笔的书写效果&#xff0c;却丝毫不逊…

科技云报道:是时候全员FinOps了吗?

科技云报道原创。 在论坛上&#xff0c;国外某企业的真实案例引发了热议。一开始该企业只顾技术创新&#xff0c;积极上云&#xff0c;不顾成本。 直到有一天&#xff0c;高层介入喊停&#xff1a;“这个云不能再上了&#xff0c;成本已经远大于收益了”。该企业因为成本失控…

java-day01

一&#xff1a;基础常识 软件&#xff1a;按照特定顺序的计算机数据与指令的集合。可分为系统软件&#xff08;如操作系统&#xff09;和应用软件&#xff08;如QQ&#xff09; 人机交互方式&#xff1a;图形化界面&#xff08;GUI&#xff09;与命令行&#xff08;CLI&#…

性能优化 - 前端性能监控和性能指标计算方式

性能优化 - 前端性能监控和性能指标计算方式 前言一. 性能指标介绍1.1 单一指标介绍1.2 指标计算① Redirect(重定向耗时)② AppCache(应用程序缓存的DNS解析)③ DNS(DNS解析耗时)④ TCP(TCP连接耗时)⑤ TTFB(请求响应耗时)⑥ Trans(内容传输耗时)⑦ DOM(DOM解析耗时) 1.3 FP(f…

代码随想录算法训练营第二天| 977

977. 有序数组的平方y 思路&#xff0c;原数组是有序的&#xff0c;但是因为负数平方后可能变无序了&#xff0c;因此利用双指针遍历原数组&#xff0c;比较 nums[left]*nums[left]和nums[right]*nums[right]谁更大&#xff0c;然后对新数组赋值 class Solution {public int…

MFC第二十四天 使用GDI对象画笔和画刷来开发控件(分页控件选择态的算法分析、使用CToolTipCtrl开发动静态提示)

文章目录 GDI对象画笔和画刷来开发控件梯形边框的按钮控件CMainDlg.hCMainDlg.cppCLadderCtrl.hCLadderCtrl.cpp 矩形边框的三态按钮控件 CToolTipCtrl开发动静态提示CMainDlg.hCMainDlg.cppCLadderCtrl.hCLadderCtrl.cpp: 实现文件 矩形边框的三态按钮控件 CToolTipCtrl开发动…

欢乐暑假,华为儿童手表5系列为孩子位置安全保驾护航!

暑假带娃&#xff0c;就像爸妈的练兵场。幸好有 5 系列&#xff0c;离线定位、位置提醒、行为记录等安全守护功能面面俱到、样样精通&#xff0c;陪伴孩子度过悠长假期&#xff0c;也让爸妈长辈更安心更省力&#xff5e; 暑期到了&#xff0c;小朋友们都想出去玩&#xff0c;但…

修改密码和再次确认密码的js和element-ui的使用

<template><div><!-- plan的插槽 --><plan title"修改密码"><!-- 插槽的名字 --><span slot"header">修改密码</span><el-form:model"ruleForm2"status-icon:rules"rules2"ref"rul…