什么是分布式配置中心
项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改配置,如果配置出现错误,需要重新打包发布,时间成本较高,因此需要做统一的分布式注册中心,能做到自动更新配置文件信息,解决以上问题。
常用分布式配置中心框架
首选为disconf,可支持KV存储以及配置文件形式存储,使用和开发更为简便。并且本身也是基于zookpeer的分布式配置中心开发,方便部署使用,并且支持实时更新通知操作,但是部署相对复杂。
Diamond(daɪəmənd)基本可以放弃,一般做KV的存储配置项,做配置文件不是很好的选择。
Spring Cloud Config因为依赖git,使用局限性较大,需要在各个环境中安装git,并且不支持KV存储,功能方面略差于disconf
基于Zookeeper实现分布式配置中心
application.yml
itmayiedu: key: yushengjun |
ConfigUtils
@Data
@Component
public class ConfigUtils {
@Value("${itmayiedu.key}")
private String itmayieduKey;
}
MyApplicationRunner
@Component
public class MyApplicationRunner extends BaseZookeeper implements ApplicationRunner {
@Autowired
private ConfigUtils configUtils;
// 启动后执行方法
public void run(ApplicationArguments args) throws Exception {
System.out.println("项目启动成功...");
String itmayieduValue = configUtils.getItmayieduKey();
String itmayieduKey = "/itmayieduKey";
try {
// 创建节点信息
zkClient.createEphemeral(itmayieduKey, itmayieduValue);
} catch (Exception e) {
e.printStackTrace();
}
zkClient.subscribeDataChanges(itmayieduKey, new IZkDataListener() {
public void handleDataDeleted(String dataPath) throws Exception {
}
// 当值发生变化的时候
public void handleDataChange(String dataPath, Object data) throws Exception {
System.out.println("dataPath:" + dataPath + ",data:" + data);
final String strData = (String) data;
configUtils.setItmayieduKey(strData);
}
});
}
}
UpdateInfoService
@Service
public class UpdateInfoService extends BaseZookeeper {
public String updateInfo(String key, String value) {
try {
zkClient.writeData("/" + key, value);
return "success";
} catch (Exception e) {
return "fail";
}
}
}
IndexController
@RestController
public class IndexController {
@Autowired
private ConfigUtils configUtils;
@Autowired
private UpdateInfoService updateInfoService;
@RequestMapping("/getInfo")
public String getInfo() {
return configUtils.getItmayieduKey();
}
@RequestMapping("/updateInfo")
public String updateInfo(String key, String value) {
String updateInfo = updateInfoService.updateInfo(key, value);
return updateInfo;
}
}