apollo配置中心事件通知:ApplicationEventPublisher
点击发布的时候触发一下操作:
1 | portal: '/apps/:appId/envs/:env/clusters/:clusterName/namespaces/:namespaceName/releases’ |
1 | portal:http://localhost:8070/apps/demo-apollo-test/envs/DEV/clusters/default/namespaces/application/releases |
admin-service:apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases
Apollo配置中心源码解读,启动过程,配置拉取……
Apollo配置中心监听器
1. apollo的核心代码分享
SpringApplication启动的关键步骤
在SpringApplication中,会加载所有实现了Init方法的类
1 | protected void applyInitializers(ConfigurableApplicationContext context) { |
通过上述步骤,Apollo自己实现的ApplicationContextInitializer也就 被加载到容器中了。具体的加载流程如下:
1
2
31.initialize->
2.initializeSystemProperty(environment) 读取项目中Apollo相关的配置文件,在首次读取的时候都是为空的,配置文件还没有加载进来;如果读到了相关配置,就会将配置信息放到容器的环境变量中。
3.
1 | CompositePropertySource composite = new CompositePropertySource(PropertySourcesConstants.APOLLO_BOOTSTRAP_PROPERTY_SOURCE_NAME); |
2.Apollo启动一览
2.1 ApolloApplicationContextInitializer的作用
定义apollo的容器启动的时候具体的工作事项
1 | ApolloApplicationContextInitializer implements |
容器启动的时候调用init方法
1 |
|
终上,在容器启动的时候,会调用RemoteConfigRepository的构造方法,而实现配置中心的同步主要是调用trySync,schedulePeriodicRefresh,scheduleLongPollingRefresh这个三个方法来实现配置的实时同步
2.2trySync()
1 | protected boolean trySync() { |
2.3 schedulePeriodicRefresh
开启多线程,调用 trySync();
1 | private void schedulePeriodicRefresh() { |
2.4 scheduleLongPollingRefresh
1 |
|
整个apollo配置中心的逻辑就是这样,简单的说就是无线循环的去获取配置信息,当获取到的配置信息与上次获取到的不同那么就刷新容器缓存的配置项并且更新客户端缓存的配置信息。
3. 注解ApolloConfigChangeListener分析
3.1@ApolloConfigChangeListener实现原理
Apollo配置中心有声明一个后置处理器,所以在程序启动的时候,spring容器会自动加载这个PostProcessor。
类图如下
1 | /** |
由ApolloProcessor的具体实现可以看到,在postProcessBeforeInitialization(后置处理器生成之前,会调用子类的processField、processMethod方法)。就是说在ApolloProcessor构造后置处理器之前,会调用ApolloAnnotationProcessor的processMethod
ApolloAnnotationProcessor的具体实现
1 |
|
1 | RemoteConfigLongPollService |
在配置文件发生变动的时候,调用顺序就跟第一大节说的顺序一致。
4 实际使用
4.1配置多个环境列表(一个portal管理多个环境的配置)
在启动portal的时候需要添加参数来指定某个环境对应的注册中心是什么。如下:
在启动Portal的时候,当点击的是dev也签,调用的注册中心是dev_meta;
1 | -Dapollo_profile=github,auth |
**在apollo中,可以支持多个环境列表的,通过阅读源码可以知道;在portal模块启动的时候,Apollo会将PortalDB库中的ServerConfig表中的数据添加到运行变量中去,其中就有环境列表的信息,这里需要手动加上去,并且用逗号隔开,添加的值也只能是它规定的那几个值。代码如下:
- 获取表中的数据并将它们设置到环境变量中
1 | public List<Env> portalSupportedEnvs() { |
1 | public PortalDBPropertySource() { |
4.2 指定运行环境
- 1.在默认路径 /opt/settings/server.properties中指定代码的运行时环境。在项目启动的时候,会找到classpath路径下面的 apollo-env.properties,由它来指定具体的环境与注册中心的对应关系。这样,就不需要添加-Dapollo.mata这个变量了
1 | MetaDomainConsts |