关于apollo:AREX-Agent-如何实现-Apollo-配置中心-Mock
背景对于 AREXAREX 是基于实在申请与数据的自动化回归测试平台,利用 Java Agent 和字节码加强技术,在生产环境中记录实在申请链路的入口和依赖的申请和响应数据,而后在测试环境中进行模仿申请回放,并逐个验证整个调用链路的逻辑正确性。AREX Agent 当初曾经反对了大部分开源组件的 Mock,本文将介绍 Agent 如何实现 Apollo 配置核心的 Mock。 对于 ApolloApollo(阿波罗)是一款牢靠的分布式配置管理核心,诞生于携程框架研发部,可能集中化治理利用不同环境、不同集群的配置,配置批改后可能实时推送到利用端。 以下是官网对 Apollo 根底模型的形容: 用户在配置核心对配置进行批改并公布;配置核心告诉 Apollo 客户端有配置更新;Apollo 客户端从配置核心拉取最新的配置、更新本地配置并告诉到利用。实现原理下图简要形容了 Apollo 客户端的实现原理: 客户端和服务端放弃了一个长连贯,从而能第一工夫取得配置更新的推送。(通过 Http Long Polling 实现)客户端还会定时从 Apollo 配置核心服务端拉取利用的最新配置。客户端从 Apollo 配置核心服务端获取到利用的最新配置后,会保留在内存中 图片起源:https://www.apolloconfig.com/#/zh/design/apollo-design开发过程从上图可知 AREX 只须要反对 Apollo 客户端的录制和回放,即 Java 利用我的项目外部援用 apollo-client 的组件: <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>{apollo-client.version}</version></dependency>通常,我的项目中应用 Apollo 的形式次要有以下三种: Spring Autowired 注解 configBean (外部还是应用 EnableApolloConfig 注解)基于 Apollo 自带的注解 ApolloConfig,如代码中的 config 对象API 形式,如代码中的 config1 对象:<!----> @AutowiredConfigBean configBean; // 第一种形式,外部基于 EnableApolloConfig 注解 @ApolloConfig("TEST1.lucas")private Config config; // 第二种形式private Config config1; // 第三种形式,在代码中调用 getAppConfig 实例化public void test() { config1 = ConfigService.getAppConfig(); System.out.println("timeout="+config.getProperty("timeout", "0")); System.out.println("switch="+config.getBooleanProperty("switch", false)); System.out.println("json="+config.getProperty("json", "")); System.out.println("white.list="+config1.getProperty("flight.change.white.list", "")); System.out.println("configBean="+configBean); // 监听 Apollo 配置变更 ConfigChangeListener changeListener = changeEvent -> { System.out.println("Changes for namespace:" + changeEvent.getNamespace()); }; config.addChangeListener(changeListener);}@Component@Configuration@EnableApolloConfig("TEST1.sofia")public class ConfigBean { @Value("${age:0}") int age; @Value("${name:}") String name; @ApolloJsonValue("${resume:[]}") private List<JsonBean> jsonBean;}如果 AREX 须要实现 Apollo 的录制和回放就要兼容这3种应用形式,通过查看 Apollo 源码发现前两种基于注解 EnableApolloConfig,ApolloConfig 和最初一种调用 API 的形式底层都是通过 ConfigService.getAppConfig() 创立的实例,也就是说底层 API 是共用的,这样咱们就能够润饰这些 Apollo 底层的办法插入 AREX 的字节码,达到录制和回放的目标。 ...