当前位置: 首页 > news >正文

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 扩展的功能: 没法进行热加载和协助,因为这部分是由应用启动的时候进行加载的。可以加开关,将开关配置下发来动态控制功能是否生效


采坑:

  1. agent使用的第三方公共包和业务使用的第三方公共包有版本冲突,使用maven-shade-plugin 解决

  2. 有时候日志打印不出来,因为agent使用的日志包和业务的有冲突

  3. 和定时任务saturn框架有冲突。因为saturn框架是采用独立lib加载的方式,在对saturn lib下的类进行字节码增强后,saturn lib下的类没有办法找到在系统类加载器的agent 类。典型案例就是skywalking agent

  4. agent增强某个类,这个类已经被加载过了,增强就不生效了。多个agent对同个类进行增强时,经常有这个问题

  5. 有个节点偶发性出现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&#xff1…...

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 这种错误时,很大可能就是磁盘出现了坏块问题。 解决步骤&#xff1a…...

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拖拽编辑单个图形形状

首先在选中图形的时候需要用鼠标右击来弹出选择框&#xff0c;实现第一个编辑节点功能 在components文件夹下新建右键菜单 RightMenu文件&#xff1a; <template><div v-show"show" class"right-menu" :style"top:this.ypx;left:this.xpx…...

JavaEE 初阶 — 确认应答机制

文章目录确认应答机制&#xff08;安全机制&#xff09;1 什么是后发先至问题1 如何解决后发先至问题确认应答机制&#xff08;安全机制&#xff09; 确认应答 是实现可靠传输的最核心机制。 这里指的 可靠传输 不是说 100% 可以把消息发给接收方&#xff0c;而是尽力而为&…...

0207 事件

事件监听事件监听版本事件类型事件概念事件在编程时系统内发生的动作或者发生的事情例子点击按钮鼠标经过拖拽鼠标事件监听&#xff08;注册事件&#xff0c;绑定事件&#xff09;让程序员检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响应…...

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? 为什么好多猫咪脚上都“穿着白袜子”&#xff1f; 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 全局直方图均衡化

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…...

2022年API安全研究报告

目录 导读 2022年API安全风险概况 2022年平均每月遭受攻击的API数量超21万...

【内网安全-横向移动】基于SMB协议-PsExec

目录 一、SMB协议 1、简述&#xff1a; 2、工具&#xff1a; 二、PsExec 1、简述&#xff1a; 2、使用&#xff1a; 1、常用参数&#xff1a; 2、情况&#xff1a; 3、插件 三、PsExec&#xff08;impacket&#xff09; 1、简述&#xff1a; 1、impacket&#xff1…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...