当然了,本文的重点不在这,所以咱就不多聊这个。
接着往下看,现在视线挪到架构图底部(CI写配置):
为了保证服务在启动的时候能拿到配置文件,我们需要在CICD的时候就提前把配置从远端拉下来,写入文件,并打包到服务镜像中。
这时候你要问了,从CI到CD可能需要等很久,除了漫长的构建时间之外,可能还有一些更加漫长的审批等待环节,或者等夜深人静的时候延时发布之类的状况,那在此期间如果配置有变更怎么办?我们的配置文件可是提前就打包好了呀!
别急,解决办法这不就来了么!视线回到架构图右上方:
服务部署完毕,正式启动的时候,先执行配置初始化操作(initConfig),从远端配置中心拉取最新的配置到服务器上,并且与旧配置进行融合(Combination),这不就解决了刚刚你担心的配置陈旧的问题了么。
同时,我们需要有一个好习惯,把这份最新的配置存一份文件到服务器本地:
这一步看似多余的备份操作,实则是一次系统稳定性的兜底操作,万一远端配置中心挂了(别人挂不挂咱管不到,咱只能尽可能保证自己不挂),那此时这一份兜底文件就至关重要了!代码实现类似这样:
const fetchRainbowConfig = async () => { try { // ……省略部分代码 // 从远端配置中心拉取最新配置 const config = await rainbowInstance.getGroup(); const configPath = path.join(__dirname, `../../.env/${RAINBOW_GROUP || 'dev'}`); // 写入本地文件 fs.writeFileSync(configPath, JSON.stringify(config)); return config; } catch (error) { console.error('fetch rainbow group config fail!Try to fetch from local'); // 兜底操作,从本地配置文件读取 return fetchConfigFromLocal(); } }
结束了吗?嗯,做到这一步,其实已经是一个相当不错的工程了,但是我还不满足!这顶多算是一个80分的工程。
咱再继续优化,把视线挪到架构图右下方(Config Watcher):
我们再加上一个配置监听器(Config Watcher),用来做什么呢?
聪明的你应该不难看懂,这个监听器,可以实时监听远端配置的更新,从而实现配置热更新,在某些场景下配置变更不再需要重新发布服务。
比如哪天出现一个线上逻辑Bug,需要发一个紧急公告,这时候不用改代码,也不用重新走漫长的CICD流程,只需要在配置系统里加一个公告字段,需要发公告时修改该字段,服务器上的配置监听器就会察觉到更新,立即热更新到内存中。
是不是帅呆了!我愿意打一百分!💯
没错,你做到这一步,这个系统的配置管理模块就算是相当成熟了,既有一定的容灾能力,又有相当的敏捷能力,而且可读性极高,非常利于维护!谁用了不说声好?
好了,一个成熟优秀的企业级配置管理方案,沐洒已经给你倾囊相赠了。
你,学废了吗?
全文完。
码字不易,如果你还想继续看我写的东西,就关注我吧(记得加星标🌟哦),顺便给个赞👍或点一下在看,你的支持是我继续写下去的动力。