2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

Go 语言分布式系统配置管理实践 --go archaius

  • 2020-03-27
  • 本文字数:1914 字

    阅读完需:约 6 分钟

Go语言分布式系统配置管理实践--go archaius

当单体应用向微服务转型后,有大量的配置需要管理,而你并不希望登录到远端机器去更改配置,并重启应用,尤其是现在已经是容器的时代了,也不希望因为一个配置的变更,而发布一个新的软件包。那么分布式系统中每个进程的动态配置管理及运行时热加载就成为了一个亟待解决的问题。为 go chassis 而生,他汲取了 netflix 的 archaius 框架经验,并做出来自己的创新特性。

架构


  • Source:配置源是一种标准接口,可以通过实现一个 source 来接入不同配置源,它定义配置来自哪个资源,配置可以来自配置中心 configcenter,来自本地文件,来自环境变量或是启动命令行。source 负责将配置项缓存到本地内存。用户可以选择加载任意的 source 实现。

  • Config center source: 配置中心源不同于其他 source,它包含一个 client 抽象,可以对接不同的生态系统,目前对接了携程开源的配置中心 Apollo。

  • Config manager:负责整合管理所有 source 的配置,每个 source 可以定义优先级,当通过 manager 获取配置时,如果 2 个不同的 source 有相同的配置,那么就会取最大优先级的配置。

  • Event Dispatcher:用户可以通过 Archaius API 进行配置变化监听,当 source 内部的配置项新增,更新,删除配置时,都会通知到监听器。

  • Source 优先级:优先级由大到小依次为 Config center,CLI,ENV,file,当有相同配置项的时候仅优先级大的配置生效。在一个分布式系统中,远程的配置中心理应拥有最大优先级,而在本地运行一个独立的进程时,通常的思维是,命令行参数优先级高于环境变量,高于本地文件内容。拥有了这样一套机制后,用户就无需再写代码处理配置项生效逻辑。

  • Config Factory: 封装了 event 和 config manager 的 API

  • Archaius API: 封装底层实现,提供友好的 API 供开发者使用

获取配置

获取配置有 2 种不同的手段:


1.调用 archaius API 的 Get 方法


2.注册监听器


事件的触发是由 soruce 的开发者来决定的,每个 source 的行为会有不同:


命令行与环境变量是不会产生任何事件的,当 archaius 运行后配置项就已经定下来了,只能使用 Get 方法获取。而文件 source 会在启动后拉取一遍本地文件内容并转换为配置项(可自定义转换算法,决定配置项形态),之后持续监听本地文件变化,当有变化发生时会刷新本地配置并通知到监听器。所以 2 种方法都支持。config center source 行为与文件又不同,在启动后,它就会周期拉取配置中心的配置,并且对比每一次配置项的不同,并触发不同类型事件。

配置项形态

假设程序有一个配置文件叫 a.yaml,内容如下


registry:   enabled: true   interval: 30s
复制代码


要考虑该如何去对待这 raw data,目前有 2 种方式


第一种,将配置项拆分为 java properties 风格的配置:


registry.refresh: trueregistry.interval: 30s
复制代码


go archaius 开放了 file handler 接口,允许你决定如何将文件内容处理为配置项



那么在远程的配置中心中,key value 的管理方式就要遵循 file handler 的行为,当你想变更 registry.refresh 时,就要在配置中心种更改这个配置项及值。


类似于开关类的配置项,这种 java properties 的管理方式还是不错的,当一个配置项改变时触发一次事件。


但是有一类配置项并不适合如此管理。


这就是第二种方式,比如 go chassis 中的路由管理配置文件:



通常都需要大范围的更改配置项,那么如果还使用切分的方式在配置中心中管理将会引起 go archaius 运行时大量的事件触发,并且,用户在使用体验上大打折扣,到处去找分散的配置项,逐一更改。正确的行为是,将文件名作为配置中心中的 key,文件内容作为 value。用户需要更改时,去找对应的文件名即可,修改后一次性下发,只会触发一次事件,完成路由的变更。


开发者应根据实际场景判断如何处理配置项形态。也可以自己实现 handler 来决定配置项形态

配置运行时热加载

在运行时可以随时通过统一的配置中心或者本地文件(不推荐分布式环境登到机器里改文件,但在本地 debug 时还是推荐使用文件来测试程序的热加载逻辑)更改配置了,那么接下来要解决的问题就是配置在运行时生效。


