集成-AgileConfig基于.NetCore的一个轻量级配置中心
微服务确实是行业的一个趋势,我自己也在把一些项目往微服务架构迁移。玩微服务架构配置中心是一个绕不过去的东西,有很多大牌的可以选,比如spring-cloud-config,apoll,disconf等等。而我为什么还要造一个轮子呢?一来这些都不是.net实现的,我就想试试用.net core实现一个,而且他们也对.net不太友好,也只有apoll提供了官方的.net客户端。二来这些组件都太重量级了,比如apoll,光跑起来就要部署多个节点(admin,portal,meta sevice)还要依赖eureka。很多旧的项目往微服务迁移的时候并不是一下次全部调整完成的,可能是一步步来的,比如先把所有的服务都容器化,并没有使用微服务全家桶。而且有的项目也不需要微服务全家桶,毕竟微服务不是银弹,很多项目单体结构就足够了,有些项目传统的SOA架构也可以了。(唠叨一句,那种毫无流量毫无并发的项目,几人几天就搞完的强上微服务真的好吗?)但是这些项目也可能是分布式的,容器化部署的,那么这些项目我觉得也是需要配置中心的,因为在分布式、容器化环境下更改配置实在是太麻烦了。可以说配置中心并不是微服务独有的。基于以上原因我提炼了一些配置中心必备的功能,做的尽量简单(陋),开发了AgileConfig,为.net core的生态尽一份绵薄之力。
Github求star: AgileConfig
AgileConfig
这是一个基于.net core开发的轻量级配置中心。
- 部署简单,最少只需要一个数据节点,支持docker部署
 - 支持多节点分布式部署来保证高可用
 - 配置支持按应用隔离,应用内配置支持分组隔离
 - 使用长连接技术,配置信息实时推送至客户端
 - 支持IConfiguration,IOptions模式读取配置,原程序几乎可以不用改造
 - 配置修改支持版本记录,随时回滚配置
 - 如果所有节点都故障,客户端支持从本地缓存读取配置
 
架构#

AgileConfig的架构比较简单,主要是分3块:
客户端#
客户端程序是使用netstandard2.0开发的一个类库,方便.net core程序接入,nuget搜agileconfig.client就可以安装。可以在启动客户端的时候配置多个节点的地址,客户端会随机挑选一个进行连接,连接成功后会维持一个websocket长连接。如果连接的节点发生故障导致连接中断,客户端会继续随机一个节点进行连接,直到连接成功。
节点、管理程序#
节点是使用asp.net core开发的一个服务。为了部署简单,直接把管理程序跟节点服务合二为一了。任何一个节点都可以在启动的时候配置环境变量开启管理程序功能。
数据库#
使用数据库来存储数据,目前支持Sqlserver, Mysql, Sqlite 三种数据库。因为服务端使用EF Core框架访问数据,原则上只要EF Core支持的数据库,节点就可以很方便的支持它。
部署服务端#
初始化数据库#
用户只需要手工建一个空库,所有的表在第一次启动的时候都会自动生成。目前支持sqlserver,mysql,sqlite三种数据库。
使用服务端#
运行服务端#
sudo docker run --name agile_config -e adminConsole=true -e db:provider=sqlite -e db:conn="Data Source=agile_config.db" -p 5000:5000 kklldog/agile_config:latest
通过docker建立一个agile_config实例,其中有3个环境变量需要配置:
- adminConsole 配置程序是否为管理控制台。如果为true则启用控制台功能,访问该实例会出现管理界面。
 - db:provider 配置程序的数据库类型。目前程序支持:sqlite,mysql,sqlserver 三种数据库。
 - db:conn 配置数据库连接串
 

初始化管理员密码#
第一次远行程序需要初始化管理员密码

节点#
AgileConfig支持多节点部署,所有的节点都是平行的。为了简化部署,AgileConfig并没有单独的控制台程序,请直接使用任意一个节点作为控制台。当环境变量adminConsole=true时,该节点同时兼备数据节点跟控制台功能。为了控制台能够管理节点,所以需要在控制台配置节点的信息。
注意:即使是作为控制台的数据节点同样需要添加到管理程序,以便管理它。

应用#
AgileConfig支持多应用程序接入。需要为每个应用程序配置名称、ID、秘钥等信息。

配置项#
配置完应用信息后可以为每个应用配置配置项。配置项支持分组。新添加的配置并不会被客户端感知到,需要手工点击“上线”才会推送给客户端。已上线的配置如果发生修改、删除、回滚操作,会实时推送给客户端。版本历史记录了配置的历史信息,可以回滚至任意版本。

