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 还提供打包脚本,可以一键生成所有需要的安装包,支持自定义运行时参数

  1. 谁在使用它

国内很多大厂都在使用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

Logo

云原生社区为您提供最前沿的新闻资讯和知识内容

更多推荐