Sermant类隔离架构解析——解决JavaAgent场景类冲突的实践

本文探讨了JavaAgent场景中的类冲突问题及其影响,重点介绍了如何通过maven-shade-plugin进行类隔离以及Sermant框架如何通过设计全面的类隔离架构来避免类冲突,尤其强调了Sermant利用Java字节码增强技术和类加载机制提供的高性能服务治理体验。

一、JavaAgent场景为什么要注意类冲突问题?

类冲突问题并非仅存在于JavaAgent场景中,在Java场景中一直都存在,该问题通常会导致运行时触发NoClassDefFoundError、ClassNotFoundException、NoSuchMethodError等异常。

从使用场景来看,基于JavaAgent技术所实现的工具,往往用于监控、治理等场景,并非企业核心业务程序。如果在使用时引入类冲突问题,可能会造成核心业务程序故障,得不偿失,所以避免向核心业务程序引入类冲突是一个JavaAgent工具的基本要求。

还有一个重要原因是在Java应用中可以于开发态采用依赖的升降级、统一依赖架构治理等手段解决该问题。但基于JavaAgent技术实现的工具作用于运行态,无法在开发态就和需要被增强的Java应用进行统一的依赖管理,所以引入类冲突问题的可能性更大。

二、JavaAgent场景如何解决该问题?

无论是在Java应用中,还是在JavaAgent场景,修复类冲突的逻辑都是一致的,就是避免引入会冲突的类。不同点在于基于JavaAgent技术实现的各式各样的工具,往往都具有业务无关性,在设计和实现之初,并不会为特定的Java应用类型而定制。对于JavaAgent程序而言,需要被字节码增强的应用即是黑盒,所以无法像Java应用那样去梳理依赖结构,排除、升级依赖项,统一进行依赖架构治理。并且JavaAgent往往在运行时使用,所以只能通过保障依赖绝对隔离的方式来避免引入冲突。

为何会产生类冲突,本文重点不在此,简单讲是因为我们在Java中因为重复引入传递依赖、类的加载顺序无法控制等问题,导致引入了相同【类加载器和全限定类名(Fully Qualified Class Name)都相同】但又表现不同【因为类版本不同而导致的类逻辑不一致】的类。所以为了避免冲突,我们就需要避免在运行时引入相同的类,如何让JavaAgent引入的类和宿主完全不相同,从全限定类名和类加载器下手才是根本:

  • 基于maven shade plugin进行类隔离

该插件是Maven提供用于构建打包的插件,通过maven-shade-plugin的‘Relocating Classes’能力,来修改某些类的全限定类名。

此方法的原理便是通过改变全限定类名来让JavaAgent引入的类和Java程序的类完全不可能出现相同的情况,从根本上避免类冲突。但是我们在使用一种框架,或者使用一种产品时,往往约定要优

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值