一、啥是javaagent?
在日常的开发实践中,javaagent的应用场景可谓是非常广泛了,无论是在链路监控的APM中,还是在诊断工具的Arthas中,亦或是在处理log4j2漏洞的”疫苗“中,都能看到javaagent的身影,并发挥着重要的作用。
二、遇到了啥问题需要用javaagnent来解决呢?
pre.多服务、多环境的部署的现状
- 多环境不是指
dev
、fat
、uat
、pro
这样的多环境,而是fat
中包含了fat1
、fat2
、fat3
等多套环境 - 不同的业务中,如
study
、play
,它们所部署的fat
环境数量是不确定的 - 同一个业务中,每套
fat
环境部署的服务也不一定是一致的,如study
业务中的fat-3
中仅部署了appA
,没有部署appB
。
ps:
fat
环境共用一个注册中心,每个服务(如appA
)数据库也是只有一个,apollo配置亦是如此
1.如此部署服务会导致什么问题?
一些基于或类似于注册中心的调用可能会出现不可控的情况,示意如下:
当appC
去调用appA
的时候,可能会调用到3套环境中的其中一个,是不可控。 为了解决这个问题,就需要对各个环境的调用进行隔离。
ps:更详细的可背景以参考之前的文章:一种多业务下多环境的dubbo隔离方案
2.需要隔离的“调用”有哪些?
常用的基于或者类似于注册中心的调用有以下这些:
- mq
- dubbo
- xxl-job
- runner线程
- 其它自研的框架调用
3.能“抓老鼠”就是好猫?
能实现隔离功能就行了嘛?不一定!除了解决基本的隔离的基本问题外,还期待:
a.可配置
通过配置文件进行配置,支持统一管理,不需要跨越多个平台来配置。
b.不影响宿主应用的正常功能使用
这个属于底线要求了,不能影响正常的业务功能逻辑。
c.不侵入代码提交
这并不是一个业务需求,并且是不需要上线的,因此不宜提交。
d.兼容多种运行场景
目前存在的运行方式有:
- 使用springboot的打包插件,打包成一个fatjar来启动(下称
jar in jar
形式) - 指定class文件启动,不打包成jar包(下称
非jar in jar
形式)
ps:若有一种运行环境不支持,或一个服务不配合,都无法达到完整的隔离
三、javaagent是怎么实现环境隔离的?
1.首先来分析下能不能实现隔离
a.mq隔离
先给个环境隔离的示意图: