Apollo项目实践
Apollo项目实践
1 阿波罗应用

项目地址:https://github.com/ctripcorp/apollo
使用说明书:https://github.com/ctripcorp/apollo/wiki
1.1 初识阿波罗
阿波罗(Apollo)是携程框架部门开发的分布式配置中心。它可以集中管理不同应用环境和不同集群的配置。配置修改后,可以实时推送到应用端。它还具有标准化的权限、流程治理等特点。适用于微服务配置管理场景。
服务端基于 Spring Boot 和 Spring Cloud 开发。打包后可以直接运行,无需额外安装Tomcat等应用容器。
Java 客户端不依赖任何框架,可以在所有 Java 运行时环境中运行。同时对Spring/Spring Boot环境也有很好的支持。
1)核心功能:
不同环境、不同集群配置的统一管理:
1:Apollo提供统一的接口,用于集中管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置。
2:相同的代码部署在不同的集群,可以有不同的配置,比如zk地址等
3:通过命名空间(namespace)可以方便的支持多个不同的应用共享同一个配置,并允许应用覆盖共享的配置
4:配置界面支持多种语言(中文、英文)
热发布:
用户在 Apollo 修改并发布配置后,客户端可实时(1 秒)接收最新配置并通知应用。
版本发布管理:
所有配置发布都有版本概念,可以轻松支持配置回滚。
格雷出版:
支持灰度发布配置。比如点击发布后,只会对部分应用实例生效,观察一段时间后再推送给所有应用实例。
权限管理、发布审核、运行审核:
1:对应用和配置的管理具有完善的权限管理机制。配置的管理也分为编辑和发布两个环节,以减少人为错误。
2:所有操作都有审计日志,可以轻松跟踪问题。
客户端配置信息监控:
您可以轻松查看正在使用的配置实例
提供 Java 和 .Net Native Client:
1:提供Java和.Net Native客户端,方便应用集成
2:支持Spring Placeholder,ConfigurationProperties的注解和Spring Boot,方便应用(Spring 3.1.1+)
3:还提供了Http接口,非Java和.Net的应用也可以方便的使用
提供开放平台API:
1:Apollo 提供了比较完善的统一配置管理接口,支持多环境、多数据中心的配置管理、权限、流程治理等特性。
2:不过Apollo为了通用性,对配置的修改不会有太大的限制。只要符合基本格式就可以保存。
3:在我们的研究中,我们发现对于一些用户来说,他们的配置可能有复杂的格式,比如xml、json,格式需要验证。
4:还有其他的使用方式,比如DAL,不仅有特定的格式,而且输入值在保存前需要验证,比如检查数据库、用户名和密码是否匹配。
5:对于此类应用,Apollo 支持应用通过开放接口 Apollo 修改和发布配置,并具有完善的授权和权限控制
简单部署:
1:作为基础服务,配置中心的可用性非常高,需要Apollo尽量减少外部依赖
2:目前唯一的外部依赖是MySQL,所以部署很简单,只要安装好Java和MySQL就可以让Apollo Run
3:Apollo 还提供打包脚本,可以一键生成所有需要的安装包,支持自定义运行时参数
- 谁在使用它
国内很多大厂都在使用Apollo作为分布式配置中心。如果你的网站也在使用,那就是https://github.com/ctripcorp/apollo/issues/451可以注册。
携程、华为、京东、智联招聘、中国移动、360金融、中通快递、转转、贝壳、大号兔、平安银行、有赞等国内多家大型厂商都在使用Apollo。

1.2 Apollo单机部署
接下来,我们将实现 Apollo 安装。在安装之前,我们先介绍一下单机安装的架构,如下图:

