随着业务的发展、微服务架构的升级,服务的数量、程序的配置日益增多(各类微服务、各类服务器地址、各类参数),传统的配置文件方式和数据库的方式已没法知足开发人员对配置管理的要求:git
所以,分布式配置中心应运而生!github
关于分布式配置中心,网上已经有不少开源的解决方案,例如:shell
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,可以集中化管理应用不一样环境、不一样集群的配置,配置修改后可以实时推送到应用端,而且具有规范的权限、流程治理等特性,适用于微服务配置管理场景。 项目地址:github.com/ctripcorp/a…数据库
Diamond是淘宝研发的分布式配置管理系统。使用Diamond可让集群中的服务进程动态感知数据的变化,无需重启服务就能够实现配置数据的更新。安全
项目地址:github.com/gzllol/diam…服务器
专一于各类「分布式系统配置管理」的「通用组件」和「通用平台」, 提供统一的「配置管理服务」 架构
项目地址:github.com/knightliao/…并发
综合对比,以为携程的Apollo 功能强大完善,github上开源社区比较活跃,代码一直在维护,并且文档写得清楚,故最终选择Apollo 做为咱们的分布式配置中心。下面简要介绍下Apollo项目。框架
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,可以集中化管理应用不一样环境、不一样集群的配置,配置修改后可以实时推送到应用端,而且具有规范的权限、流程治理等特性,适用于微服务配置管理场景。 服务端基于Spring Boot和Spring Cloud开发,打包后能够直接运行,不须要额外安装Tomcat等应用容器。 Java客户端不依赖任何框架,可以运行于全部Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。 .Net客户端不依赖任何框架,可以运行于全部.Net运行时环境。分布式
经过配置中心发布配置: 填写发布信息:
配置发布后,就能在客户端获取到了,以Java为例,获取配置的示例代码以下。Apollo客户端还支持和Spring整合,更多客户端使用说明请参见Java客户端使用指南和.Net客户端使用指南。
Config config = ConfigService.getAppConfig();
Integer defaultRequestTimeout = 200;
Integer requestTimeout = config.getIntProperty("requestTimeout", defaultRequestTimeout);
复制代码
经过上述获取配置代码,应用就能实时获取到最新的配置了。 不过在某些场景下,应用还须要在配置变化时得到通知,好比数据库链接的切换等,因此Apollo还提供了监听配置变化的功能,Java示例以下:
Config config = ConfigService.getAppConfig();
config.addChangeListener(new ConfigChangeListener() {
@Override
public void onChange(ConfigChangeEvent changeEvent) {
for (String key : changeEvent.changedKeys()) {
ConfigChange change = changeEvent.getChange(key);
System.out.println(String.format(
"Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s",
change.getPropertyName(), change.getOldValue(),
change.getNewValue(), change.getChangeType()));
}
}
});
复制代码
Apollo和Spring也能够很方便地集成,只须要标注@EnableApolloConfig后就能够经过@Value获取配置信息:
@Configuration
@EnableApolloConfig
public class AppConfig {}
@Component
public class SomeBean {
//timeout的值会自动更新
@Value("${request.timeout:200}")
private int timeout;
}
复制代码
本文主要介绍和对比了几种开源分布式配置中心的选型,并重点介绍了下咱们最终选择的携程Apollo(阿波罗)分布式配置中心的特性和简单使用,有兴趣的读者能够到具体项目的官网进行详细研究。