Go语言微服务开发框架:Go chassis
摘要:分布式系统中每个进程的动态配置管理及运行时热加载就成为了一个亟待解决的问题。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的更多相关文章
- Thrift是一款由Fackbook开发的可伸缩、跨语言的服务开发框架
这段时间,一直在整理公司的内部 rpc 服务接口,面临的一个问题就是:由于公司内部的系统由几个不同的语言编写的.C# ,java,node.js 等,如何实现这些内部系统之间的接口统一调用,确实是比较 ...
- 2.微服务开发框架——Spring Cloud
微服务开发框架—Spring Cloud 2.1. Spring Cloud简介及其特点 简介: Spring Cloud为开发人员提供了快速构建分布式系统中一些常见 ...
- 分享一个集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo+SkyWalking的微服务开发框架
集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo的微服务开发框架 Github源代码地址 htt ...
- Adnc如何本地调试 - 一个轻量级的.Net Core微服务开发框架
前言 Adnc是一个轻量级的.Net Core微服务开发框架,同样适用于单体架构系统的开发. 如果只是想本地调试,只需要安装必备软件,必备软件除开发工具外,其它软件建议大家都使用`do ...
- 微服务开发框架-----Apache Dubbo
文章目录 一.简介 二.概念与架构 一.简介 Apache Dubbo 是一款微服务开发框架,提供了RPC通信与微服务治理两大关键能力.使用Dubbo开发的微服务,将具备相互之间的远程发现与通信能力, ...
- 如何跟领导解释为什么选择SpringCloud alibaba作为微服务开发框架
什么是微服务 提到微服务不得不提Martin Fowler在2014年3月25日发表的文章 Microservices,里面给出了微服务的定义.后续国内所有关于微服务的介绍都是基于这篇文章的翻译,或加 ...
- 【版本发布】JAVA微服务开发框架,Jeecg-P3 1.0.0 重构版本发布
1.项目介绍 Jeecg-P3是一个微服务框架,采用插件式模式开发:业务插件以JAR方式提供,松耦合可插拔支持独立部署,也可无缝集成Jeecg平台中,目前jeecg已经提供了在线聊天,我的邮箱等一系列 ...
- 一文带你快速入门 Go 语言微服务开发 - Dubbo Go 入门实践总结
更多详细示例可直接访问 Dubbo 官网 或搜索关注官方微信公众号:Apache Dubbo 1. 安装Go语言环境 建议使用最新版 go 1.17 go version >= go 1.15 ...
- 微服务-开发框架之springboot by 大雄daysn
目录 一.关于springboot 二.springboot的实践 2.1发布一个rest的api 2.2端点 2.3健康检查 2.4远程监控 一.关于springboot 由来:spring1.0- ...
- Solon 1.8.0 发布,云原生微服务开发框架
相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...
随机推荐
- 使用 Ant Design Vue 你可能会遇到的14个问题
公司有一个新需求,在原来项目基础上开发,项目中使用 Ant Design Vue,版本是 1.X ,在此记录下遇到的问题:对于没有使用过或者使用程度不深的同学来说,希望可以帮助你在开发中遇到问题时有个 ...
- 全网最详细4W字Flink全面解析与实践(下)
本文已收录至GitHub,推荐阅读 Java随想录 微信公众号:Java随想录 原创不易,注重版权.转载请注明原作者和原文链接 承接上篇未完待续的话题,我们一起继续Flink的深入探讨 Flink S ...
- ❤️接近两万字 CSS之熟练掌握background,这一次帮你彻底弄懂背景属性❤️(建议收藏)
作者:WangMin 格言:努力做好自己喜欢的每一件事 在项目中为了网页的美观,通常会给网页或者某个元素设置背景,这时就会用到 CSS中background属性 来实现这个效果,这个属性是一个很基本的 ...
- "拍牌神器"是怎样炼成的(一)--- 键鼠模拟之WinAPI
作为本系列博文的开篇,有必要先做些声明,用于免责.以绝口水: 博文仅围绕已经弃用的.C/S结构的<上海市个人非营业性客车额度竞拍程序>客户端(NetBidClient)进行介绍,对于正在使 ...
- CSP-J 2023 题解
CSP-J 2023 题解 T1 小苹果 这个题直接遍历枚举必定 TLE,这是 CCF 的出题风格,每题 T1 巨水无比,但是往往又需要一些思维. 这道题我们可以发现每一轮操作都会拿走 \(1 + ( ...
- 抽象工厂(Abstract Factory)
模式定义 提供一个接口, 让该接口负责创建一系列'相关或者相互依赖的对象' , 无需指定他们具体的类 要点总结 如果没有应对'多系列对象构建'的需求变化 ,则没有必要使用Abstract Factor ...
- Python 之 Numpy 框架入门
NumPy 目录 NumPy 基础使用 基本数据类型 创建基本数组 数组属性 数组生成 zeros.ones.empty 数组生成 numpy.zeros numpy.ones numpy.empty ...
- 🔥🔥Java开发者的Python快速进修指南:实战之简易跳表
前言 之前我已经将Python的基本语法与Java进行了比较,相信大家对Python也有了一定的了解.我不会选择去写一些无用的业务逻辑来加强对Python的理解.相反,我更喜欢通过编写一些数据结构和算 ...
- Pycharm 2022 取消双击 shift 搜索框
Pycharm取消双击shift搜索框 基于PyCharm 2022.3.2 (Professional Edition),旧版本修改方式自行搜索 双击shift弹出搜索框,输入内容double mo ...
- Linux笔记03: Linux常用命令_3.1命令的基本格式
3.1命令的基本格式 3.1.1 命令提示符 [root@localhost ~]# 这就是Linux系统的命令提示符.各部分含义如下: ●[]:这是提示符的分隔符号,没有特殊含义. ●root:显示 ...