写点什么

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:051284

评论

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

非常全面的 SpringBoot 保姆级笔记,面面俱到,太牛了

Java spring 微服务 Spring Boot 框架

Java面试集锦

源字节1号

微信小程序 开源 软件开发 后端开发

软件测试/测试开发丨Web自动化 PageObject 设计模式

测试人

程序员 软件测试 自动化测试 测试开发 Web自动化测试

阿里巴巴工程师1480道Java面试题及答案整理( 2023年 整理版)

Java你猿哥

Java MySQL redis JVM java面试

太牛了!在GitHub上“千金难求”的SpringBoot趣味实战课免费分享

Java你猿哥

Java spring Spring Boot ssm SpringBoot实战

软件测试/测试开发丨学习笔记之Web自动化测试

测试人

程序员 软件测试 自动化测试 测试开发 web自动化

Parallels Desktop如何退出账号?PD18虚拟机退出账号方法

Rose

pd18虚拟机 PD如何退出账号 Parallels Desktop下载 Parallels破解版 Mac虚拟机下载

photoshop神经滤镜是什么,神经滤镜功能揭秘~

Rose

photoshop神经滤镜 Neural Filters插件 ps滤镜下载 PS2023破解

学懂缓存雪崩,缓存击穿,缓存穿透仅需一篇,基于Redis讲解

Java你猿哥

Java redis 缓存击穿 缓存雪崩 Redis缓存穿透

GitHub星标126K的京东「微服务进阶笔记」首次开源!好评如潮

Java你猿哥

Java 架构 微服务 Spring Cloud ssm

基于Redis讲解,学懂缓存雪崩,缓存击穿,缓存穿透

Java redis 缓存穿透 缓存击穿 缓存雪崩

简直人生外挂,直接涨薪25K,跪谢这份Java性能调优实战宝典

Java 性能优化 性能调优

阿里“妈宝级”之作,Kubernetes原理剖析与实战应用手册,太全了

Java Kubernetes k8s

Java面试很难?啃完阿里老哥这套Java架构速成笔记,我都能拿30K

分布式事务的21种武器 - 7

俞凡

架构 云原生

关于Spring Cloud Alibaba,看阿里这篇笔记真香

Java你猿哥

分布式事务 微服务 Spring Cloud 服务治理 Spring Cloud Aliababa

AE模板:短信消息聊天对话气泡动画Smart Text Message

Rose

AE模板下载 Smart Text Message 对话框气泡生生成器插件

爆肝了!阿里最新版的这份Spring Security源码手册,狂揽GitHub榜首

Java spring spring security Spring Security OAuth

利用springboot初始化机制三种实现策略模式的应用

Java你猿哥

Java spring Spring Boot 设计模式 ssm

Redis和MySQL的爱恨情仇!

Java你猿哥

Java MySQL redis ssm 缓存雪崩

工厂+策略在springboot项目中的使用场景

Java Spring Boot 工厂模式 策略模式

阿里巴巴Java开发手册(华山版)

Java你猿哥

Java MySQL ssm JAVA开发 Alibaba

DR5白金版 for mac(PS一键磨皮插件Delicious Retouch)支持ps2022 v5.0汉化版

Rose

DR5白金版 PS一键磨皮插件 dr5插件 汉化版PS插件 dr5插件教程

国外顶级架构师编写2580页DDD领域驱动设计笔记,看到内容后破防了

Java 架构 领域驱动设计 DDD

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