AgileConfig 轻量级配置中心 1.5 发布

Posted 菜鸟耕地

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AgileConfig 轻量级配置中心 1.5 发布相关的知识,希望对你有一定的参考价值。

AgileConfig 从发布到现在,收到不少同学的 issue 说需要多环境的支持。也就是一个应用在不同的环境下可以配置不同的配置项。这是一个非常有用的功能,就跟我们开发的时候会设置多个 appsettings.json 文件一样,比如 appsettings.development.json 、appsetting.production.json 等等。那么这次 1.5 版本就为大家带来了这个功能。
下面介绍下如何使用多环境配置功能。

运行控制台节点

拉取最新的 latest 或者 release-1.5.0 的 docker 镜像,运行控制台节点即可支持多环境配置。

sudo docker run \\
--name agile_config \\
-e adminConsole=true \\
-e db:provider=sqlite \\
-e db:conn="Data Source=agile_config.db" \\
-p 5000:5000 \\
-v /etc/localtime:/etc/localtime \\
#-v /your_host_dir:/app/db \\
-d kklldog/agile_config:release-1.5.0

节点运行起来后,在配置项管理界面的右上角即可切换环境。

自定义环境

AgileConfig 默认内置了 DEV, TEST, STAGING, PROD 四个常用的环境,如果用户觉得不够用或者不想要那么多环境的话可以进行自己定义。
找到数据库的 agc_setting 表,对其中 id = environment 的行进行修改。配置名称之间使用英文输入状态的逗号分隔。

为环境单独配置数据库

AgileConfig 默认情况下会把所有的配置项都存储在 db:conn 指定的数据库下面。但是对于多环境来说,集中式的配置存储显然不太合适。特别是对于生产环境来说不太可能跟开发测试环境都部署在同一个数据库上。AgileConfig 支持对某个环境配置单独的数据库。
在启动节点的时候为某个环境单独配置数据库:

-e db:env:TEST:provider=mysql \\
-e db:env:TEST:conn= "Database=agile_config_test;Data Source=192.168.0.111;User Id=dev;Password=dev@123;port=3306" \\

-e db:env:PROD:provider=mysql \\
-e db:env:PROD:conn= "Database=agile_config_prod;Data Source=192.168.0.1111;User Id=dev;Password=dev@123;port=3306" \\

客户端

为配合 AgileConfig 1.5 版本请使用 AgileConfig.Client 1.2 及以上版本。

Install-Package AgileConfig.Client -Version 1.2.1

在配置文件上指定环境参数,如果不配置那么默认为 DEV 环境。

{
  "AgileConfig": {
    "appId": "test_app",
    "secret": "",
    "env": "DEV"
    "nodes": "http://localhost:5000",
    "name": "client1",
    "tag": "tag1",
  }
}

关于升级

如果从1.4版本升级上来的话,那么请对一下表手动添加字段 env 字段

agc_config;
agc_config_published;
agc_publish_detail;
agc_publish_timeline;

以 mysql agc_config 表为例:
alter table agc_config add env varchar(50)

最后

✨✨✨Github地址:https://github.com/dotnetcore/AgileConfig 开源不易,欢迎star✨✨✨

演示地址:http://agileconfig_server.xbaby.xyz/ 超级管理员账号:admin 密码:123456

关注我的公众号一起玩转技术

QQ群:1022985150 一起探讨学习.NET技术
作者:Agile.Zhou(kklldog)
出处:http://www.cnblogs.com/kklldog/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

.NET轻量级配置中心AgileConfig

描述

基于NetCore开发的轻量级配置中心,部署简单、配置简单,使用简单,可以根据个人或者公司需求采用。

  • 部署简答,最少只需要一个数据节点,支持docker部署

  • 支持多节点分布式部署来保证高可用

  • 配置支持按照应用隔离,应用内配置支持分组隔离

  • 使用长链接技术,配置信息实时推送到客户端

  • 支持IConfiguration、IOptions模式读取配置,原程序几乎不用改造

  • 配置修改支持版本记录,随时回滚配置

  • 所有所有节点都故障,客户端支持从本地缓存读取配置

GitHub地址:https://github.com/kklldog/AgileConfig  可以给这个大佬点个star

如果使用apollo进行部署做配置中心,对于部分公司来讲,过于笨重,所以我个人还是挺推荐这个的,再次感谢kklldog大佬的开源项目。

部署

通过docker部署,目前支持sqlserver,mysql,sqlite, PostgreSql,Oracle 五种数据库。本次示例使用轻量级的sqlite作为数据存储

docker run -d --name agile_config -e adminConsole=true -e db:provider=sqlite -e db:conn="Data Source=agile_config.db" -p 8011:5000 kklldog/agile_config:latest 
  1. adminConsole 配置程序是否为管理控制台。如果为true则启用控制台功能,访问该实例会出现管理界面。

  2. db:provider 配置程序的数据库类型。目前程序支持:sqlite,mysql,sqlserver 三种数据库。

  3. db:conn 配置数据库连接串