客户端#
控制台可以查看已连接的客户端。

系统日志#
系统日志记录了AgileConfig生产中的一些关键信息。

使用客户端#
安装客户端#
Install-Package AgileConfig.Client
初始化客户端#
以asp.net core mvc项目为例:
修改appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*", //agile_config
"AgileConfig": {
"appId": "app",
"secret": "xxx",
"nodes": "http://localhost:5000,http://localhost:5001"//多个节点使用逗号分隔
}
}
修改program:
       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>();
                });
读取配置#
AgileConfig支持asp.net core 标准的IConfiguration,跟IOptions模式读取配置。还支持直接通过AgileConfigClient实例直接读取:
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly IConfiguration _IConfiguration;
private readonly IOptions<DbConfigOptions> _dbOptions;<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">HomeController</span>(<span class="hljs-params">ILogger<HomeController> logger, IConfiguration configuration, IOptions<DbConfigOptions> dbOptions</span>)</span>
{
_logger = logger;
_IConfiguration = configuration;
_dbOptions = dbOptions;
} <span class="hljs-function"><span class="hljs-keyword">public</span> IActionResult <span class="hljs-title">Index</span>()</span>
{
<span class="hljs-keyword">return</span> View();
} <span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag"><summary></span></span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> 使用IConfiguration读取配置</span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag"></summary></span></span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag"><returns></span><span class="hljs-doctag"></returns></span></span>
<span class="hljs-function"><span class="hljs-keyword">public</span> IActionResult <span class="hljs-title">ByIConfiguration</span>()</span>
{
<span class="hljs-keyword">var</span> userId = _IConfiguration[<span class="hljs-string">"userId"</span>];
<span class="hljs-keyword">var</span> dbConn = _IConfiguration[<span class="hljs-string">"db:connection"</span>]; ViewBag.userId = userId;
ViewBag.dbConn = dbConn; <span class="hljs-keyword">return</span> View();
} <span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag"><summary></span></span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> 直接使用ConfigClient的实例读取配置</span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag"></summary></span></span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag"><returns></span><span class="hljs-doctag"></returns></span></span>
<span class="hljs-function"><span class="hljs-keyword">public</span> IActionResult <span class="hljs-title">ByInstance</span>()</span>
{
<span class="hljs-keyword">var</span> userId = Program.ConfigClient[<span class="hljs-string">"userId"</span>];
<span class="hljs-keyword">var</span> dbConn = Program.ConfigClient[<span class="hljs-string">"db:connection"</span>]; ViewBag.userId = userId;
ViewBag.dbConn = dbConn; <span class="hljs-keyword">return</span> View(<span class="hljs-string">"ByIConfiguration"</span>);
} <span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag"><summary></span></span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> 使用Options模式读取配置</span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag"></summary></span></span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag"><returns></span><span class="hljs-doctag"></returns></span></span>
<span class="hljs-function"><span class="hljs-keyword">public</span> IActionResult <span class="hljs-title">ByOptions</span>()</span>
{
<span class="hljs-keyword">var</span> dbConn = _dbOptions.Value.connection;
ViewBag.dbConn = dbConn; <span class="hljs-keyword">return</span> View(<span class="hljs-string">"ByIConfiguration"</span>);
}
}
折叠
Github求star:AgileConfig
集成-AgileConfig基于.NetCore的一个轻量级配置中心的更多相关文章
- 造轮子-AgileConfig基于.NetCore的一个轻量级配置中心
		
微服务确实是行业的一个趋势,我自己也在把一些项目往微服务架构迁移.玩微服务架构配置中心是一个绕不过去的东西,有很多大牌的可以选,比如spring-cloud-config,apoll,disconf等 ...
 - AgileConfig - 轻量级配置中心1.2.0发布,全新的UI✨✨✨
		
AgileConfig自发布以来有个"大问题"-UI太丑.因为当初这个项目是给自己用的,连UI界面都没有,全靠手动在数据库里改配置.后来匆匆忙忙使用bootstrap3简单的码了一 ...
 - YARP+AgileConfig 5分钟实现一个支持配置热更新的代理网关
		
YARP 是微软开源的一个反向代理项目,英文名叫 Yet Another Reverse Proxy .所谓反向代理最有名的那就是 nginx 了,没错 YARP 也可以用来完成 nginx 的大部分 ...
 - spring cloud 入门系列七:基于Git存储的分布式配置中心
		
我们前面接触到的spring cloud组件都是基于Netflix的组件进行实现的,这次我们来看下spring cloud 团队自己创建的一个全新项目:Spring Cloud Config.它用来为 ...
 - ZooKeeper系列(2)--基于ZooKeeper实现简单的配置中心
		
