Enhancer轻量化的字节码增强组件包

一、问题描述

当我们的业务发展到一定阶段的时候,系统的复杂度往往会非常高,不再是一个简单的单体应用所能够承载的,随之而来的是系统架构的不断升级与演变。一般对于大型的To C的互联网企业来说,整个系统都是构建于微服务的架构之上,原因是To C的业务有着天生的微服务化的诉求:需求迭代快、业务系统多、领域划分多、链路调用关系复杂、容忍延迟低、故障传播快。微服务化之后带来的问题也很明显:服务的管理复杂、链路的梳理复杂、系统故障会在整个链路中迅速传播。

这里我们不讨论链路的依赖或服务的管理等问题,本次要解决的问题是怎么防止单个系统故障影响整个系统。这是一个复杂的问题,因为服务的传播特性,一个服务出现故障,其他依赖或被依赖的服务都会受到影响。为了找到解决问题的办法,我们试着通过5why提问法来找答案。

PS:这里说的系统故障,是特指由于慢调用、慢查询等影响系统性能而导致的系统故障。

问:怎么防止单个系统故障影响整个系统?

答:避免单个系统的故障的传播。

问:怎么避免故障的传播?

答:找到系统故障的原因,解决故障。

问:怎么找到系统故障的原因?

答:找到并优化系统中耗时长的方法。

问:怎么找到系统中耗时长的方法?

答:通过对特定方法做AOP拦截。

问:怎么对特定方法做AOP拦截?

答:通过字节码增强的方式对目标方法做拦截并植入内联代码。

通过5why提问法,我们得到了解决问题的方法,我们需要对目标方法做AOP拦截,统计业务方法及各个子方法的耗时,得到所有方法的耗时分布,快速定位到比较慢的方法,最后找出业务系统的性能瓶颈在哪里。

二 、方案选型