这里的技巧是使用 go 语言中的读写锁。我以 go chassis 中路由配置来说明:



go chassis 运行时总是会有不断地大并发数据访问 router config 这块缓存,使用一个读写锁 lock 中的读锁,每次访问缓存都用读锁,使用后,解开读锁。


向 archaius 注册监听器,需要自己编写监听器的逻辑,每当事件出发后就会通过 archaius 中的数据构建一个结构体数据,然后将数据存到本地缓存,首先使用 lock 的写锁锁住 router config,更新后,解开写锁。


在这样的机制下,就可以做到运行时热加载配置项而无需重启服务。


本文转载自华为云产品与解决方案公众号。


原文链接:https://mp.weixin.qq.com/s/bajWt2K0L9nq40Wo3lN06g


2020-03-27 22:051380

评论

发布
暂无评论
发现更多内容

秀出新天际的SpringBoot笔记,让开发像搭积木一样简单

java小李

Spring Boot java架构

星环研发总监为你揭秘TDH8.0的前因后果 | TDH8.0 使用必读

星环科技

渣本展示Spring Cloud 架构绝活!最后成功入职阿里

java小李

Spring Cloud

阿里云技术三面Java岗,只需半个月,就可以成功拿25k offer ,轻松任职阿里云

愚者

Java 阿里云

音视频面试题

hanaper

语音 图像识别 图像处理 视频流 图像增强

数字人民币是现有世界上最完整设计最灵活的央行数字货币

CECBC

被下架三次了,手慢无,23w字中高级Java面试题库!

Java架构师迁哥

Java程序员掌握这份文档,让你刚出来三个月从6K涨到15K

愚者

Java 涨薪

Java基础之hashcode剖析

愚者

Java

阿里云飞天论文获国际架构顶会 ATC 2021最佳论文:全球仅三篇

阿里云大数据AI技术

声网 Agora 音频互动 MoS 分方法:为音频互动体验进行实时打分

声网

算法 网络

拿来吧你!从阿里P8手里抢来的的JDK源码解析手册,Alibaba真的强

java小李

jdk

阿里资深架构师倾情力荐:Java全线成长宝典,P5到P8一应俱全

愚者

Java 面试

鉴释宣布加入RISC-V基金会、Linux基金会、seL4基金会与IoXt联盟, 旨在实现静态代码分析服务的全方位赋能

鉴释

Linux IoT 静态代码分析

硬核!一套基于SpringBoot + Vue 的开源物联网智能家居系统!

编程菌

Java 编程 程序员 项目 计算机

泪目!跳槽太不容易,蚂蚁金服三轮面试,四个小时灵魂拷问

java小李

面试 Leader

史上最全面Java面试指南手册宝典!轻松拿腾讯等大厂offer

愚者

Java 面试

我们向华为公司学什么?

石云升

学习 华为 7月日更

阿里内网疯传的P8“顶级”分布式架构手册,GitHub上线直接霸榜了

java小李

微信业务架构 P8

ES6中的生成器函数是什么?

devpoint

ES6 JavaScrip 7月日更

牛牛牛!一张图,5个章节就把高并发/高可用讲清楚了!

Java架构师迁哥

数字人民币专利数量井喷 智能合约成新方向

CECBC

模块四作业

燕燕 yen yen

架构实战营

大专的我狂刷29天“阿里内部面试笔记”最终直接斩获十七个Offer

java小李

大数据 面试

卧槽这菜鸡程序员不讲武德,年薪居然有50万(50万面经分享)

java小李

面试

再见~ 蚂蚁金服!(已拿offer)

java小李

JavaScript java新语法

详细了解Spring Bean 生命周期

愚者

Java Spring Bean

百分点数据科学实验室:智慧应急安全生产智能决策方案建设实践

百分点认知智能实验室

阿里巴巴中高级java面试题详解,吃透这20道面试题,offer拿到你手软

愚者

Java 面试

对于大部分Java开发者说“60W年薪是无法逾越沟壑”你赞同吗?

愚者

Java 后端

关于机器学习的“灵魂拷问” ,这样的答案硬核!| 云途专栏

亚马逊云科技 (Amazon Web Services)

Go语言分布式系统配置管理实践--go archaius_语言 & 开发_华为云产品与解决方案_InfoQ精选文章