配置中心框架IConfCenter
本篇和大家分享的是一個簡易配置中心框架IConfCenter,框架是利用空余時間寫的,主要以配置文件+redis存儲方式作為數(shù)據(jù)同步驅(qū)動,目前支持的配置文件格式有?.properties 和 .config,后期有時間可能增加?.xml?和?.yml文件的識別。
框架結(jié)構(gòu)簡單分為:
- confserver - 服務端
confAdmin - 配置中心后臺管理
confCenter - 配置中心
- confclient - 客戶端
每分鐘獲取配置
訂閱配置中心刷新配置
發(fā)一張配置中心應用到項目中的手工設計圖:
?
confAdmin - 配置中心后臺管理
后臺管理主要就是一個簡單的操作界面,采用springboot+thymeleaf+jquery搭建,目前主要有兩個功能:展示配置文件列表和啟用某個配置
展示配置文件列表:其實就是讀取本地磁盤目錄中的配置文件信息,主要的service代碼如下:
1 /** 2 * 配置文件列表 3 * 4 * @return 5 */ 6 public List<File> getListConf() { 7 File baseFile = new File(confCenterConf.confserver_confs_basepath); 8 File[] files = baseFile.listFiles(); 9 List<File> list = Arrays.asList(files). 10 stream(). 11 sorted(Comparator.comparing(File::lastModified).reversed()). 12 collect(Collectors.toList()); 13 return list; 14 }啟用某個配置:主要通過界面按鈕觸發(fā)ajax提交一個啟動post請求,后端通過解析指定配置文件內(nèi)容為Map結(jié)構(gòu),并永久存儲于Redis緩存中(直到下一次配置內(nèi)容更新),最后通過Redis的發(fā)布功能通知給訂閱該配置的客戶端,讓客戶端通過api重新獲取并更新本地配置。主要的Service代碼如下:
1 /** 2 * 啟用某個配置+通知消費端(訂閱channel規(guī)則:confs_配置文件名) 3 * 4 * @param confPath 5 * @return 6 */ 7 public MoRp qyConf(String confPath) { 8 MoRp rp = new MoRp(); 9 rp.setStatus(EnumHelper.EmRpStatus.失敗.getVal()); 10 11 try { 12 //讀取配置文件 13 Map<String, Object> map = LoadConf.readConfToMap(confPath); 14 if (map.isEmpty()) { 15 rp.setMessage("加載配置文件失敗,稍后重試"); 16 return rp; 17 } 18 19 //文件名稱 20 String filePathToName = LoadConf.getFilePathToName(confPath, true); 21 22 //緩存key 23 String cacheKey = String.format("confs_%s", filePathToName); 24 25 //2018.09.13 臨時增加配置文件修改時間 26 File file = new File(confPath); 27 MoGetConfRp confRp = new MoGetConfRp(); 28 confRp.setConfLastModified(file.lastModified()); 29 confRp.setConfs(map); 30 confRp.setConfVersion(filePathToName); 31 confRp.setStatus(EnumHelper.EmRpStatus.成功.getVal()); 32 33 //存儲到緩存中 永久 34 if (jedisTool.set(cacheKey, confRp, 0)) { 35 36 //發(fā)布消息,通知客戶端更新配置 37 jedisTool.publish(cacheKey, confRp.getConfVersion()); 38 rp.setStatus(EnumHelper.EmRpStatus.成功.getVal()); 39 rp.setMessage(EnumHelper.EmRpStatus.成功.toString()); 40 } 41 } catch (IOException e) { 42 e.printStackTrace(); 43 } 44 return rp; 45 }confCenter - 配置中心
主要提供了一個獲取指定版本的配置文件信息api,信息來源由Redis緩存提供,當Redis緩存不存在時不會去解析配置文件,因此主要用ConfiAdmin管理后臺觸發(fā)數(shù)據(jù)來源。其主要代碼:
/*** 獲取配置信息** @param rq* @return*/public MoGetConfRp getconf(MoGetConfRq rq) {MoGetConfRp rp = new MoGetConfRp();try {//未指定配置版本,采用默認配置版本if (rq.getConfVersion().isEmpty()) {rq.setConfVersion(confCenterConf.confserver_confs_currentConfVersion);}if (rq.getConfVersion().isEmpty()) {rp.setMessage("未找到配置版本");return rp;}//緩存keyString cacheKey = String.format("confs_%s", rq.getConfVersion());//獲取緩存中是否存在rp = jedisTool.get(cacheKey, MoGetConfRp.class);if (rp.getStatus() == EnumHelper.EmRpStatus.成功.getVal() &&rp.getConfs().size() >= 1) {rp.setStatus(EnumHelper.EmRpStatus.成功.getVal());rp.setMessage(EnumHelper.EmRpStatus.成功.toString());return rp;}} catch (Exception e) {e.printStackTrace();}return rp;}confclient - 客戶端
主要干了兩個事情:每分鐘獲取配置和訂閱配置中心刷新配置。該客戶端項目各位可以打包成jar引入項目中,加上相關(guān)配置即可引入配置中心客戶端
每分鐘獲取配置
為了配置內(nèi)容的一致性,這里采用了Scheduled每隔一分鐘請求一下配置中心api,然后通過版本號對比是否有更新,如果對比有新版本那么即可更新緩存于本地的配置信息。主要代碼如:
1 /** 2 * 每分鐘獲取配置,版本號不一致更新本地緩存 3 * 4 */ 5 @Scheduled(initialDelay = 1000 * 60,fixedDelay = 1000 * 60) 6 public void refreshConf() { 7 System.out.println(new Date() + ":當前配置版本" + 8 confCenterConf.confserver_confs_currentConfVersion); 9 if (confCenterConf.confserver_confs_currentConfVersion.isEmpty()) { 10 System.out.println("版本為空,無法自動拉取配置"); 11 return; 12 } 13 updateConf(confCenterConf.confserver_confs_currentConfVersion); 14 } 15 16 /** 17 * 更新本地配置 18 * @param strVersion 19 */ 20 private void updateConf(String strVersion) { 21 //獲取配置中心配置 22 MoGetConfRp rp = confCenterClientService.getConfCenterConf(strVersion); 23 if (rp.getStatus() != EnumHelper.EmRpStatus.成功.getVal()) { 24 return; 25 }else if(rp.getConfLastModified() == confCenterClientService.getConfLastModified()){ 26 return; 27 } 28 System.out.println(new Date() + ":更新本地配置"); 29 //版本不一致,更新本地緩存 30 confCenterClientService.setConf(rp); 31 }訂閱配置中心刷新配置
通過實現(xiàn)CommandLineRunner接口的run方法,在項目啟動時通過Redis訂閱配置中心消息,達到配置中心主動通知更新配置的目的。主要代碼:
/*** 程序啟動執(zhí)行服務 訂閱配置中心刷新配置通道* * @param strings* @throws Exception*/@Overridepublic void run(String... strings) throws Exception {//訂閱配置中心刷新配置通道 jedisTool.subscribe("confs_" + confCenterConf.confserver_confs_currentConfVersion,b -> {System.out.println(new Date() + ":收到配置中心刷新配置通知,版本-" + b);updateConf(b.toString());});}在文章結(jié)尾時,發(fā)一張配置中心后臺管理界面圖,并希望各位能夠喜歡配置中心框架IConfCenter
?
轉(zhuǎn)載于:https://www.cnblogs.com/wangrudong003/p/9668798.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的配置中心框架IConfCenter的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [leetcode] 230. Kth
- 下一篇: 【Python问题解决】关于解决pyth