zoukankan      html  css  js  c++  java
  • Java Agent(上)

    1、java agent是什么?

    ---》对用户透明,不侵入用户业务代码。让java虚拟机加载agent jar

    2、java agent有什么用?

    --->应用场景例如:调用链追踪项目,在用户无感知的情况下,记录日志。目前业内使用该技术的有,SkyWalking,Pinpoint(这个监控的粒度更小)

    -各个 Java IDE 的调试功能,例如 eclipse、IntelliJ ;

    -热部署功能,例如 JRebel、XRebel、 spring-loaded;

    -各种线上诊断工具,例如 Btrace、Greys,还有阿里的 Arthas;

    -各种性能分析工具,例如 Visual VM、JConsole 等

    3、java agent的实现原理?

    https://zhuanlan.zhihu.com/p/147375268

    4、 入门案例

    4.1、 如何制造自己第一个java agent jar包

    4.1.1、 第一步:我们需要一个插件来帮助我们生成带特定格式的MAINIFEST.MF的jar

    4.1.2、 第二步:在启动项目的时候,在jvm参数中添加 -javaagent: *ving-agent-0.0.1-SNAPSHOT.jar (在jvm上先加载agent包)

    (偷偷地问)特定格式的MAINIFEST.MF是怎样的?需要包括下面的内容

    Manifest-Version: 1.0
    Can-Redefine-Classes: true
    Can-Retransform-Classes: true
    Premain-Class: cn.think.in.java.clazz.loader.asm.agent.PreMainTraceAgent
    

    (再偷偷地问),难度每次都让我手动去弄这个文件,我觉得很麻烦呀,有没一个工具能帮我们将agent项目打包成包含MAINIFEST.MF的jar?
    -----》对,你猜对了,真的有这个工具。那就是maven插件。(说到打包,肯定要想到maven或者gradle了吧)

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>2.2</version>
                    <configuration>
                        <archive>
                            <manifestEntries>
                                <Project-name>${project.name}</Project-name>
                                <Project-version>${project.version}</Project-version>
                                <Premain-Class>com.tuling.agent.Agent</Premain-Class>
                                <Can-Redefine-Classes>true</Can-Redefine-Classes>
                                <Can-Retransform-Classes>true</Can-Retransform-Classes>
                                <Boot-Class-Path>javassist-3.18.1-GA.jar</Boot-Class-Path>
                            </manifestEntries>
                        </archive>
                        <skip>true</skip>
                    </configuration>
                </plugin>
    

    插件

    打包之后

    测试



    问题二:如果有一个类已经被虚拟机加载了,那么我们的agent包里面的逻辑就不能加载这个类。但是我就是想把这类替换掉,怎么办呢?(热更新,虚拟机不停的情况下,替换成用户最新的代码)

    插件

    agent代码的修改

    重新打包

    测试

    问题三:
    当JVM已装置某个类,但是我们想重新走一次premain方法,我们怎样做呢?
    插件

    修改agent代码

    打包

    测试

    思考

    看到这里,细心的朋友,可能会带有疑问,我在实践的时候,发现这个类的字节码的生成并不简单,如果让我自己去手动去生成那就很麻烦呀?(麻烦--》复杂度高---》容易出错----》上线容易出问题---》那就直接不考虑该技术)
    ----》为了解决这个问题,java-ssist就出现了。关于java-ssist,请点击。

    https://www.cnblogs.com/vingLiu/p/13193517.html

  • 相关阅读:
    胖子哥的大数据之路(12)-三张图告诉你大数据安全方案设计
    Building the Unstructured Data Warehouse: Architecture, Analysis, and Design
    Hadoop专业解决方案-第3章:MapReduce处理数据
    胖子哥的大数据之路(11)-我看Intel&&Cloudera的合作
    胖子哥的大数据之路(10)- 基于Hive构建数据仓库实例
    胖子哥的大数据之路(9)-数据仓库金融行业数据逻辑模型FS-LDM
    胖子哥的大数据之路(8)- 数据仓库命名规范
    胖子哥的大数据之路(7)- 传统企业切入核心or外围
    dos 打开计算机管理
    C# SQLite数据库
  • 原文地址:https://www.cnblogs.com/vingLiu/p/13193148.html
Copyright © 2011-2022 走看看