摘要:分布式系统中每个进程的动态配置管理及运行时热加载就成为了一个亟待解决的问题。go chassis汲取了netflix的archaius框架经验,并做出来自己的创新特性。

引言

https://github.com/go-chassis/go-chassis是一个微服务开发框架,而微服务开发框架带来的其中一个课题就是:当单体应用向微服务转型后,有大量的配置需要管理,而你并不希望登录到远端机器去更改配置,并重启应用,尤其是现在已经是容器的时代了,也不希望因为一个配置的变更,而发布一个新的软件包。那么分布式系统中每个进程的动态配置管理及运行时热加载就成为了一个亟待解决的问题。https://github.com/go-chassis/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: true
registry.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://github.com/go-chassis/go-archaius/tree/master/examples/event

管理本地多文件的例子

https://github.com/go-chassis/go-archaius/tree/master/examples/file

Go chassis介绍

https://juejin.im/post/6844903682362834952

本文分享自华为云社区《Go语言分布式系统配置管理实践--go archaius》,原文作者:APTX-486977 。

点击关注,第一时间了解华为云新鲜技术~

Go语言微服务开发框架:Go chassis的更多相关文章

  1. Thrift是一款由Fackbook开发的可伸缩、跨语言的服务开发框架

    这段时间,一直在整理公司的内部 rpc 服务接口,面临的一个问题就是:由于公司内部的系统由几个不同的语言编写的.C# ,java,node.js 等,如何实现这些内部系统之间的接口统一调用,确实是比较 ...

  2. 2.微服务开发框架——Spring Cloud

                     微服务开发框架—Spring Cloud 2.1. Spring Cloud简介及其特点 简介: Spring Cloud为开发人员提供了快速构建分布式系统中一些常见 ...

  3. 分享一个集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo+SkyWalking的微服务开发框架

    集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo的微服务开发框架 Github源代码地址 htt ...

  4. Adnc如何本地调试 - 一个轻量级的.Net Core微服务开发框架

    前言     Adnc是一个轻量级的.Net Core微服务开发框架,同样适用于单体架构系统的开发.     如果只是想本地调试,只需要安装必备软件,必备软件除开发工具外,其它软件建议大家都使用`do ...

  5. 微服务开发框架-----Apache Dubbo

    文章目录 一.简介 二.概念与架构 一.简介 Apache Dubbo 是一款微服务开发框架,提供了RPC通信与微服务治理两大关键能力.使用Dubbo开发的微服务,将具备相互之间的远程发现与通信能力, ...

  6. 如何跟领导解释为什么选择SpringCloud alibaba作为微服务开发框架

    什么是微服务 提到微服务不得不提Martin Fowler在2014年3月25日发表的文章 Microservices,里面给出了微服务的定义.后续国内所有关于微服务的介绍都是基于这篇文章的翻译,或加 ...

  7. 【版本发布】JAVA微服务开发框架,Jeecg-P3 1.0.0 重构版本发布

    1.项目介绍 Jeecg-P3是一个微服务框架,采用插件式模式开发:业务插件以JAR方式提供,松耦合可插拔支持独立部署,也可无缝集成Jeecg平台中,目前jeecg已经提供了在线聊天,我的邮箱等一系列 ...

  8. 一文带你快速入门 Go 语言微服务开发 - Dubbo Go 入门实践总结

    更多详细示例可直接访问 Dubbo 官网 或搜索关注官方微信公众号:Apache Dubbo 1. 安装Go语言环境 建议使用最新版 go 1.17 go version >= go 1.15 ...

  9. 微服务-开发框架之springboot by 大雄daysn

    目录 一.关于springboot 二.springboot的实践 2.1发布一个rest的api 2.2端点 2.3健康检查 2.4远程监控 一.关于springboot 由来:spring1.0- ...

  10. Solon 1.8.0 发布,云原生微服务开发框架

    相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...

随机推荐

  1. 2023 SHCTF-校外赛道 WEB WP

    WEEK1 babyRCE <?php $rce = $_GET['rce']; if (isset($rce)) { if (!preg_match("/cat|more|less| ...

  2. go语言reflection反射

    一.反射 1.1简介 Reflection(反射)在计算机中就是表示程序在运行期间能够探知自身结构的能力类型(类型信息.内存结构.更新变量.以及调用方法) 1.2使用场景 函数的参数类型是interf ...

  3. SNN_SRM模型

    # SRM模型 ## 早期SRM模型 Spike Response Modul(SRM)模型将传统的LIF微分模型换成了一个关于输入.输出的脉冲函数,可以将脉冲神经网络简化为第二代神经网络. 基本公式 ...

  4. CodeDesk-一个新款跨平台桌面开发框架

    CodeDesk 的灵感来自 Electron和Photino.这是一个基于 .NET 的开源项目. CodeDesk 的目标是使开发人员能够在跨平台的本机应用程序中使用 Web UI(HTML.Ja ...

  5. 记一次线上问题引发的对 Mysql 锁机制分析

    背景 最近双十一开门红期间组内出现了一次因 Mysql 死锁导致的线上问题,当时从监控可以看到数据库活跃连接数飙升,导致应用层数据库连接池被打满,后续所有请求都因获取不到连接而失败 整体业务代码精简逻 ...

  6. 大立科技DM63红外相机SDK开发Ⅰ-连接仪器

    1.开发准备 为了方便发开,需要下载Visual Studio,本开发基于Visual Studio 2022,使用C++. 通过Visual Studio创建好项目后,将DMSDK V1.16.3内 ...

  7. Python输入三个整数x,y,z,请把这三个数由小到大输出。

    break_out = False while 1: s = [] for i in range(3): x = int(input('请输入一个数:\n')) if x == -1: # 设计一个退 ...

  8. [GDOIpj221D] 小学生计数题

    第四题 小学生计数题 提交文件: counting.cpp 输入文件: counting.in 输出文件: counting.out 时间空间限制: 1 秒, 256 MB 作为 GDOI 的组题人, ...

  9. 设备唯一标识方法(Unique Identifier):如何在 Windows 系统上获取设备的唯一标识

    原文地址 设备唯一标识方法(Unique Identifier):如何在 Windows 系统上获取设备的唯一标识 zz 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保证 ...

  10. zookeeper JavaApi 删除节点

    /* * 删除节点 * 1.删除单个节点 * 2.删除带有子节点的节点 * 3.必须成功的删除 * 4.回调 * * */ @Test public void delete1() throws Exc ...