AgileConfig分布式统一配置
背景
最近无意中看到了AgileConfig这个开源项目,觉得还挺有用的,之前做分布式的项目的配置要不在数据库中,要不就是在appsettings.json中。
配置在数据库中,一般是有两种方式读取,启动项目的时候初始化,或者在使用这个配置的时候查询一下,这样使用都有些局限性。
配置在appsettings.json中,改配置的时候在服务器上修改,如果有做负载均衡,那是相当麻烦。
于是当看到AgileConfig的时候就体验了一下,下载源码编译的话UI编译还挺麻烦的(可能和本人菜有关),最后是直接使用Docker直接部署的(项目介绍上的脚本是不能直接用的,需要自己修改下),在部署成功后基本按照项目介绍来就OK了。
AgileConfig的特点(github摘抄):
- 部署简单(UI编译折腾了好一会),最少只需要一个数据节点,支持docker部署
- 支持多节点分布式部署来保证高可用
- 配置支持按应用隔离,应用内配置支持分组隔离
- 支持多环境
- 应用支持继承,可以把公共配置提取到一个应用然后其它应用继承它
- 使用长连接技术,配置信息实时推送至客户端,热更新
- 支持IConfiguration,IOptions模式读取配置,原程序几乎可以不用改造
- 配置修改支持版本记录,随时回滚配置
- 如果所有节点都故障,客户端支持从本地缓存读取配置
使用例子
服务部署
直接上docker部署,可以多部署几个节点,数据库可以使用主流的数据库。
这里使用mysql是为了做高可用,单机的话直接使用sqllite。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | sudo docker run \ --name agile_config_1 \ -e TZ=Asia/Shanghai \ -e adminConsole=true \ -e db__provider=mysql \ -e db__conn="Data Source=172.0.0.1;Port=3306;User ID=root;Password=123456;Initial Catalog=testdb;Charset=utf8;SslMode=none;Max pool size=10;" \ -p 5601:5000 \ -d kklldog/agile_config:latest sudo docker run \ --name agile_config_2 \ -e TZ=Asia/Shanghai \ -e adminConsole=true \ -e db__provider=mysql \ -e db__conn="Data Source=172.0.0.1;Port=3306;User ID=root;Password=123456;Initial Catalog=testdb;Charset=utf8;SslMode=none;Max pool size=10;" \ -p 5602:5000 \ -d kklldog/agile_config:latest |
- 节点,部署成功后在浏览器中打开5601端口,进行服务初始化。然后就能看到当前的节点了,有部署其它的节点,一并添加进来,用于做高可用。
- 配置应用,应用对应我们的每个程序服务,比如分布式中用户登录做成一个服务,那么就需要单独在这里新建一个应用,其它模块也是如此。
- 配置项,在应用中点击配置项,对这个应用进行添加配置。
客户端使用
- 新建一个WebApi项目
- 在appsettings.json中添加agileconfig配置
1 2 3 4 5 6 7 8 9 10 11 12 | "AgileConfig" : { "appId" : "TrendsConfigDemo_1" , "secret" : "abcdefg1.." , "nodes" : "http://172.0.0.1:5601,http://172.0.0.1:5602" , // 多个节点使用逗号分隔,会随机连接一个节点 "name" : "TrendsConfigDemo" , "tag" : "tag1" , "env" : "DEV" , "httpTimeout" : "100" , "cache" : { "directory" : "agile/config" } } |
- 在Program.cs配置agileconfig服务
1 2 3 4 | builder.Host.UseAgileConfig( new ConfigClient { Tag = "1" // 用于标记当前的服务 }); |
- 新建一个Home控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [Route( "api/[controller]" )] [ApiController] public class HomeController : ControllerBase { private readonly IConfiguration _IConfiguration; public HomeController(IConfiguration configuration) { _IConfiguration = configuration; } [HttpGet] public string GetConfig( string configName) { return $ "{this._IConfiguration[configName]}" ; } } |
- 启动WebApi项目,并通过API调用获取刚才调用的配置
- 热更新,添加或修改一个配置项,发布后进行获取
- 高可用,停掉正在连接的节点,会自动连接到没有故障的节点
总结
通过统一的界面配置确实是非常省心省力,我们开发追求不就是简单易用,毕竟一件件小事加起来就不是一件小事了,像AgileConfig这样的框架就是非常友好的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现