上图展示了 Apollo 单机部署架构。我们解释每个节点:
Apollo Config Service:提供读取、推送配置等功能,服务对象为Apollo客户端。
Apollo Admin Service:提供配置修改、发布等功能。服务对象是 Apollo Portal。
Apollo Portal:Apollo 来配置不同的项目(项目配置、权限配置等),并且服务对象是开放的
发送者和开放平台API
环境描述:
MySQL:推荐MySQL 5.7,版本要求5.6.5+
阿波罗服务器:JDK1.8+
阿波罗客户端:JDK1.7+
有很多方法可以安装 Apollo。官方提供了快速安装方式和Docker安装方式。两种安装方式我们实现一次,但是如果是生产环境,请使用分布式部署器
https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C% 87%E5%8D%97
1.2.1 快速安装
1)JDK版本:
[root@skywalking ~]# java -version
java 版本“1.8.0_144”
Java(TM) SE 运行时环境 (build 1.8.0_144-b01)
Java HotSpot(TM) 64 位服务器 VM(内部版本 25.144-b01,混合模式)
2)MySQL版本:
选择版本()
5.7.32-日志
3)安装包下载:
Apollo准备了一个Quick Start安装包Zip,里面包含了可以自动启动的jar包,以及所有依赖的jar包、数据库脚本、内置Tomcat容器等,安装包共63M。只需要下载到本地就可以直接使用,省去了编译打包的过程。
Github下载地址:https://github.com/nobodyiam/apollo-build-scripts
Quick Start只用于本地测试,普通用户不需要自己下载源码和包,只需要下载打包好的包即可。但是有些用户修改代码后想重新打包,可以参考以下步骤:
1:修改pom.xml的apollo-configservice、apollo-adminservice和apollo-portal,注释掉
spring-boot-maven-plugin 和 maven-assembly-plugin
2:根目录下执行 mvn clean package -pl apollo-assembly -am -DskipTestsu003dtrue
3:复制 apollo-assembly/target 下 jar 包,重命名为 apollo-all-in-one.jar
4)创建数据库:
Apollo 服务器需要两个数据库:Apollo PORTALDB 和 Apollo configdb。我们分别准备了用于创建数据库、表和示例数据的 sql 文件。我们只需要导入数据库。
注意:如果您已经在本地创建了 Apollo 数据库,请注意备份数据。我们准备的sql文件会清空Apollo相关的表。

5)配置数据库连接:
我们的数据库地址不是固定的。 Apollo服务器需要知道如何连接你之前创建的数据库,所以需要修改数据库连接地址。安装包中有启动脚本demo 修改configalportdb的连接字符串和aplosh数据库的相关信息:
# apollo 配置数据库信息
apollo_config_db_urlu003d"jdbc:mysql://192.168.211.145:3306/ApolloConfigDB?
characterEncodingu003dutf8&serverTimezoneu003d亚洲/上海"
apollo\config\db\usernameu003droot
阿波罗\配置\数据库\密码u003d123456
阿波罗门户数据库信息
阿波罗_portal_db_urlu003d"jdbc:mysql://192.168.211.145:3306/ApolloPortalDB?
characterEncodingu003dutf8&serverTimezoneu003d亚洲/上海"
阿波罗_portal_db_usernameu003droot
阿波罗\门户\数据库\密码u003d123456
6)启动服务:
快速启动脚本将在本地启动三个服务,分别使用端口 8070、8080 和 8090。请确保当前未使用这三个端口。如果没有用到ports,我们可以直接启动程序,执行demo SH脚本就够了,启动过程比较慢。
./demo.sh 开始
看到如下输出,说明启动成功!
\u003du003du003du003d 启动服务 u003du003du003du003d
服务日志文件是 ./service/apollo-service.log
开始[10768]
等待配置服务启动.......
配置服务已启动。您可以访问 http://localhost:8080 查看服务状态
现在!
等待管理员服务启动....
管理服务已启动
u003du003du003du003d 起始传送门 u003du003du003du003d
门户日志文件是 ./portal/apollo-portal.log
开始[10846]
等待门户启动......
门户已启动。现在可以访问 http://localhost:8070 了!
启动后访问 http://192.168.211.145:8070/ ,可以看到Apollo的配置界面