进入系统

通过浏览器访问我们地址:http://localhost:8011/

image.png

界面还是简约美观的,第一次登录需要初始化管理员密码,然后登录进入系统

image.png

通过主界面我们看到了下面这个几个菜单

节点:AgileConfig支持多节点部署,所有的节点都是平行的。为了简化部署,AgileConfig并没有单独的控制台程序,请直接使用任意一个节点作为控制台。

image.png

应用:AgileConfig支持多应用程序接入。需要为每个应用程序配置名称、ID、秘钥等信息。每个应用可以设置是否可以被继承,可以被继承的应用类似apollo的公共 namespace 的概念。公共的配置可以提取到可继承应用中,其它应用只要继承它就可以获得所有配置。如果子应用跟被继承应用之间的配置键发生重复,子应用的配置会覆盖被继承的应用的配置。子应用可以继承多个应用,如果多个应用之间发生重复键,按照继承的顺序,后继承的应用的配置覆盖前面的应用。

image.png

创建好应用后我们可以点击列表的配置该应用的配置项。

image.png

新添加的配置并不会被客户端感知到,需要手工点击“上线”才会推送给客户端。

image.png

已上线的配置如果发生修改、删除、回滚操作,会实时推送给客户端。版本历史记录了配置的历史信息,可以回滚至任意版本。

image.png

客户端:可以查看已经连接的客户端

日志:记录一些关键信息的日志

创建客户端

通过VS2019创建一个.Net5的WebAPI应用程序,安装组件

  <ItemGroup>
    <PackageReference Include="AgileConfig.Client" Version="1.1.8.5" />
  </ItemGroup>

连接我们的配置中心,在program中进行配置

    public class Program
    {
        public static IConfigClient ConfigClient;

        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((context, config) =>
                {
                    //读取本地配置
                    var localconfig = new ConfigurationBuilder()
                                     .SetBasePath(Directory.GetCurrentDirectory())
                                     .AddJsonFile("appsettings.json").Build();
                    //从本地配置里读取AgileConfig的相关信息
                    var appId = localconfig["AgileConfig:appId"];
                    var secret = localconfig["AgileConfig:secret"];
                    var nodes = localconfig["AgileConfig:nodes"];

                    //new一个client实例
                    var configClient = new ConfigClient(appId, secret, nodes);
                    //使用AddAgileConfig配置一个新的IConfigurationSource
                    config.AddAgileConfig(configClient);
                    //找一个变量挂载client实例,以便其他地方可以直接使用实例访问配置
                    ConfigClient = configClient;
                    //注册配置项修改事件
                    configClient.ConfigChanged += ConfigClient_ConfigChanged;
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

        /// <summary>
        /// 此事件会在配置项目发生新增、修改、删除的时候触发
        /// </summary>
        private static void ConfigClient_ConfigChanged(ConfigChangedArg obj)
        {
            Console.WriteLine($"action:{obj.Action} key:{obj.Key}");

            switch (obj.Action)
            {
                case ActionConst.Add:
                    break;

                case ActionConst.Update:
                    break;

                case ActionConst.Remove:
                    break;

                default:
                    break;
            }
        }
    }

appsettings添加

  "AgileConfig": {
    "appId": "001",
    "secret": "454551215781234",//密钥
    "nodes": "http://localhost:8011" //多个节点使用逗号分隔
  }

读取配置

AgileConfig支持asp.net core 标准的IConfiguration,跟IOptions模式读取配置。还支持直接通过AgileConfigClient实例直接读取。本文直接注入IConfiguration来获取刚才我们配置的数据库连接信息。

在startup中获取配置

image.png

增加一个接口获取配置信息

    private readonly IConfiguration _configuration;

    public HomeController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    [HttpGet]
    public string Get()
    {
        return _configuration["db:ConnectionString"];
    }

访问接口输出配置

Server=localhost;Database=test;Port=3306;charset=utf8;uid=root;pwd=123456;

在程序不关闭情况下修改配置,测试一下配置是否更新

image.png

请求接口重新获取最近配置(不是实时更新,需要等待一小会,但是满足我们的实际需求)

参考资料

开发作者的文章:https://www.cnblogs.com/kklldog/p/agile-config.html

GitHub中文文档:https://github.com/kklldog/AgileConfig/blob/master/README_CN.md

以上是关于AgileConfig 轻量级配置中心 1.5 发布的主要内容,如果未能解决你的问题,请参考以下文章

AgileConfig轻量级配置中心1.3.0发布,支持多用户权限控制

AgileConfig轻量级配置中心1.4.0发布,重构了发布功能

AgileConfig轻量级配置中心1.3.0发布,支持多用户权限控制

AgileConfig - RESTful API 介绍

AgileConfig 1.5 发布 - 支持多环境配置

AgileConfig 1.6.0 发布 - 支持服务注册与发现