java agent设计开发概要
agent开发设计
agent 开发的一些心得,适合熟悉agent或者有agent开发需求的同学
1 有个基础的agent,是java 标准的agent。这是agent代码入口
2 设计包结构,
基础agent
agent下有plugin,加载plugin可以自己定义一个类加载器
plugin:插件定义具体的模块功能module,module是要加入到业务的类加载器中,因为是和业务相关的具体功能
module: 具体对业务增强的jar包
conf: 一些配置文件

3 设计类加载机制
plugin 有独立的Plugin加载器,加载plugin定义
module 会被添加到系统类加载器或者bootstrap加载器中
spring boot的项目需要对JarLauncher进行字节码增强
bootstrap层module: 将module jar放入bootstrap层类加载器完成字节码增强,具体的业务功能放到系统类加载器。
也就是有2个module,一个bootstrap层的字节码增强module,一个是具体业务的系统类加载器层module。bootstrap层module通过类加载器去加载系统类加载器层的业务module
类加载机制架构图:

4 module 功能扩展手段
4.1. 通过spi扩展机制,像spring boot dubbo都有spi扩展机制
4.2. 将开源的jar包通过类加载机制添加到业务类加载器中,相当于无侵入帮助用户完成pom文件依赖。如果代码不满足需求,可以修改源码后,在将修改后的jar加载到类加载器
4.3. 使用字节码增强工具进行字节码增强
5 独立日志设计
要有自己的独立日志打印,最好不要用log4j logback这类框架,因为可能和业务的日志打印出现冲突。
可以使用java.util.logging.Logger ,但是只能打印到控制台日志,和业务日志混合在一起了。
6 依赖包独立
agent内部依赖的公共工具包,需要通过maven-shade-plugin 插件进行打包,这样避免业务和agent使用了同一个包的不同版本,导致冲突
代码上能不依赖外部包就不依赖外部。
7 版本适配
agent作为一个公共的agent,使用agent的业务系统可能有很多不同的版本。适配的module jar也是有所不同的。
这里需要在plugin里对业务所使用的版本(dubbo/spring boot等)做个判断,根据不同的版本依赖不同的module jar
判断业务使用框架的版本: 像dubbo spring boot都有对应的Version类,如果没有Version类的,可以通过判断某个版本有某个类来判断。
8 字节码增强工具选择
asm :成熟的开源框架
bytekit:arthas内部使用的字节码工具,可以支持注解使用,屏蔽了字节码操作细节。首选
在进行字节码增强时,可以将业务逻辑直接植入字节码。也可以字节码增强去调用另外的静态方法,在静态方法里面做具体业务逻辑。
9 字节码增强延时机制设计
addTransformer(transformer,false)。只有在类首次加载时,才会触发transform进行字节码增强
addTransformer(transformer,true)。可以通过inst.retransformClasses进行再次增强,再次增强也是有限制,增强的类不能有对类基本结构(增加/修改/删除字段或方法,方法返回值不能被修改),否则增强失败。
可以在一定时间(保证业务启动成功后),调用retransformClasses 进行二次增强,用以避免增强前类就已经被加载过了。
10 热加载/卸载
字节码增强的功能: 可以通过retransformClasses 二次增强,进行热加载。redefineClasses 可以重新定义类字节码,可以把原始字节码重新加载。重新定义类不能有对类基本结构(增加/修改/删除字段或方法,方法返回值不能被修改),否则失败。
spi 扩展的功能: 没法进行热加载和协助,因为这部分是由应用启动的时候进行加载的。可以加开关,将开关配置下发来动态控制功能是否生效
采坑:
-
agent使用的第三方公共包和业务使用的第三方公共包有版本冲突,使用maven-shade-plugin 解决
-
有时候日志打印不出来,因为agent使用的日志包和业务的有冲突
-
和定时任务saturn框架有冲突。因为saturn框架是采用独立lib加载的方式,在对saturn lib下的类进行字节码增强后,saturn lib下的类没有办法找到在系统类加载器的agent 类。典型案例就是skywalking agent
-
agent增强某个类,这个类已经被加载过了,增强就不生效了。多个agent对同个类进行增强时,经常有这个问题
-
有个节点偶发性出现jvm异常导致pod重启,重启1-2次后正常
agent 的增强和jfr机制在并发下有bug
加入io.lettuce.core.jfr=false 解决
参考:
jdk jfr bug:https://bugs.openjdk.org/browse/JDK-8249009
lettuce jfr: https://github.com/lettuce-io/lettuce-core/wiki/Connection-Events
相关文章:
java agent设计开发概要
agent开发设计 agent 开发的一些心得,适合熟悉agent或者有agent开发需求的同学 1 有个基础的agent,是java 标准的agent。这是agent代码入口 2 设计包结构, 基础agent agent下有plugin,加载plugin可以自己定义一个类加载器 plugin࿱…...
node.js笔记-模块化(commonJS规范),包与npm(Node Package Manager)
目录 模块化 node.js中模块的分类 模块的加载方式 模块作用域 向外共享模块作用域中的成员 向外共享成员 包与npm(Node package Manager) 什么是包? 包的来源 为什么需要包? 查找和下载包 npm下载和卸载包命令 配置np…...
Linux 磁盘坏块修复处理(错误:read error: Input/output error)
当磁盘出现坏块时,你对所关联的文件进行读取时,一般会出现 read error: Input/output error 这样的错误。 反过来讲,当你看到 read error: Input/output error 这种错误时,很大可能就是磁盘出现了坏块问题。 解决步骤:…...
API 面试四连杀:接口如何设计?安全如何保证?签名如何实现?防重如何实现?
下面我们就来讨论下常用的一些API设计的安全方法,可能不一定是最好的,有更牛逼的实现方式,但是这篇是我自己的经验分享. 一、token 简介 Token:访问令牌access token, 用于接口中, 用于标识接口调用者的身份、凭证,减…...
操作系统题目收录(六)
1、某系统采用基于优先权的非抢占式进程调度策略,完成一次进程调度和进程切换的系统时间开销为1us。在T时刻就绪队列中有3个进程P1P_1P1、P2P_2P2和P3P_3P3,其在就绪队列中的等待时间、需要的CPU时间和优先权如下表所示。若优先权值大的进程优先获…...
2023年十款开源测试开发工具推荐!
今天为大家奉献一篇测试开发工具集锦干货。在本篇文章中,将给大家推荐10款日常工作中经常用到的测试开发工具神器,涵盖了自动化测试、性能压测、流量复制、混沌测试、造数据等。 1、AutoMeter-API 自动化测试平台 AutoMeter 是一款针对分布式服务&…...
MySQL慢查询分析和性能优化
1 背景我们的业务服务随着功能规模扩大,用户量扩增,流量的不断的增长,经常会遇到一个问题,就是数据存储服务响应变慢。导致数据库服务变慢的诱因很多,而RD最重要的工作之一就是找到问题并解决问题。下面以MySQL为例子&…...
C++学习笔记(四)
组合、继承。委托(类与类之间的关系) 复合 queue类里有一个deque,那么他们的关系叫做复合。右上角的图表明复合的概念。上图的特例表明,queue中的功能都是通过调用c进行实现(adapter)。 复合关系下的构造和…...
【4】深度学习之Pytorch——如何使用张量处理时间序列数据集(共享自行车数据集)
表格数据 表格中的每一行都独立于其他行,他们的顺序页没有任何关系。并且,没有提供有关行之前和行之后的列编码信息。 表格类型的数据是指通过表格的形式表示的数据,它以行和列的方式组织数据。表格中的每一行代表一个数据项,每…...
mulesoft MCIA 破釜沉舟备考 2023.02.10.01
mulesoft MCIA 破釜沉舟备考 2023.02.10.01 1. What is a defining charcateristic of an integration-Platform-as-a-Service(iPaaS)?2. An application deployed to a runtime fabric environment with two cluster replicas is designed to periodically trigger of flow f…...
干货 | PCB拼板,那几条很讲究的规则!
拼板指的是将一张张小的PCB板让厂家直接给拼做成一整块。一、为什么要拼板呢,也就是说拼板的好处是什么?1.为了满足生产的需求。有些PCB板太小,不满足做夹具的要求,所以需要拼在一起进行生产。2.提高SMT贴片的焊接效率。只需要过一…...
笔试题-2023-思远半导体-数字IC设计【纯净题目版】
回到首页:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 推荐内容:数字IC设计学习比较实用的资料推荐 题目背景 笔试时间:2022.08.20应聘岗位:数字IC设计工程师笔试时长:90min笔试平台:牛客网题目类型:填空题(2道),不定项选择题(3道),单选题(2道),问…...
canvas根据坐标点位画图形-canvas拖拽编辑单个图形形状
首先在选中图形的时候需要用鼠标右击来弹出选择框,实现第一个编辑节点功能 在components文件夹下新建右键菜单 RightMenu文件: <template><div v-show"show" class"right-menu" :style"top:this.ypx;left:this.xpx…...
JavaEE 初阶 — 确认应答机制
文章目录确认应答机制(安全机制)1 什么是后发先至问题1 如何解决后发先至问题确认应答机制(安全机制) 确认应答 是实现可靠传输的最核心机制。 这里指的 可靠传输 不是说 100% 可以把消息发给接收方,而是尽力而为&…...
0207 事件
事件监听事件监听版本事件类型事件概念事件在编程时系统内发生的动作或者发生的事情例子点击按钮鼠标经过拖拽鼠标事件监听(注册事件,绑定事件)让程序员检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应…...
SpringBoot整合Swagger
目录 一、swagger介绍 二、springboot集成swagger 1、创建一个springboot-web项目 2、导入相关依赖 3、编写一个Hellow工程 4、配置swagger --->config 5、启动springboot工程 6、配置swagger信息 7、配置swagger扫描接口 8、如何设置Swagger在生产环境中使用&…...
20230210英语学习
Why Do So Many Cats Have White ‘Socks’ on Their Paws? 为什么好多猫咪脚上都“穿着白袜子”? If you see a house cat, the odds are high that it will have white paws, a look that many owners affectionately call "socks."But socks are rar…...
【图像处理OpenCV(C++版)】——4.5 全局直方图均衡化
前言: 😊😊😊欢迎来到本博客😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快…...
2022年API安全研究报告
目录 导读 2022年API安全风险概况 2022年平均每月遭受攻击的API数量超21万...
【内网安全-横向移动】基于SMB协议-PsExec
目录 一、SMB协议 1、简述: 2、工具: 二、PsExec 1、简述: 2、使用: 1、常用参数: 2、情况: 3、插件 三、PsExec(impacket) 1、简述: 1、impacket࿱…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