1.2.2 安装docker容器
如果你对 Docker 非常熟悉,可以使用 Docker 快速部署 Apollo 来快速了解 Apollo。确保本地已存在 Docker 快速启动文件夹。如果你在本地克隆了Apollo的代码,可以跳过这一步。
在 docker 快速启动目录中执行 docker compose up。第一次执行会触发下载图片等操作。你需要耐心等待一段时间。
搜索所有以Apollo quick start开头的日志,看到如下日志就说明启动成功了:
阿波罗快速入门 | u003du003du003du003d 开始服务 u003du003du003du003d
阿波罗快速入门 |服务日志文件是 ./service/apollo-service.log
阿波罗快速入门 |开始[45]
阿波罗快速入门 |等待配置服务启动......
阿波罗快速入门 |配置服务已启动。您可以访问
http://localhost:8080 现在查看服务状态!
阿波罗快速入门 |等待管理员服务启动......
阿波罗快速入门 |管理服务已启动
阿波罗快速入门 | u003du003du003du003d 开始传送门 u003du003du003du003d
阿波罗快速入门 |门户日志文件是 ./portal/apollo-portal.log
阿波罗快速入门 |开始[254]
阿波罗快速入门 |等待门户启动.......
阿波罗快速入门 |门户启动。现在可以访问 http://localhost:8070 了!
但是,基于 Docker 的安装有一些问题需要注意:
1:数据库的端口映射到13306,所以如果要访问主机上的数据库,可以使用localhost:13306,用户
名字是root,密码留空。
2:查看更多服务的日志,可以 docker exec -it apollo-quick-start bash 登录并
到达/apollo-quick-start/service 和/apollo-quick-start/portal 下查看日志信息。
安装后访问 http://192.168.211.145:8070/ ,可以看到Apollo的配置界面
2.使用配置中心
接下来,让我们学习如何使用 Apollo 配置中心。配置中心主要用于为分布式应用程序提供配置服务。访问地址为 http://192.168.211.145:8070 ,登录账号 Apollo,密码 admin

登录后界面如下:

2.1 项目配置托管
接下来,我们使用 Apollo 作为配置中心,将项目配置托管到 Apollo 中。
2.2.1 配置创建

单击创建应用程序,将出现以下表单:

创建应用参数说明:
-
部门:选择应用所在部门。 Department 数据来自 Apollo PORTALDB 库的 ServerConfig 表中 Key u003d organizations 对应的记录。
-
App AppId:用于标识应用程序身份的唯一id。格式为字符串。需要与properties id对应中配置的客户端应用App一致。
-
应用名称:应用名称,仅用于界面显示。
-
应用负责人:默认项目管理员权限。
-
项目管理员:您可以创建命名空间和集群并分配用户权限。
默认配置
要创建配置,需要将项目中的配置移动到 Apollo。您可以单击添加配置按钮。默认情况下,每个项目都有一个默认的配置应用程序属性,如下图所示:

添加配置如下图:

至此,就相当于在应用程序中添加了一个key:value数据到properties中:
#bootstrap.properties
messageu003d骑黑马,一天45亿架构
保存配置后,可以看到配置信息,但是无法直接读取项目中的数据。您只能在发布后阅读。如下图,还可以查看每次修改的历史,哪些项目在使用实例,修改配置,删除当前配置文件。每个配置文件都定义为一个命名空间:

公共配置创建
除了默认配置,我们还可以自己创建更多的配置。新建配置,点击添加命名空间,打开如下添加界面:

这种类型有两种选择。一种是创建公共配置,另一种是创建私有配置。它们之间的区别如下:
公开:
Public Namespace 的配置可以被任意项读取
通过创建公共Namespace 可以实现通用组件的配置或者多个应用共享相同配置的需求
如果其他应用需要覆盖公共部分的配置,可以将公共部分关联到其他应用的Namespace,然后在关联的
Namespace 里面可以配置需要覆盖的配置
如果其他应用不需要覆盖公共部分的配置,则无需将公共部分与其他应用的Namespace关联
私人:
private Namespace 的配置只能由其所属的应用程序获取
通过创建私有 Namespace Group 管理配置可以实现
private Namespace 格式可以是xml,yml,yaml,json,txt。你可以在 apollo-client
ConfigFile 接口获取非属性格式的 Namespace 内容
1.3.0 及以上 apollo-client 根据 yaml/yml 可以通过提供更好的支持
ConfigService.getConfig("someNamespace.yml")直接获取Config Object,或者通过
@EnableApolloConfig("someNamespace.yml") 或
apollo.bootstrap.namespacesu003dsomeNamespace.yml 注入 yml 配置到 Spring/SpringBoot 中去
接下来,我们可以添加一些数据并发布,如下图所示:

