从spring boot 启动过程看apollo的初始化过程( 二)

时间:2024-04-05 15:18:58

之前一篇文章《从apollo的初始化看spring boot 1.5.3启动过程( 一)
说到而apollo的初始化逻辑便放在这里面,本文就继续从此展开
从spring boot 启动过程看apollo的初始化过程( 二)
Spring从3.1版本开始增加了ConfigurableEnvironment和PropertySource:

  • ConfigurableEnvironment
    Spring的ApplicationContext会包含一个Environment(实现ConfigurableEnvironment接口)
  • ConfigurableEnvironment自身包含了很多个PropertySource
    PropertySource
    属性源
    可以理解为很多个Key - Value的属性配置

而ConfigurableEnvironment正是被传入postProcessEnvironment方法中去执行自己想要初始化的属性源。
从spring boot 启动过程看apollo的初始化过程( 二)
在运行时的结构形如:
从spring boot 启动过程看apollo的初始化过程( 二)

需要注意的是,PropertySource之间是有优先级顺序的,如果有一个Key在多个property source中都存在,那么在前面的property source优先。
所以对上图的例子:

  • env.getProperty(“key1”) -> value1
  • env.getProperty(“key2”) -> value2
  • env.getProperty(“key3”) -> value4

所以,在应用启动阶段,Apollo从远端获取配置,然后组装成PropertySource并插入到第一个即可,如下图所示:
从spring boot 启动过程看apollo的初始化过程( 二)
代码可参考
从spring boot 启动过程看apollo的初始化过程( 二)
在配置中心中,一个重要的功能就是配置发布后实时推送到客户端。下面我们简要看一下这块是怎么设计实现的。

上图简要描述了配置发布的大致过程:

1、用户在Portal操作配置发布
2、Portal调用Admin Service的接口操作发布
3、Admin Service发布配置后,发送ReleaseMessage(此处的消息中间件为数据库)给各个Config Service
4、Config Service收到ReleaseMessage后,通知对应的客户端从spring boot 启动过程看apollo的初始化过程( 二)
而我们的应用程序是从apollo 的客户端client中去获取通知
从spring boot 启动过程看apollo的初始化过程( 二)
上面说的从远端获取配置,那么如何从远端获取呢?
根据
从spring boot 启动过程看apollo的初始化过程( 二)
我们知道client是从SLB中发现metaServer,进而读取Config Service的 配置信息,
即和域名系统配合,协助Client访问MetaServer获取ConfigService地址列表。
com/ctrip/framework/apollo/internals/ConfigServiceLocator.java
中,类初始化后,

#1、执行initialize这个方法

从spring boot 启动过程看apollo的初始化过程( 二)

2、获取MetaService地址

从spring boot 启动过程看apollo的初始化过程( 二)

3、获取环境信息

从spring boot 启动过程看apollo的初始化过程( 二)
比如我的是windows环境,然后配置的本地的DEV开发环境
从spring boot 启动过程看apollo的初始化过程( 二)

4、获取域名信息

从spring boot 启动过程看apollo的初始化过程( 二)
从spring boot 启动过程看apollo的初始化过程( 二)
这个domain是一个可以从一个自定义的apollo-env.properties文件获取并put相关配置后的Static Map

从spring boot 启动过程看apollo的初始化过程( 二)
从spring boot 启动过程看apollo的初始化过程( 二)
这里获取到的只是MetaService的地址,即通过包装服务后的eureka的地址,还要通过此地址,来发现configService的无状态
集群式部署的机器ip:port信息。
如何发现呢?
通过euerka发现,目前已经将
从spring boot 启动过程看apollo的初始化过程( 二)
这两个服务注册成功。
从spring boot 启动过程看apollo的初始化过程( 二)

5、获取ConfigService的配置信息

此时,就需要MetaService提供的接口,来获取ConfigService的地址
可通过http api 接口访问获取只要在
注册中心地址后拼接上我们的应用appid以及主机IP,
从spring boot 启动过程看apollo的初始化过程( 二)
通过界面访问也是一样的结果
从spring boot 启动过程看apollo的初始化过程( 二)
所以,这个DTO也是携程内部定义的
从spring boot 启动过程看apollo的初始化过程( 二)
所有的配置信息,则从上面的那个instanceId 获取

然后通过portal即可访问到admin-service,继而访问到configservice。

简而言之,就是通过两条线路来访问数据,保证了服务上线后,我们可通过portal热更新数据,来改变应用读到的配置信息。

参考

https://github.com/ctripcorp/apollo/wiki/Apollo%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83%E8%AE%BE%E8%AE%A1#133-meta-server

https://mp.weixin.qq.com/s/-hUaQPzfsl9Lm3IqQW3VDQ