1.爲什麼需要配置中心:配置文件存在哪些問題:
【麻煩】集羣/分佈式下修改配置文件,要重啓,每臺服務器重新部署
【安全】敏感信息泄露,(開發接觸的東西越少越好)
【不實時】對於高併發下面,一些關鍵配置,需要及時更新
2.統一配置中心是什麼
config-center分離
配置信息和業務系統分離
配置中心存儲配置信息,業務系統找配置中心獲取配置
配置中心存儲到 數據庫/文件
【特殊】-高可靠(集羣)--(數據一致性?)
對於分佈式系統,多臺服務器獲取配置,修改一個需要實時推送到各個數據庫的
3.基於zooker實現配置中心
抓本質:和數據庫、redis、MQ、Kafka 都是存取數據
zookeeper默認端口:2181
Zookeeper簡介;
提供一種集中式信息存儲服務
你存的是什麼東西,它就是什麼中心
如果存的是實例的ip和端口:他就是註冊中心
如果存的是配置信息:他就是配置中心
如果存的是學籍信息:他就是學籍中心
。。。。。
所有zookeeper被稱爲分佈式系統指揮官
特點:數據存在內存中。類似文件系統的樹形結構(文件和目錄),高吞吐量 、低延遲、集羣高可靠
作用:實現分佈式統一配置中心、服務註冊中心、分佈式鎖等功能。用於分佈式應用程序的高性能協調
代碼實現
zooker是一個分佈式的,開放源碼的分佈式應用程序協調服務, 是Hadoop和Habse的重要zhau'ji
static Properties remoteProperties = new Properties();
@PostConstruct
public void init() {
initProperties("/pay-server-config");
}
public static void initProperties(String path) {
CuratorFramework zkClient = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new RetryOneTime(1000));
zkClient.start();//啓動和zookper連接
try {
List<String> configNames = zkClient.getChildren().forPath(path);//這個節點下面會有很多的配置
for (String configName : configNames) {
System.out.println(configName);
byte[] bytes = zkClient.getData().forPath(path + configName);
// String configValue = new String(bytes);
String configValue = "從遠程zookeeeper上獲取的配置---xxxxxxx";
remoteProperties.put(configName, configValue);
}
//遠程配置中心數據變更及時更新
//不同的zookeeper客戶端不同的寫法
TreeCache treeCache = new TreeCache(zkClient, path);
treeCache.start();
treeCache.getListenable().addListener((curatorFrameworkclient, treeCacheEvent) -> {
System.out.println("數據有變化");
switch (treeCacheEvent.getType()) {
case NODE_ADDED:
System.out.println("節點新增");
break;
case NODE_UPDATED:
System.out.println();
String configName = treeCacheEvent.getData().getPath().replace(path, "");
byte[] data = treeCacheEvent.getData().getData();
//更新
remoteProperties.setProperty(configName, new String(data));
break;
case NODE_REMOVED:
System.out.println();
break;
default:
break;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
private String getRemotePropertyValue(String key) {
String value = remoteProperties.getProperty(key);
return value;
}
zookper介紹