5.1 配置中心组件
本节主要介绍当前比较成熟的一些开源配置中心组件,包括 XXL-CONF、Apollo 和 Spring Cloud Config。以上 3 个组件都可以在 GitHub 上找到源码,其中,XXL-CONF 和 Apollo 是国产开源组件,都带有管理平台页面,操作直观,Spring Cloud Config 是 Spring Cloud 家族提供的配置方式,它基于 git 仓库存储配置文件,没有提供 Web 管理界面。
5.1.1 XXL-CONF 组件简介
XXL-CONF 是一个轻量级的分布式配置管理平台,具有轻量级、秒级动态推送、多环境部署、跨机房部署、动态监听配置、权限控制和版本快速回滚等多种特性,可以开箱即用。
- 轻量级:接入灵活,快速上手,不依赖于第三方服务,部署简单。
- 高可用:支持集群部署和跨机房部署,提供 Web 管理界面,直观、高效。
- 多环境:配置可以在测试环境和线上环境等多种环境中进行。
- 多数据类型:可以对不同的数据类型进行配置。
- 高性能:基于配置中心的磁盘存储及客户端本地缓存,数据可实时更新。
- 灵活配置:支持 API、注解和 XML 占位符的方式。
- 权限控制:多项目隔离及用户权限控制。
- 版本回滚:记录 10 个历史版本,支持历史版本回滚。
XXL-CONF 的整体架构如图 5.1 所示。
图 5.1 XXL-CONF 架构图
XXL-CONF 配置管理平台主要由以下几部分组成:
- 管理平台:一个功能完善的配置平台后台管理页面,包括环境、用户、项目和配置等管理功能,通过简单的 UI 页面完成操作管理。
- 管理平台数据存储:存储配置信息的备份和版本修改记录等,保证数据的安全,同时存储管理平台的底层数据。
- 配置数据的磁盘存储:配置中心在每个集群节点的磁盘中存储着一份镜像数据,当进行配置新增和更新等操作时,将会广播通知并实时刷新每个集群节点磁盘中的配置数据,再实时发送通知给接入的客户端。
XXL-CONF 客户端的架构如图 5.2 所示。客户端的四层设计如下:
图 5.2 XXL-CONF 客户端
- API 接口层:提供了开放的 API 接口,业务方可以直接使用,简单、方便,同时还能保证配置的高效和实时性。
- 本地缓存层:客户端采用本地缓存可以极大地提高 API 接口层的性能,从而降低对配置中心集群的访问压力。首次读取配置信息、监听配置信息的变更以及异步或同步配置时,都将配置信息写入缓存中或对缓存进行更新。
- 镜像文件层:配置信息的本地快照文件,会周期性地同步本地缓存层中的配置信息并将其写入镜像文件中。当应用无法从配置中心获取配置数据时,将会使用镜像文件中的配置数据,这样可以提高系统的高可用性。
- 远程层:配置中心远程客户端的封装,用于加载远程配置,实时监听配置变更情况,提高配置的时效性。
下面搭建 XXL-CONF 配置中心管理平台。
(1)使用 git clone https://github.com/xuxueli/xxl-conf.git 命令拉取项目到本地,然后获取数据库的初始化 SQL 脚本并执行,路径为 xxl-conf/doc/db/xxl-conf.sql。
(2)修改配置文件/xxl-conf/xxl-conf-admin/src/main/resources/application.properties,并配置本地 MySQL 路径。具体配置如下:
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-conf?Unicode =true&characterEncoding=UTF-8 xxl.conf.confdata.filepath=/data/xxl-conf/confdata xxl.conf.access.token=
(3)项目编译打包后可直接通过命令行 java-jar xxl-conf-admin.jar 启动。启动后打开管理页面,分别进行用户管理、项目管理、环境管理和配置管理的设置,具体操作如图 5.3 至图 5.6 所示。
图 5.3 用户管理页面
图 5.4 项目管理页面
图 5.5 环境管理页面
图 5.6 配置管理页面
(4)在项目中引入 XXL-CONF。修改项目的 application.yml 文件,配置 XXL-CONF 信息,具体代码如下:
xxl: conf: admin: address: http://localhost:8080/xxl-conf-admin env: test access: token: mirrorfile: /data/xxl-conf/xxl-conf-mirror.properties
(5)在项目中添加自动配置类 XxlConfConfig,代码如下:
//配置 XXL-CONF @Configuration public class XxlConfConfig { @Value("${xxl.conf.admin.address}") private String adminAddress; @Value("${xxl.conf.env}") private String env; @Value("${xxl.conf.access.token}") private String accessToken; @Value("${xxl.conf.mirrorfile}") private String mirrorfile; //定义 XxlConfGactory @Bean public XxlConfFactory xxlConfFactory() { XxlConfFactory xxlConf = new XxlConfFactory(); xxlConf.setAdminAddress(adminAddress); //管理后台路径 xxlConf.setEnv(env); //运行环境 xxlConf.setAccessToken(accessToken); //设置 Token xxlConf.setMirrorfile(mirrorfile); //设置镜像文件 return xxlConf; } }
(6)客户端获取配置信息。有 3 种获取配置数据的方式,分别为使用客户端 API、注解 @XxlConf 和 XML 占位符。本例采用注解方式,代码如下:
@XxlConf("default.userName") public String userName;
(7)XXL-CONF 提供了监听 Listener,用于监听配置的变更事件,代码如下:
//监听处理 XxlConfClient.addListener("default.userName", new XxlConfListener(){ @Override public void onChange(String key, String value) throws Exception { logger.info("配置数据发送变更:{}={}", key, value); } });
5.1.2 Apollo 组件简介
Apollo(阿波罗)是携程公司开源的一款分布式配置管理中心,可以集中管理不同环境下的应用配置信息。配置数据修改后,可以将其实时推送到服务端。Apollo 同时还提供了权限管理和发布流程管理功能,适用于各种需要配置管理的场景,支持应用(Application)、环境(Environment)、集群(Cluster)和命名空间(Namespace)4 个维度的配置。
Apollo 具有以下特性:
- 提供统一的管理页面,可以管理不同的环境和集群。
- 可以使配置实时生效。
- 应用部署的发布与版本回滚。
- 可以对配置进行权限管理。
Apollo 的整体架构如图 5.7 所示。
图 5.7 Apollo 架构图
图 5.7 中的 Apollo 主架构主要分为以下几部分:
- 配置服务(Config Service):提供读取、推送配置数据等功能,主要为 Apollo 客户端服务。
- 后台页面服务(Admin Service):提供 UI 页面,可以修改和发布配置数据,服务对象是 Apollo Portal(管理界面)。
- 注册发现服务(Eureka):集成了 Eureka,主要用于服务的注册和发现。
- 元数据服务(Meta Server):封装了 Eureka 的服务发现接口。
从上往下可以看到,客户端首先访问 Meta Server 获取配置服务列表(IP+Port),然后直接通过 IP+Port 的方式访问服务,同时在客户端进行负载均衡、错误重试等操作,后台管理页面通过访问 Meta Server,获取 Admin Service 进行配置数据修改等操作。
Apollo 的客户端架构如图 5.8 所示。
图 5.8 Apollo 客户端架构图
Apollo 客户端的实现原理:客户端和服务端维持一个长连接,用来快速获取配置数据修改的推送通知。客户端定时从 Apollo 配置中心服务端获取应用的最新配置,然后将配置数据保存在本地内存中进行缓存,同时在本地磁盘也缓存一份。
下面讲解 Apollo 的搭建过程。
(1)Apollo 提供了 Quick Start,从 https://github.com/nobodyiam/apollo-build-scripts.git 上下载工程例子,并执行相关 SQL 语句。
(2)修改数据库配置数据,具体如下:
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB? characterEncoding=utf8 apollo_config_db_username=用户名 apollo_config_db_password=密码 apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB? characterEncoding=utf8 apollo_portal_db_username=用户名 apollo_portal_db_password=密码
(3)执行脚本./demo.sh start 启动服务,访问 http://localhost:8070,输入用户名 apollo 和密码 admin 后登录,其主页面如图 5.9 所示。
图 5.9 Apollo 管理主页面
(4)主页面中展示了配置信息,如图 5.10 所示。
图 5.10 Apollo 配置信息
(5)如果本地服务想要接入 Apollo 平台,则需要配置相关属性,例如:
app.id=YOUR-APP-ID apollo.meta=http://config-service-url apollo.cacheDir=/opt/data/some-cache-dir env=DEV apollo.cluster=SomeCluster apollo.accesskey.secret=1cf998c4e2ad4704b45a98a509d15719 apollo.bootstrap.enabled = true apollo.bootstrap.namespaces = application,FX.apollo,application.yml
(6)Apollo 提供了多种方式获取配置数据。下面采用 Spring Boot 配置注解的方式获取,代码如下:
public class TestApolloAnnotationBean { @ApolloConfig private Config config; //注入配置 @ApolloConfig("application") private Config anotherConfig; //通过 applicationg 命名注入 @ApolloConfig("FX.apollo") private Config yetAnotherConfig; //通过 FX.apollo 命名注入 @ApolloConfig("application.yml") private Config ymlConfig; //通过 application.yml 注入 @ApolloJsonValue("${jsonBeanProperty:[]}") private List<JsonBean> anotherJsonBeans; @Value("${batch:100}") private int batch; //配置监听 @ApolloConfigChangeListener private void someOnChange(ConfigChangeEvent changeEvent) { //修改属性 if (changeEvent.isChanged("batch")) { batch = config.getIntProperty("batch", 100); } } //配置监听 @ApolloConfigChangeListener("application") private void anotherOnChange(ConfigChangeEvent changeEvent) { //do something } //监听配置 @ApolloConfigChangeListener({"application", "FX.apollo", "application.yml"}) private void yetAnotherOnChange(ConfigChangeEvent changeEvent) { //do something } //获取配置 public int getTimeout() { return config.getIntProperty("timeout", 200); } //获取配置 public int getBatch() { return this.batch; } private static class JsonBean{ private String someString; private int someInt; } }
(7)新建配置类 AppConfig,生成 TestApollAnnotationBean 实例,具体代码如下:
@Configuration @EnableApolloConfig public class AppConfig { @Bean public TestApolloAnnotationBean testApolloAnnotationBean() { return new TestApolloAnnotationBean(); } }
5.1.3 Spring Cloud Config 组件简介
Spring Cloud Config 是 Spring Cloud 家族的一个开源组件,它为分布式系统提供配置支持,通过配置中心管理微服务所有环境下的配置信息。Spring Cloud Config 默认采用 Git 作为配置中心,其主要特性如下:
- 提供对服务端和客户端的支持。
- 进行集中式的配置管理。
- 与 Spring Boot 和 Spring Cloud 应用无缝集成。
- 默认基于 Git 进行版本管理。
Spring Cloud Config 架构如图 5.11 所示。
图 5.11 Spring Cloud Config 架构
接下来介绍基于 Spring Cloud Config 配置中心的搭建过程。
(1)首先在个人 GitHub 网站上新建自己的仓库,本例中的仓库名为 config-repo,然后在仓库中新建 4 个配置文件。
config-client.yml 文件内容如下:
#定义属性 name: config-client-default
config-client-dev.yml 文件内容如下:
#定义属性 name: config-client-dev
config-client-test.yml 文件内容如下:
#定义属性 name: config-client-test
config-client-prod.yml 文件内容如下:
#定义属性 name: config-client-prod
(2)搭建 config-server 工程,依赖 spring-cloud-config-server 包,代码如下:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> <version>2.2.5.RELEASE</version> </dependency>
(3)修改 config-server 工程的配置文件 application.yml,在其中添加 Git 仓库配置,具体如下:
spring: cloud: config: server: git: uri: https://github.com/xxx/config-repo username: test password: 123456 default-label: master
(4)在启动类中添加注解 @EnableConfigServer,使启动服务后即可访问配置文件。访问配置文件有一定的规则,具体如下:
/{application}/{profile}[/{label}] /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties /{label}/{application}-{profile}.properties
其中,{application}为应用名称,{profile}为环境配置,{label}为 Git 的分支。
访问 4 个 URL:http://localhost:8080/config-client/default、http://localhost:8080/ config-client/dev/master、http://localhost:8080/config-client-test.yml 和 http://localhost: 8080/master/config-client-prod.yml,均可以获取配置数据。
(5)搭建客户端工程 config-client,依赖 spring-cloud-starter-config 包,然后修改 bootstrap.yml 文件,代码如下:
spring: cloud: config: name: config-client uri: http://localhost:8080 label: master profile: dev
(6)新建 Controller 类访问配置数据,代码如下:
@RestController public class ConfigController { @Value("${name}") private String name; @GetMapping("/name") public String getName() { return name; } }
启动服务访问接口即可获取 name 配置数据。本节只介绍了 Spring Cloud Config 的基本配置,如果想实现动态地修改配置,可以结合 Webhook 或者 Spring Cloud Bus 进行配置修改的实时刷新。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论