小傅哥的《字节码编程》- 文章涉及源码
前言
初识字节码编程是从使用非入侵的全链路监控开始,在这之前我所了解的如果需要监控系统的运行状况,通常需要硬编码埋点或者AOP的方式采集方法执行信息;耗时、异常、出入参等来监控一个系统的运行健康度。而这样的监控方式在大量的系统中去改造非常耗时且不好维护,更不要说去监控一个业务流程的调用链路。
在2010年的时候,谷歌发布一篇名为《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》的论文,在文中介绍了谷歌生产环境中大规模分布式系统下的跟踪系统Dapper
的设计和使用经验。
这样的监控系统采用 Javaagent
与字节码操作框架结合使用,在应用系统加载时对需要监控的方法进行字节码增强也叫插桩。对方法处理后的结果就和你之前硬编码类似,但这样就可以减轻认为操作,同时可以对多个系统之间定义调用链路ID进行串联业务流程关系。最终,极大减轻了监控成本也提高了线上问题的快速定位和处理。
这里面监控系统核心知识也主要是 Javaagent
和字节码操作,在字节码操作中目前有三个比较常用的框架;ASM
、Javassist
、Byte Buddy
,这几个框架都能进行字节码操作,其中ASM
更偏向于底层,需要了解字节码指令以及操作数栈等知识,最好学习过《Java虚拟机规范》等书籍,另外两个框架是对 ASM
的封装,提供更加高级的API去操作字节码。
在本书中小傅哥
会分别讲解这三种字节码框架的使用,以及最终与Javagent
结合完成全链路监控的案例。通过这样的学习让你可以从有抓手的案例开始,把枯燥的字节码编程融入场景,深化理解和实操应用。也能让你忙于CRUD开发的同时提升自己的知识栈,拓展技术视野。也许不久以后这项技术也能为你带来一些有价值的收获!
最后,祝你在学习拼搏的过程中都能,所求皆如愿,所行化坦途。
作者
作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果我的文章能为您提供帮助,请给予支持(关注、点赞、分享)!
如何支持:
- 关注公众号:
bugstack虫洞栈
- 收藏技术博客:
bugstack.cn
- Github开源项目给个Star⭐ CodeGuide | 程序员编码指南 -
https://github.com/xiaofuge/CodeGuide/wiki
- 分享给您身边更多的小伙伴
- 还可以赏个鸡腿
🍖
与我联系
如果你在学习和成长的过程中遇到什么问题,也可以添加我的微信进行交流,十分期待想是同好的技术伙伴!
- 加群交流 本群的宗旨是给大家提供一个良好的技术学习交流平台,所以杜绝一切广告!由于微信群人满 100 之后无法加入,请扫描下方二维码先添加作者 小傅哥 微信(fustack),备注:加群。
- 公众号(bugstack虫洞栈) 沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。目前已完成的专题有;Netty4.x实战专题案例、用Java实现JVM、基于JavaAgent的全链路监控、手写RPC框架、DDD专题案例、源码分析、字节码编程等。
目录
ASM 篇一,初识ASM使用字节码操作类和方法
ASM 篇二,JavaAgent+ASM字节码插桩采集方法名称以及入参和出参结果并记录方法耗时
ASM 篇三,用字节码增强技术给所有方法加上TryCatch捕获异常并输出
Javassist篇一《基于javassist的第一个案例helloworld》
Javassist篇二《定义属性以及创建方法时多种入参和出参类型的使用》
Javassist篇三《使用Javassist在运行时重新加载类「替换原方法输出不一样的结果」》
Javassist篇四《通过字节码插桩监控方法采集运行时入参出参和异常信息》
Javassist篇五《使用Bytecode指令码生成含有自定义注解的类和方法》
Byte-buddy篇一《基于Byte Buddy语法创建的第一个HelloWorld》
Byte-buddy篇二《监控方法执行耗时动态获取出入参类型和值》
Byte-buddy篇三《使用委托实现抽象类方法并注入自定义注解信息》
基于JavaAgent的全链路监控一《嗨!JavaAgent》
基于JavaAgent的全链路监控二《通过字节码增加监控执行耗时》
基于JavaAgent的全链路监控三《ByteBuddy操作监控方法字节码》
基于JavaAgent的全链路监控四《JVM内存与GC信息》
基于JavaAgent的全链路监控五《ThreadLocal链路追踪》
基于JavaAgent的全链路监控六《开发应用级监控》