配置关联
接下来,我们可以创建一个配置关联公共配置。我们可以先创建一个项目 hailtaxi driver config 并在这个项目中创建一个私有配置。 ipinfo 继承了上面的 stmt 公共配置:
! zoz100077](https://programming.vip/images/doc/501811674986bc8f67097b07138aabbb.jpg)
让我们添加另一部分数据,如下图所示:

私有配置
接下来,我们可以为hailtaxi driver config创建一个私有配置,如下图所示:

我们添加了一些信息,如下图所示:

2.2.2 spring boot 集成 Apollo
配置用例
为了给 Apollo 更多的资源,我们在 hailtaxi driver config 中增加了一个新的命名空间来配置 springboot 的核心配置。 springboot config的内容如下:

配置数据如下:
spring.application.name u003d hailtaxi-driver
spring.datasource.driver-class-name u003d com.mysql.cj.jdbc.Driver
spring.datasource.url u003d jdbc:mysql://192.168.211.145:3306/hailtaxi-driver?
使用Unicodeu003dtrue&characterEncodingu003dUTF-8&serverTimezoneu003dUTC
spring.datasource.username u003d 根
spring.datasource.password u003d 123456
spring.cloud.consul.host u003d 192.168.211.145
spring.cloud.consul.port u003d 8500
spring.cloud.consul.discovery.service-name u003d ${spring.application.name}
spring.cloud.consul.discovery.prefer-ip-address u003d true
我们编写一个案例来获取配置中的数据(stmt, driver info),向外界输出友好提示,并在hailtaxi-driver itheima中创建com。司机。控制器。 Tripcontroller 代码如下:
@RestController
@RequestMapping(value u003d "/trip")
@ConfigurationProperties(前缀 u003d “平台”)
@数据
公共类 TripController {
@Autowired
私有环境环境;
/***
* 出行提醒
* @return
*/
@GetMapping(value u003d "/message")
公共字符串消息(){
//获取hailtaxi驱动配置中的stmt数据
字符串 ip u003d environment.getProperty("ip");
字符串城市 u003d environment.getProperty("city");
字符串天气 u003d environment.getProperty("天气");
//获取hailtaxi驱动配置中的驱动信息数据
String drivertype u003d environment.getProperty("drivertype");
String driveryear u003d environment.getProperty("driveryear");
//汇编提示
String message u003d "你的IP["+ip+"],欢迎使用["+
city+"]用户,当前天气"+weather+"。您选择的型号是["+
drivertype+"],车龄"+driveryear+",祝您旅途愉快!["+
姓名"]发件人["+课程名称+"],联系地址:"+地址;
返回信息;
}
}
综合阿波罗
集成 Apollo 有两个步骤。首先介绍Apollo的客户端,然后将需要从Apollo注入的配置信息引入spring boot核心配置文件中。
1)引入依赖
hailtaxi 驱动程序中的 POM 在 XML 中引入了以下依赖项:
<!--ApolloClient-->
<依赖>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<版本>1.7.0</版本>
</依赖>
2)修改配置
在 bootstrap 从 YML 中移除以下配置:
弹簧:
应用:
名称: 出租车司机
数据源:
驱动程序类名:com.mysql.cj.jdbc.Driver
网址:jdbc:mysql://192.168.211.145:3306/hailtaxi-order?useUnicodeu003dtrue&characterEncodingu003dUTF-8&serverTimezoneu003dUTC
用户名:root
密码:123456
云:
#Consul 配置
领事:
主机:192.168.211.145
端口:8500
发现:
#在Consul注册的服务名
服务名称:${spring.application.name}
首选 IP 地址:真
在 bootstrap 中将以下配置添加到 YML 中:
应用程序:
id: hailtaxi-driver-config #Project(应用程序)使用的Apollo编号
阿波罗:
meta: http://192.168.211.145:8080 #Apollo Meta Server地址
引导:
enabled: true #是否开启Apollo配置预加载功能。默认值为假。
急切加载:
enable: true #是否开启Apollo支持日志级别的加载时间。默认值为假。
namespaces: application,stmt,driver-info,springboot-config #使用的Apollo的命名空间。默认为应用程序。
完整的配置文件如下:
服务器:
端口:18081
#Apollo 应用程序
应用程序:
id: hailtaxi-driver-config #Project(应用程序)使用的Apollo编号
阿波罗:
meta: http://192.168.211.145:8080 #Apollo Meta Server地址
引导:
enabled: true #是否开启Apollo配置预加载功能。默认值为假。
急切加载:
enable: true #是否开启Apollo支持日志级别的加载时间。默认值为假。
namespaces: application,stmt,driver-info,springboot-config #使用的Apollo的命名空间。默认为应用程序。
我们询问 http://localhost:18081/trip/message 测试结果如下:

2.2 Apollo的实用功能
在实际的项目应用中,需要注意的地方很多,比如配置自动刷新、配置加载顺序、复杂的环境配置、数据加密、日志配置等等,都会给我们的生产环境带来困扰。接下来,让我们来学习解决这些问题的方法。
自动刷新
之前我们已经实现了SpringBoot来读取配置,但是我们使用Environment。我们分别使用@Value和@ConfigurationProperties,然后观察配置是否会被刷新。
我们将以下数据添加到stmt:
#Configuration 使用@ConfigurationProperties
platform.nameu003d黑马骑
platform.addressu003d北京金燕龙科研楼
platform.coursenameu003d黑马建筑师课程

我们修改ip、城市和平台名称,并发布,如下图:

我们可以发现ip和city都变了,而platform Name没有变,如下图所示:
! swz 100101 swz 100102 swz 100100
目前Apollo没有提供自动刷新@ConfigurationProperties注解的配置类的配置功能,纯Spring Boot项目中也没有自动刷新配置的好办法,所以我们将使用Apollo作为配置未来的中心。推荐使用@Value或者Environment加载配置,如果在某些场景下必须使用@ConfigurationProperties,需要结合Apollo的监听器来解决。
阿波罗监听器
Apollo已经能够满足我们大部分场景下自动刷新配置的功能,但是如果我们在项目中使用@ConfigurationProperties,就只能使用Apollo监听功能来实现数据刷新。我们可以先在监听器中读取变化的内容,然后调用指定的set方法进行重新赋值操作。
我们在 hailtaxi 司机 itheima 中创建 listener com.com。司机。阿波罗。 Apollo configlistener,代码如下:
@组件
公共类 ApolloConfigListener {
/***
* 数据变化监控
* @param changeEvent
* @抛出异常
*/
@ApolloConfigChangeListener(
value u003d {"stmt", "driver-info"}, //监听指定文件的变化
InterestKeyPrefixes u003d {"platform."}) //在平台中仅在初始键发生变化时监听
公共无效 onChange(ConfigChangeEvent changeEvent) 抛出异常 {
//获取Apollo的所有配置项
设置<String> 字符串 u003d changeEvent.changedKeys();
for(字符串键:字符串){
System.out.println("修改键u003d"+key);
System.out.println("预更改值u003d"+changeEvent.getChange(key).getOldValue());
System.out.println("改变的值u003d"+changeEvent.getChange(key).getNewValue());
}
}
}
我们修改stmt配置,修改后记得发布,如下:
! swz 100104 swz 100105 swz 100103
在该项目中,我们的调试结果如下:
! swz 100107 swz 100108 swz 100106
控制台输出:
更改密钥u003dplatform.address
预变值u003d北京金燕龙科研楼
改值u003d北京金研龙科研楼-北京总部
配置加密
出于安全原因,最好在配置文件中加密敏感信息。例如 MySQL 的用户名和密码,第三方平台的 Token 令牌等。但是,Apollo 没有内置加密功能。官方文件如下:
! swz 100110 swz 100111 swz 100109
项目地址:https://github.com/ctripcorp/apollo-use-cases/tree/master/spring-boot-encrypt
1)密文获取
我们首先使用 StringEncryptor 来获取密文。我们可以先创建一个明文,对明文进行加密,然后在stmt encryptor中创建jasypt。密码 u003d 123456,在程序中加密。
加密测试程序:
@SpringBootTest
@RunWith(SpringRunner.class)
公共类 PasswordTest {
@Autowired
私有 StringEncryptor 加密器;
@测试
公共无效编码(){
字符串密码 u003d "123456";
System.out.println(encryptor.encrypt(password));
}
}
测试运行输出密文:bjLvhdN3k4N2f5wPzlB0VAPmVYQd6o+pyRm24S41rPQG4DIkHH3iwFOXL0k1URti
2)密文输入
我们将密文配置成Apollo,并用enc(密文)装饰。我们在数据连接中对密码进行加密,如下图所示:

