kl个人博客 首页>>分布式,架构>>读apollo之谈三方应用如何介入spring生命周期

读apollo之谈三方应用如何介入spring生命周期

读apollo之谈三方应用如何介入spring生命周期

前言碎语

Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。
服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。
Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。
.Net客户端不依赖任何框架,能够运行于所有.Net运行时环境。

项目地址:https://github.com/ctripcorp/apollo


进入正文

接下来我们通过apollo-client的spring模块来看apollo是如何在spring初始化前提供参数服务的,项目结构如下

突破口就是@EnableApolloConfig这个注解,而关键点是这个注解上面有个@Import的注解,这个注解是spring 3.0时引入的一个使用注解的方式代替xml配置文件的问题,可传入的值有{@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar},这里apollo使用的是ImportBeanDefinitionRegistrar接口的registerBeanDefinitions()方法实现ApolloConfigRegistrar来完成spring初始化时相关bean的定义的。


在registerBeanDefinitions的实现中,我们看到他注册了三个需要实例化的bean,分别是PropertySourcesPlaceholderConfigurer,PropertySourcesProcessor,

ApolloAnnotationProcessor


其中

1.PropertySourcesPlaceholderConfigurer是为了可使用占位符的方式如${spring_config}来引入env中的配置


2.PropertySourcesProcessor实现了BeanFactoryPostProcessor, EnvironmentAware, PriorityOrdered等接口的方法,priorityOrdered接口的getOrder来决定这个bean的实例化顺序,apollo这里设置成了最高级别的,所以会优先加载实例化。BeanFactoryPostProcessor提供了initializePropertySources的方法,这个方法的运行时机是所有需要实例化的bean准备好了,但是未实例化之前执行的,apollo就是在这个方法里面使用http拉取了远程的config配置并将配置设置给了ConfigurableEnvironment,使用EnvironmentAware的setEnvironment方法将ConfigurableEnvironment设置到了spirng运行时的env中


3.ApolloAnnotationProcessor实现了BeanPostProcessor, PriorityOrdered接口,并将getOrder的加载顺序调整到了最后面,BeanPostProcessor提供了两个方法postProcessBeforeInitialization(),postProcessAfterInitialization(),分别是在bean初始化前和初始化后执行,以便于我们对spring实例化的bean做一些修饰的操作,这里apollo利用这个特性来给@ApolloConfig注解标注的属性赋值,以及处理@ApolloConfigChangeListener注解标注的方法


kl个人博客