造輪子-AgileConfig基於.NetCore的一個輕量級配置中心

来源:https://www.cnblogs.com/kklldog/archive/2020/06/29/agile-config.html

微服務確實是行業的一個趨勢,我自己也在把一些項目往微服務架構遷移。玩微服務架構配置中心是一個繞不過去的東西,有很多大牌的可以選,比如spring-cloud-config,apoll,disconf等等。而我為什麼還要造一個輪子呢?一來這些都不是.net實現的,我就想試試用.net core實現一個 ...


微服務確實是行業的一個趨勢,我自己也在把一些項目往微服務架構遷移。玩微服務架構配置中心是一個繞不過去的東西,有很多大牌的可以選,比如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

關註我的公眾號一起玩轉技術


您的分享是我們最大的動力!

更多相關文章
  • 1.迭代器 迭代器為我們提供了統一遍歷容器(List/Map/Set)的方式 1.遍歷List或Set 2.遍歷Map 2.Collections工具類 類java.util.Collections提供對Set、List、Map進行排序、填充、查找元素的輔助方法 1.void sort(List): ...
  • 為了方便大家理解我把之前方案的圖片複製過來了,如下: 上圖的方案存在一個問題,就是我們今天文章要聊的內容。 這個問題就是當 MQ Consumer 收到消息後,就直接發佈 Event 了,如果是同步的,沒有問題。如果某個 EventListener 中處理失敗了,那麼這條消息將不會 ACK。 如果是 ...
  • 帶你捅破窗戶紙 Bash Shell 30min 過家家.zip 備註 : @博客園 : 1. 為什麼不支持 pdf 上傳了呀 2. 網站分類不好用 3. 排版OA工具升級下, 例如 markdown 寫出來好醜. 嘗試升級下呢 ? ...
  • 在項目開發中經常會遇到花錢抽獎類型的需求。但是老闆總是擔心用戶用小錢抽到大獎。這樣會導致項目虧損。下邊這段代碼可以有效制止抽獎項目虧錢。 個人獎池: 語言:thinkphp redis mysql 表:desire抽獎商品表 desire_log用戶抽獎獎品表 user_desire_log用戶抽獎 ...
  • 知識點 關鍵字,常用類(super,static,final): super 子類對父類的引用,只能在非靜態方法中使用 引用父類的成員變數的格式為 super.成員變數名稱 引用父類的非靜態方法的格式為 super.方法名(參數列表) 引用父類的構造方法的格式為 super(參數列表) final ...
  • The piped stream are bidirectional communcation.Meanwhile they can read and write. Write the NamedPipeServerStream and NamedPipeClientStream in two di ...
  • 場景 ASP.NET中MVC編程模式簡介與搭建HelloWorld項目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/106795640 在上面使用MVC搭建起來Hello World項目後,怎樣連接SqlServer資料庫並實 ...
  • 今天遇到關於dynamics 365 許可權方面問題,在更改商機用戶欄位的時候,拋出了異常信息,更改失敗,提示沒有給用戶分配的角色 看到該問題我排查更改選擇的用戶是不是沒有安全形色,經我排查,測試賬號確實沒有,可把我激動的,就認為該問題已經解決了,但是其實正式系統是有安全形色的,我就又陷入迷茫,剛入門 ...
一周排行
  • C#6.0新特性 C#7.0新特性 C#8.0新特性 ...
  • out變數 可以直接在方法中使用out申明變數 int.TryParse("123", out var result); 元組 元組的申明 var alphaBetaStart = (alpha: "a", beta: "b"); Console.WriteLine($"{alphaBetaStar ...
  • 在我們的項目中,通常會把數據存儲到關係型資料庫中,比如Oracle,SQL Server,Mysql等,但是關係型資料庫對於併發的支持並不是很強大,這樣就會造成系統的性能不佳,而且存儲的數據多為結構化數據,對於非結構數據(比如文本)和半結構化數據(比如JSon) 就顯得不夠靈活,而非關係型資料庫則很 ...
  • 這幾天終於弄懂了async和await的模式,也搞明白了一直在心裡面積壓著的許多問題,所以寫一篇博客來和大家分享一下。 關於非同步機制我認為只要記住的以下幾點,就可以弄明白了: 1.我認為async和awwait兩個修飾符中最關鍵的是await,async是由於方法中包含await修飾符之後才在方法定 ...
  • 實現WCF的步驟如下: 設計服務協議 實現服務協議 配置服務 托管服務 生成客戶端(這步可有可無) 設計或定義服務協議要麼使用介面,要麼使用類。建議介面,使用介面好處一堆例如修改介面的實現,但是服務協定有無需改變。 設計服務協議,介面上使用 ServiceContractAttribute ,方法上 ...
  • 什麼鬼,我的CPF快寫好了,你居然也要搞跨平臺UI框架?什麼Maui? 之前怎麼不早說要搞跨平臺UI框架呢?看到谷歌搞flutter眼紅了?明年年底發佈?又搞這種追別人屁股的爛事情。 什麼MVU模式?模仿Dart?用C#代碼直接寫UI的模式和我的CPF很像啊。 當初我考慮過XML,Json來描述UI ...
  • 寫在前面 Docker作為開源的應用容器引擎,可以讓我們很輕鬆的構建一個輕量級、易移植的容器,通過Docker方式進行持續交付、測試和部署,都是極為方便的,並且對於我們開發來說,最直觀的優點還是解決了日常開發中的環境配置與部署環境配置上的差異所帶來的種種疑難雜症,從此推脫產品的措辭也少了——“我電腦 ...
  • 一、前言 回顧:認證授權方案之授權初識 從上一節中,我們在對授權系統已經有了初步的認識和使用,可以發現,asp.net core為我們提供的授權策略是一個非常強大豐富且靈活的認證授權方案,能夠滿足大部分的授權場景。 在ConfigureServices中配置服務:將授權服務添加到容器 public ...
  • 項目背景: 工作之餘兼職一家公司(方向是工業4.0)給做IM系統,主要功能包括:文字、 圖片、文件傳輸、遠程協助、視頻語音等等。這些功能都是基於群會話, 比如工廠操作工人遇到問題,請求遠程專家,這個初級專家不能解決問題,會邀請一個高級專家進來解決。開發過程中主要遇到的問題是視頻和語音這一塊,像其他的... ...
  • 基礎概念 Microsoft中間語言(MSIL),也成為通用中間語言(CIL),是一組與平臺無關的指令,由特定於語言的編譯器從源代碼生成。MSIL是獨立於平臺的,因此,他可以在任何公共語言基礎架構支持特定的環境上執行。 通過JIT編譯器將MSIL轉換為特定電腦環境的特定機器代碼。這是在執行MSIL ...