ZooKeeper节点的类型分为以下几类: 1. 持久节点:节点创建后就一直存在,直到有删除操作来主动删除该节点 2. 临时节点:临时节点的生命周期和创建该节点的客户端会话绑定,即如果客户端会话失效 ...
 - spring cloud 入门系列七:基于Git存储的分布式配置中心--Spring Cloud Config
		
我们前面接触到的spring cloud组件都是基于Netflix的组件进行实现的,这次我们来看下spring cloud 团队自己创建的一个全新项目:Spring Cloud Config.它用来为 ...
 - AgileConfig轻量级配置中心1.3.0发布,支持多用户权限控制
		
AgileConfig 当初是设计给我自己用的一个工具,所以只设置了一道管理员密码,没有用户的概念.但是很多同学在使用过后都提出了需要多用户支持的建议.整个团队或者整个公司都使用同一个密码来管理非常的 ...
 - AgileConfig轻量级配置中心1.4.0发布,重构了发布功能
		
加入 NCC 先说一个事,AgileConfig 在 7 月底终于通过了 NCC 社区的审核,正式成为了 NCC 大家庭的一员.这对 AgileConfig 来说是一个里程碑,希望加入 NCC 后能更 ...
 - AgileConfig 轻量级配置中心 1.5 发布 - 支持多环境配置
		
AgileConfig 从发布到现在,收到不同学的 issue 说需要多环境的支持.也就是一个应用在不同的环境下可以配置不同的配置项.这是一个非常有用的功能,就跟我们开发的时候会设置多个 appset ...
 - .Net Core+分布式配置中心(AgileConfig)
		
GitHub上AgileConfig非常详细,以下只是本人学习过程的整理 一.介绍 1.参考地址 https://github.com/dotnetcore/AgileConfig https://w ...
 
随机推荐
- oracle SDO_ORDINATE_ARRAY直接展示
			
mdsys.sdo_geometry 中SDO_ORDINATE存储的是空间对象的几何节点坐标序列,要想直接展示第一条值出来需要捞出数据 若select t.id,t.shape.sdo_ordina ...
 - mysql之数据类型-第三篇
			
mysql数据库中的每个列都应该有适当的数据类型,用于限制或允许该列中存储的数据.mysql的数据类型分别有整数,浮点数和定点数类型,日期和时间类型,字符串类型和二进制类型等. 整数类型 数值型数据类 ...
 - Jmeter、Postman之RSA加密登录接口测试
			
方法1:直接用在线加密工具进行加密,得到密码 参考地址 https://www.toolscat.com/decode/rsa 输入公钥和密码,直接加密即可 方法2:postman工具 步骤1:接 ...
 - redis中获取区间数据及获取总条数
			
import redis REDIS_ITEMS_HOST: str = host REDIS_ITEMS_PASSWORD: str = pwd REDIS_ITEMS_DB: int = 4 #查 ...
 - Linux系列---【U盘插入后,linux系统如何查看U盘中的内容?】
			
U盘插入后,linux系统如何查看U盘中的内容? 1.插入U盘 2.输入命令查看U盘是否插入成功 sudo fdisk -l 输入上面命令后,在最下面Device Boot一栏查看自己的U盘所在的分区 ...
 - 字典:求和计数(return知识巩固)
			
野餐用品计数 之前写过一段,字符在字符串中出现次数的代码 import pprint message = 'It was a bright cold day in April, ' \ 'and th ...
 - JMeter线程
			
线程Threads:场景设置,模拟并发用户发送请求,设置并发策略.即以线程的方式来模拟多用户并发的.常用线程包括:线程组. jp@gc-Stepping Thread Group.bzm-Arriva ...
 - 【技术指北】通过SMB协议在iOS和Windows之间传输文件
			
windows操作 新建文件夹 设置文件夹的属性,选择共享 设置高级共享,权限选择完全控制 选择共享,选择Everyone cmd - ipcofig,获取ipv4地址 iOS操作 打开文件管理器 选 ...
 - [.Net]Framwork WebAPI添加接口请求监控
			
思路: 通过重写 ActionFilterAttribute 拦截Action的请求及返回信息,实现对接口请求的监听. 最终效果如下: 全局启用需配置如下: 局部启用需配置如下: 源码如下: 1 // ...
 - windows下查找端口、PID、查找进程、杀死进程
			
查找端口 netstat -ano|findstr "1099" TCP 0.0.0.0:1099 0.0.0.0:0 LISTENING 10120 TCP [::]:1099 ...