AgileConfig分布式统一配置

 背景

最近无意中看到了AgileConfig这个开源项目,觉得还挺有用的,之前做分布式的项目的配置要不在数据库中,要不就是在appsettings.json中。

配置在数据库中,一般是有两种方式读取,启动项目的时候初始化,或者在使用这个配置的时候查询一下,这样使用都有些局限性。

配置在appsettings.json中,改配置的时候在服务器上修改,如果有做负载均衡,那是相当麻烦。

 

于是当看到AgileConfig的时候就体验了一下,下载源码编译的话UI编译还挺麻烦的(可能和本人菜有关),最后是直接使用Docker直接部署的(项目介绍上的脚本是不能直接用的,需要自己修改下),在部署成功后基本按照项目介绍来就OK了。

 

 AgileConfig的特点(github摘抄):

  1. 部署简单(UI编译折腾了好一会),最少只需要一个数据节点,支持docker部署
  2. 支持多节点分布式部署来保证高可用
  3. 配置支持按应用隔离,应用内配置支持分组隔离
  4. 支持多环境
  5. 应用支持继承,可以把公共配置提取到一个应用然后其它应用继承它
  6. 使用长连接技术,配置信息实时推送至客户端,热更新
  7. 支持IConfiguration,IOptions模式读取配置,原程序几乎可以不用改造
  8. 配置修改支持版本记录,随时回滚配置
  9. 如果所有节点都故障,客户端支持从本地缓存读取配置

 

使用例子

服务部署

直接上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这样的框架就是非常友好的。

 

posted @   煮酒。  阅读(166)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示