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(比如 ...
随机推荐
- 关于Android Stuido2.3和Eclipse4.4
近3年没有做Android开发了,当时用是ECLISPE电脑配置2g,用的还可以. 现在又重新开始做安卓程序,发现大家都用AS了,作为技术人员,也就开始用了. (几年前AS已经发布,不过是0.x版本, ...
- [Python急救站课程]等边三角形的绘制
等边三角形的绘制 from turtle import * penup() fd(-50) pendown() pensize(25) seth(60) fd(100) seth(-60) fd(10 ...
- Shader学习笔记 (一) :利用shader在一个面绘制出圆
在各种游戏中,想必大家一定和我一样总是惊叹于游戏画面的各种炫酷的特效. 作为游戏开发中单独列出的一个职业TA(Technology Art),他们会利用GLSL或者HLSL等着色器语言绘制出一幅幅美丽 ...
- MySQL概述安装
一,数据库概述 1.为什么要使用数据库 将数据持久化. 持久化主要作用:是将内存中的数据库存储在关系型数据库中,本质也就是存储在磁盘文件中. 数据库在横向上的存储数据的条数,以及在纵向上存储数据的丰富 ...
- Node.js精进(12)——ElasticSearch
ElasticSearch(简称 ES)是一款基于 Lucene 的分布式.可扩展.RESTful 风格的全文检索和数据分析引擎,擅长实时处理 PB 级别的数据. 一.基本概念 1)Lucene Lu ...
- iOS之H5与原生交互
少年易学老难成,一寸光阴不可轻. 1. 利用UIWebView交互 iOS7之前通过UIWebView相关代理方法进行通信.原理:通过协议拦截实现h5对原生的调用,通过直接调用js来实现原生对h5 ...
- 手动部署Kraft模式Kafka集群
手动部署Kraft模式kafka集群 基本信息 IP地址 Hostname Release Kafka-Version 172.29.145.157 iamdemo1 Centos7.9 kafka_ ...
- FOJ有奖月赛-2015年11月 Problem B 函数求解
Problem B 函数求解 Accept: 171 Submit: 540Time Limit: 1000 mSec Memory Limit : 32768 KB Problem D ...
- 企业u盘禁止访问如何解锁
如果您遇到了U盘禁止访问的问题,可能是由于系统设置.安全策略或第三方工具导致的.以下是一些可能的解锁方法,具体的操作可能因具体情况而异: 管理员权限: 确保您有足够的管理员权限来解锁U盘.有时,系统管 ...
- 华企盾DSC控制台+系统运维模块连接不上问题
解决方法:把rundll32.exe进程结束之后再点系统运维模块