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数据库的数据需要自己同步