Go进阶 | 如何优雅接入多个远程配置中心?

viper是适用于go应用程序的配置解决方案,这款配置管理神器,支持多种类型、开箱即用、极易上手。,本地配置文件的接入能很快速的完成,那么对于远程apollo配置中心的接入,是否也能很快速完成呢?如果有多个apollo实例都需要接入,是否能支持呢?以及apollo远程配置变更后,是否能支持热加载,实时更新呢?,带着上面的这些问题,结合实际商业项目的实践,已经有较成熟的解决方案。本着分享的原则,现已将xconfig包脱敏开源:github地址[1],欢迎体验和star。,下面快速介绍下xconfig包的使用与能力,然后针对包的封装实践做个讲解,指定配置文件路径完成初始化,即可通过xconfig.GetLocalIns().xxx()链式操作,读取配置,xxx支持的操作方法:,指定配置类型与apollo信息完成初始化,即可通过xconfig.GetRemoteIns(key).xxx()链式操作,读取配置,单实例场景,多实例场景,在本地配置文件config.yaml维护apollo配置信息,然后批量完成多个实例的初始化,即可通过xconfig.GetRemoteIns(key).xxx()链式操作,读取配置,学会使用xconfig包后,能快速的实现本地配置文件和远程apollo配置中心多实例的接入。,再进一步了解这个包在封装过程都中遇到过哪些问题,以及对应的解决方案,能更深入的理解与使用这个包,同时也有助于增加读者自己在封装新包时的实践理论基础。,查看viper的使用文档,会发现viper是支持远程K/V存储连接的,所以一开始我尝试着连接apollo,执行后发现,并不支持apollo,随即查看viper源码,发现只支持以下3个provider,解决方案:,安装shima-park/agollo包: go get -u github.com/shima-park/agollo,安装成功后,只需要在上面代码基础上,最前面加上 remote.SetAppID(“appId”) 即可连接成功,不难发现,在执行 remote.SetAppID(“appId”) 之前,remote.go 中init方法,会往viper.SupportedRemoteProviders中append一个”apollo”,其实就是让viper认识一下这个provider,随后将viper.RemoteConfig 做重新赋值,并重新实现了viper中的Get Watch WatchChannel这3个方法,里边就会做apollo连接的适配。,执行remote.SetAppID(“appId”)之后,这个appId是往全局变量appID里写入的,并且在初始化时也是读取的这个全局变量。带来的问题就是不支持apollo多实例,那么解决呢,解决方案:,既然agollo包能让viper支持apollo连接,那么为什么我们自己的包不能让viper也支持apollo连接呢?并且我们还可以定制化的扩展成多实例连接。实现步骤如下:,核心代码 查看GitHub即可[2]:,首先 viper的使用文档[3],也说明了这个并发读写不安全问题,建议使用sync包避免panic,图片,然后本地通过-race试验,也发现会有这个竞态问题,图片,进一步分析viper实现热加载的源代码:其实是通过协程实时更新kvstrore这个map,读取数据的时候也是从kvstore读取,并没有加锁,所以会有并发读写不安全问题,解决方案:,写:不使用viper自带热加载方法,而是采用重写,也是使用协程实时更新,但会加读写锁。,读:也加读写锁,读写锁核心代码GitHub[4]:,调用agollo包中的相关方法,输入namespace=application.properties(带类型),发现主动拉取数据成功,远程变更通知后数据拉取失败;输入namespace=application(不带类型),发现主动拉取数据成功,远程变更通知后数据拉取也能成功。两者输入差异就在于是否带类型,查看Apollo官方接口文档[5],配置更新推送接口notifications/v2 notifications字段说明,一目了然。,图片,基于上述说明,我们在代码里做了兼容处理,并且配置文件也加上了使用说明,基于实际商业项目实践,提升配置管理组件能力,实现了本地配置文件与远程apollo配置中心多实例快速接入;,从xconfig包的快速上手的使用说明到封装实践难点痛点的解析,双管齐下,让你更深入的理解,希望对你有所帮助与收获。,[1]github地址: https://github.com/jinzaigo/xconfig,[2]查看GitHub即可: https://github.com/jinzaigo/xconfig,[3]viper的使用文档: https://github.com/spf13/viper#is-it-safe-to-concurrently-read-and-write-to-a-viper,[4]读写锁核心代码GitHub: https://github.com/jinzaigo/xconfig,[5]Apollo官方接口文档: https://www.apolloconfig.com/#/zh/usage/other-language-client-user-guide?id=_14-应用感知配置更新,本文转载自微信公众号「 程序员升级打怪之旅」,作者「王中阳Go」,可以通过以下二维码关注。,Go进阶 | 如何优雅接入多个远程配置中心?,转载本文请联系「 程序员升级打怪之旅」公众号。

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/22302.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月5日 上午12:00
下一篇 2023年3月7日 下午10:34