造轮子-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开发的轻量级配置中心。

  1. 部署简单,最少只需要一个数据节点,支持docker部署

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

  3. 配置支持按应用隔离,应用内配置支持分组隔离

  4. 使用长连接技术,配置信息实时推送至客户端

  5. 支持IConfiguration,IOptions模式读取配置,原程序几乎可以不用改造

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

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

架构

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个环境变量需要配置:

  1. adminConsole 配置程序是否为管理控制台。如果为true则启用控制台功能,访问该实例会出现管理界面。

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

  3. 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;        public HomeController(ILogger<HomeController> logger, IConfiguration configuration, IOptions<DbConfigOptions> dbOptions)        {            _logger = logger;            _IConfiguration = configuration;            _dbOptions = dbOptions;        }        public IActionResult Index()        {            return View();        }        /// <summary>        /// 使用IConfiguration读取配置        /// </summary>        /// <returns></returns>        public IActionResult ByIConfiguration()        {            var userId = _IConfiguration["userId"];            var dbConn = _IConfiguration["db:connection"];            ViewBag.userId = userId;            ViewBag.dbConn = dbConn;            return View();        }        /// <summary>        /// 直接使用ConfigClient的实例读取配置        /// </summary>        /// <returns></returns>        public IActionResult ByInstance()        {            var userId = Program.ConfigClient["userId"];            var dbConn = Program.ConfigClient["db:connection"];            ViewBag.userId = userId;            ViewBag.dbConn = dbConn;            return View("ByIConfiguration");        }        /// <summary>        /// 使用Options模式读取配置        /// </summary>        /// <returns></returns>        public IActionResult ByOptions()        {            var dbConn = _dbOptions.Value.connection;            ViewBag.dbConn = dbConn;            return View("ByIConfiguration");        }    }

Github求star:AgileConfig

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

(0)

相关推荐

  • .Net Core with 微服务 - 架构图

    dotNET跨平台 今天 以下文章来源于馒哥不光会玩当耐特 ,作者MJZHOU上一次我们简单介绍了什么是微服务(.NET Core with 微服务 - 什么是微服务).介绍了微服务的来龙去脉,一些基 ...

  • .net5+nacos+ocelot 配置中心和服务发现实现

    最近一段时间 因公司业务需要,需要使用.net5做一套微服务的接口,使用nacos 做注册中心和配置中心,ocelot做网关. 因为ocelot 支持的是consol和eureka,如果使用nacos ...

  • 基于ASP.NET core的MVC站点开发笔记 0x01

    我的环境 OS type:macSoftware:vscodeDotnet core version:2.0/3.1 dotnet sdk下载地址:https://dotnet.microsoft.c ...

  • .Net之配置文件自定义

    dotNET跨平台 今天 以下文章来源于鹏祥 ,作者AZRNG 鹏祥分享.Net相关技术文章,一起学习一起成长 前文讲获取配置文件内容的时候,是获取默认的appsettings.json配置文件的配置 ...

  • .NET轻量级配置中心AgileConfig

    dotNET跨平台 今天以下文章来源于鹏祥 ,作者AZRNG 鹏祥分享.Net相关技术文章,一起学习一起成长描述基于NetCore开发的轻量级配置中心,部署简单.配置简单,使用简单,可以根据个人或者公 ...

  • 对象存储服务

    Mino 目录 Mino 对象存储服务 Minio 参考 Minio 架构 为什么要用 Minio 存储机制 纠删码 MinIO概念 部署 单机部署: Docker 部署Minio 分布式Minio ...

  • .NET 开源配置组件 AgileConfig 初体验

    dotNET跨平台 今天 以下文章来源于全球技术精选 ,作者SpringLeee 介绍 在微服务大行其道的今天,系统会被拆分成多个模块,作为单独的服务运行,同时为了集中化管理,我们还需要日志中心,配置 ...

  • 动手造轮子:实现一个简单的依赖注入(三) --- 支持属性注入

    Intro 前面写了几篇依赖注入的文章,有兴趣的小伙伴可以参考文末 Reference 部分中的链接,一直有小伙伴希望增加属性注入的支持,昨天试着加了一下,思路很简单,在获取到服务实例之后检查实例中有 ...

  • 动手造轮子:实现一个简单的 AOP 框架

    动手造轮子:实现一个简单的 AOP 框架 Intro 最近实现了一个 AOP 框架 -- FluentAspects,API 基本稳定了,写篇文章分享一下这个 AOP 框架的设计. 整体设计 概览 I ...

  • 日系,德系,谁造车更靠谱?一个水壶就能看出区别!

    昨天车友群里一位车友突然抱怨,说自己新买来不久的车,才跑了万把公里,就发现自己爱车发动机舱里,装防冻液的水壶里,水位降低了,降低到刻线下面了.所以他非常害怕,担心自己的车会不会有什么"隐疾& ...

  • 造轮子-ThreadPoolExecutor

    以下代码的实现逻辑出自于公众号 码农翻身 <你管这破玩意叫线程池?> - PS:刘欣老师在我心中是软件技术行业的大刘. 线程池接口 public interface Executor { ...

  • .netcore实现一个读写分离的数据库访问中间件

    在实际业务系统中,当单个数据库不能承载负载压力的时候,一般我们采用数据库读写分离的方式来分担数据库负载.主库承担写以及事务操作,从库承担读操作. 为了支持多种数据库我们先定义一个数据类型字典.key为 ...

  • 小鹏武汉智造基地正式签约,又一个吸引小米回武汉造车的缘由

    小米造车到底准备自己打造智能化造车工厂,还是会代加工? 自从小米宣布造车之后,各方面都在做出努力,武汉的一个经济开发区就在邀请小米回到武汉进行造车,那么小米造车到底准备自己打造智能化造车工厂,还是会代 ...

  • 手写一个类SpringBoot的HTTP框架:几十行代码基于Netty搭建一个 HTTP Server – Programming language

    本文已经收录进 : https://github.com/Snailclimb/netty-practical-tutorial (Netty 从入门到实战:手写 HTTP Server+RPC 框架 ...

  • 石桥码农:如何在本地基于 nideshop 架设一个微信小程序商城?

    目录 一.首先架构服务器端 二.创建数据库 三.尝试运行后端代码 四.配置数据库连接,与初始化数据 五.小程序这一端,下载.导入.运行 六.问题 架设完成后,产品相貌大概长这个样子: 是仿网易严选的小 ...