接下来,我们运行hailtaxi驱动程序,从数据库中获取指定的驱动信息
http://localhost:18081/driver/info/1
配置加载顺序
Apollo 中多个命名空间的加载顺序是不同的。我们可以在多个命名空间中创建相同的键来测试加载过程。如下所示:

我们配置两个文件,application的drivertype和driver info的drivertype。我们看一下程序中的配置:
服务器:
端口:18081
#Apollo 应用程序
应用程序:
id: hailtaxi-driver-config #Project(应用程序)使用的Apollo编号
阿波罗:
meta: http://192.168.211.145:8080 #Apollo Meta Server地址
引导:
enabled: true #是否开启Apollo配置预加载功能。默认值为假。
急切加载:
enable: true #是否开启Apollo支持日志级别的加载时间。默认值为假。
namespaces: application,stmt,driver-info,springboot-config #使用的Apollo的命名空间。默认为应用程序。
在代码中,我们获取 Spring Environment 对象,因为我们需要从中获取 PropertySource 配置源。
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan(basePackages u003d "com.itheima.driver.mapper")
公共类 DriverApplication {
公共静态无效主(字符串[] args){
ApplicationContext act u003d SpringApplication.run(DriverApplication.class,args);
环境环境 u003d act.getEnvironment();
System.out.println(环境);
}
}
记得在Application.DEBUG中运行出来。 println(环境);代码块中的断点可以
见下图调试信息:

我们可以得出以下结论:
1:关于 apollo.bootstrap 对应一个 CompositePropertySource 对象,即使有对应的多个 Apollo Namespace。并且,多个 Namespace 根据 apollo.bootstrap.namespaces 配置顺序。
2:所有 Apollo 对应的 PropertySource 对象的优先级很高。目前看来只低于 server.ports 对应的 MapPropertySource。基本上,我们可以将其视为最高优先级。
格雷出版
通过创建灰度版本,您可以对某些配置进行灰度测试。灰度化过程如下:
1.创建灰度版本
2.配置灰度配置项
3.配置灰度规则。如果是私有命名空间可以按照客户端IP灰度,如果是公共命名空间可以同时按AppId和客户端IP灰度
4.格雷出版
灰度版本有两个最终结果:完全发布和丢弃灰度 完全发布:灰度配置合并到主版本并发布,所有客户端将使用合并后的配置。丢弃灰度:删除灰度版本,所有客户端将使用主版本的配置。注意:如果灰度版本已经发布,修改灰度规则后,立即生效,不再发布

如下图,如果测试版有附加配置,我们可以点击添加灰色配置
! swz 100128 swz 100129 swz 100127
添加新配置后,点击灰色发布生效
! zwz 100131 zwz 100132 zwz 100130
我们可以将指定IP的服务做成灰度版本。如下图,我们可以选择当前访问过服务的IP。如果还有其他指定的IPS,可以直接手动输入。手动输入多个以逗号分隔的 IPS。当用户访问这些 IPS 指定的服务时,相应的配置就会生效。

