diamond源碼解析

diamond-client獲取配置信息
DiamondManager manager = new DefaultDiamondManager("1", new ManagerListener() {
    @Override
    public Executor getExecutor() {
        return null;
    }

    @Override
    public void receiveConfigInfo(String configInfo) {
        System.out.println("receive config: " + configInfo);
    }
});
String configInfo = manager.getAvailableConfigureInfomation(1000);

配置文件:

diamond.properties

diamond.port=8081
diamond.config.ip=192.168.2.183

 

配置文件的解析在DiamondConfigure.java的loadConfig()方法

private void loadConfig() {
    URL url = this.getClass().getClassLoader().getResource("diamond.properties");
    if (url != null) {
        File file = new File(url.getFile());
        Properties prop = new Properties();
        try {
            prop.load(new FileInputStream(file));
            configServerAddress = prop.getProperty(Constants.CONF_KEY_CONFIG_IP, Constants.DEFAULT_DOMAINNAME);
            String portStr = prop.getProperty(Constants.CONF_KEY_PORT, "8080");
            try {
                port = Integer.parseInt(portStr);
            } catch (NumberFormatException nfe) {
                port = 8080;
            }
            //新增
            configServerPort=port;
        } catch (IOException e) {
        }
    }
}

啓動訂閱者DefaultDiamondSubscriber.java的start()方法

獲取server服務器地址在ServerAddressProcessor.java的synAcquireServerAddress()和asynAcquireServerAddress()方法

創建了一個線程每300s刷新一次,請求內容存放在System.getProperty("user.home")\diamond\ServerAddress文件中

調用diamond-server的/url.do接口獲取數據

客戶端動態讀取配置文件

間隔爲15s檢測一次

掃描順序爲:本地data文件、diamond服務端、本地snapshot文件

調用DefaultDiamondSubscriber.java的getProbeUpdateString()方法獲取請求參數,格式爲:1DEFAULT_GROUPd8a6e29458f5a2bcadc1177cd83bb4e0(dataId++group++md5)

請求diamond-server的/config.co接口,

diamond-server

 

contentMD5Cache的數據是TimerTaskService中通過@PostConstruct標籤被spring掃描進去的,創建線程池,每10分鐘dump一遍數據到contentMD5Cache中,diamond-server系統中維護配置內容會修改contentMD5Cache數據。

系統維護的代碼最後調用的configService.updateConfigInfo(String dataId, String group, String content)修改的。

 

diamond-server集羣相互同步配置

集羣服務器配置在node.properties裏面

通過發送http請求調用各個節點服務的/diamond-server/notify.do?method=notifyConfigInfo&dataId=&group=接口進行通知修改

此處存在一個問題,集羣數據同步的時候,連接不同的mysql數據庫,mysql數據庫的數據需要自己同步