配置中心 ---zookeeper實現

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介紹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章