手动输入IP
! zwz 100137 zwz 100138 zwz 100136
在实际工作中,全量灰度发布意味着灰度版本没有问题。我们需要将所有服务的所有版本切换到已经完成测试的灰度版本。我们可以点击全卷发布。全量发布时,我们可以删除灰度版本。
! zwz 100140 zwz 100141 zwz 100139
Apollo加载过程
配置加载过程:
spring.factories 配置类开始加载 -> Apollo applicationcontextinitializer 实现 applicationcontextinitializer 这个对象的方法会在spring容器刷新之前执行
Apollo ApplicationContextInitializer:
1:获取ConfigurableEnvironment,Profile信息
2: Config config u003d ConfigService.getConfig(namespace);->执行远程请求(Http request->ConfigServiceLocator.updateConfigServices)获取Apollo Service配置信息
3:获取远程配置文件,解析配置文件并存放在Environment中
公共类 ApolloApplicationContextInitializer 实现
ApplicationContextInitializer<ConfigurableApplicationContext> ,EnvironmentPostProcessor,有序{
公共静态最终 int DEFAULT_ORDER u003d 0;
private static final Logger logger u003d LoggerFactory.getLogger(ApolloApplicationContextInitializer.class);
private static final Splitter NAMESPACE_SPLITTER u003d Splitter.on(",").omitEmptyStrings().trimResults();
私有静态最终字符串[] APOLLO_SYSTEM_PROPERTIES u003d {"app.id", ConfigConsts.APOLLO_CLUSTER_KEY,
"apollo.cacheDir", "apollo.accesskey.secret", ConfigConsts.APOLLO_META_KEY, PropertiesFactory.APOLLO_PROPERTY_ORDER_ENABLE};
私有最终 ConfigPropertySourceFactory configPropertySourceFactory u003d SpringInjector
.getInstance(ConfigPropertySourceFactory.class);
私人 int 订单 u003d DEFAULT_ORDER;
@覆盖
公共无效初始化(ConfigurableApplicationContext 上下文){
ConfigurableEnvironment 环境 u003d context.getEnvironment();
if (!environment.getProperty(PropertySourcesConstants.APOLLO_BOOTSTRAP_ENABLED, Boolean.class, false)) {
logger.debug("Apollo bootstrap 配置未启用上下文 {},请参阅属性:${{}}",上下文,PropertySourcesConstants.APOLLO_BOOTSTRAP_ENABLED);
返回;
}
logger.debug("Apollo bootstrap 配置已启用上下文 {}", context);
初始化(环境);
}
/**
* 在环境准备好之后初始化 Apollo 配置。
*
* @param 环境
*/
受保护的无效初始化(ConfigurableEnvironment 环境){
if (environment.getPropertySources().contains(PropertySourcesConstants.APOLLO_BOOTSTRAP_PROPERTY_SOURCE_NAME)) {
//已经初始化
返回;
}
字符串命名空间 u003d environment.getProperty(PropertySourcesConstants.APOLLO_BOOTSTRAP_NAMESPACES, ConfigConsts.NAMESPACE_APPLICATION);
logger.debug("Apollo bootstrap 命名空间:{}", namespaces);
List<String> namespaceList u003d NAMESPACE_SPLITTER.splitToList(namespaces);
CompositePropertySource 复合 u003d 新 CompositePropertySource(PropertySourcesConstants.APOLLO_BOOTSTRAP_PROPERTY_SOURCE_NAME);
for(字符串命名空间:命名空间列表){
配置配置 u003d ConfigService.getConfig(命名空间);
Composite.addPropertySource(configPropertySourceFactory.getConfigPropertySource(命名空间,配置));
}
environment.getPropertySources().addFirst(复合);
}
公共静态配置 getConfig(字符串命名空间){
返回 s_instance.getManager().getConfig(命名空间);
}
! swz 100143 swz 100144 swz 100142
更多推荐
所有评论(0)