随着微服务成为一种潮流,各种配置也变得越来越烦杂。传统的文本文件的配置方式,已经不能满足现有需求。
缺点如下:
- 修改配置需要重新打包,发布
- 对于一些公共配置,每个应用都要修改,不方便统一管理
分布式配置中心就是为了解决这个问题。
1、原理
分布式配置中心,需要达到以下目的
1:方便的修改配置
2:配置修改后可以热更新,或者通过重启达到目的
先看下流程图
配置统一存储在数据库中,称为配置中心。各个微服务重启的时候,从配置中心读取配置,如果读到配置,则将配置写入本地的配置文件中。如果读取失败,则从本地配置文件中读取配置后,写入数据库中。这样可以保证在数据库失效的时候,应用本地保存的是上次启动的最新配置,不影响微服务启动。
2、实现方式源码概览
1、配置中心核心源码
public class PropertiesFactory {
private PropertiesFactory() {
}
public static Properties createProperties(String projectName, String propertiesName) {
if(System.getenv("PN") != null && !"".equals(System.getenv("PN").trim())) {
projectName = System.getenv("PN");
}
return createPropertiesNoEnvPN(projectName, propertiesName);
}
public static Properties createPropertiesNoEnvPN(String projectName, String propertiesName) {
Properties properties = new Properties();
List<Map<String, String>> propertiesList = new ArrayList();
DataSourceModel dataSourceModel = loadConfig("/configcenter_db.properties");
String rootPath = dataSourceModel.getConfigfilepath();
try {
System.out.println("====================================");
System.out.println(projectName);
System.out.println("====================================");
if(System.getenv("CDB") != null && !"".equals(System.getenv("CDB").trim())) {
dataSourceModel.setIp(System.getenv("CDB"));
}
System.out.println("====================================");
System.out.println(dataSourceModel.getIp());
System.out.println("====================================");
propertiesList = loadConfigFromDb(dataSourceModel, projectName, propertiesName);
System.out.println("================================