AgileConfig輕量級配置中心自第一個版本發(fā)布不知不覺已經(jīng)半年了。在并未進行什么推廣的情況下收到了250個star,對我有很大的鼓舞,并且也有不少同學(xué)試用,并且給出了寶貴的意見,非常感謝他們。其中有一些意見非常好,但是一直沒有開發(fā)。主要是一來下半年比較忙(懶),二來我不想把AgileConfig搞的過于復(fù)雜。但其中有個需求被很多同學(xué)提及過,就是希望能支持應(yīng)用間的繼承(關(guān)聯(lián)),類似Apollo的公共namespace的概念。比如微服務(wù)應(yīng)用之間有不少公共配置項,可以配置在一個應(yīng)用內(nèi),然后其他應(yīng)用繼承它,這樣每個應(yīng)用就不用重復(fù)的配置公共配置。我思考了一下,這個配置確實是個非常有用的功能,于是花了點時間實現(xiàn)了它。
Github地址:https://github.com/kklldog/AgileConfig 求star 。
下面的示例簡單演示下如何使用AgileConfig讀取配置并且使用繼承功能
使用docker啟動一個AgileConfig實例
sudo docker run --name agile_config -e adminConsole=true -e db:provider=sqlserver -e db:conn="Persist Security Info = False; User ID =dev; Password =dev@123,; Initial Catalog =agile_config_test; Server =." -p 5000:5000 kklldog/agile_config:latest
使用docker命令運行一個AgileConfig實例,這是最簡單的方法。當然你也可以拉源碼下來編譯發(fā)布使用IIS來運行它。
配置環(huán)境變量:
adminConsole=true 開啟控制臺功能
db:provider=sqlserver 數(shù)據(jù)庫為SqlServer
db:conn="Persist Security Info = False; User ID =dev; Password =dev@123,; Initial Catalog =agile_config_test; Server =." 配置數(shù)據(jù)庫連接
-p 5000:5000 容器的5000口映射本地的5000口
配置AgileConfig
第一次運行需要配置管理密碼
[圖片上傳失敗...(image-812fff-1607959593040)]
密碼配置完成后重新登錄進系統(tǒng),開始配置節(jié)點

在設(shè)計的時候節(jié)點跟控制臺是分開的,但是為了部署簡單最后節(jié)點跟控制臺被實現(xiàn)在一起了。所以采用單節(jié)點部署的時候,該實例既是節(jié)點又是控制臺,所以也需要把本節(jié)點的地址加入到節(jié)點列表里,以便控制臺能管理到。
添加應(yīng)用
AgileConfig的初始化完成了,現(xiàn)在我們開始添加應(yīng)用。
添加“公共應(yīng)用”

添加應(yīng)用名稱,應(yīng)用id,勾選“可被繼承”。點擊確定完成公共的創(chuàng)建。系統(tǒng)只支持一層的繼承,可被繼承的應(yīng)用不能再繼承其它應(yīng)用。
創(chuàng)建完成后為公共應(yīng)用添加配置項

為公共應(yīng)用添加一個配置項:鍵為public_key_01 值為0001 。
添加“私有應(yīng)用”

添加一個私有應(yīng)用,不要選“可被繼承”。點擊繼承應(yīng)用欄的加號會彈出可以被的繼承應(yīng)用列表,選擇“公共應(yīng)用”。點擊“確定”完成創(chuàng)建。
為私有應(yīng)用創(chuàng)建配置項

為私有應(yīng)用添加一個配置項:鍵為private_key_01 值為0002 。
注意:把所有的配置都上線,否則客戶端讀不到配置。
客戶端讀取配置
創(chuàng)建Asp.net Core WebApi項目
我們創(chuàng)建一個WebApi項目做為客戶端來演示如何讀取配置

使用nuget引用AgileConfig.Client
Install-Package AgileConfig.Client -Version 1.1.0
集成AgileConfig.Client
使用nuget安裝成功后,切換到Program.cs開始集成AgileConfigClient。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((ctx,cfg)=> {
var appId = "private_01";
var secret = "1";
var nodes = "http://localhost:5000";
//new一個client實例
var configClient = new ConfigClient(appId, secret, nodes);
//使用AddAgileConfig配置一個新的IConfigurationSource
cfg.AddAgileConfig(configClient);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
使用IHostBuilder的ConfigureAppConfiguration把我們的ConfigClient注入進去。這里我們的ConfigClient配置的是私有應(yīng)用的id:private_01 。
讀取配置
前期工作都完成了,現(xiàn)在我們可以開始編寫讀取配置的代碼了。
新建一個ReadConfigController:
[ApiController]
[Route("[controller]")]
public class ReadConfigController : ControllerBase
{
private readonly IConfiguration _IConfiguration;
public ReadConfigController(IConfiguration configuration)
{
_IConfiguration = configuration;
}
[HttpGet]
public String Get()
{
var publicConfig = _IConfiguration["public_key_01"];
var privateConfig = _IConfiguration["private_key_01"];
return $"publicConfig:{publicConfig} , privateConfig:{privateConfig}";
}
}
通過構(gòu)造函數(shù)注入IConfiguration,然后通過它直接讀取公共配置,私有配置,并且直接把字符串返回回去。
注意修改一下客戶端程序的啟動端口,默認5000跟上面的AgileConfig實例占用的端口沖突。
運行一下
運行客戶端項目,然后在瀏覽器里輸入http://localhost:51605/readconfig

可以看到我們的公共配置跟私有配置都準確的讀取到了。
總結(jié)
通過以上一個簡單的示例,演示了如何使用AgileConfig讀取配置以及如何在應(yīng)用間繼承配置。以上示例并未展示所有內(nèi)容,使用繼承的時候需要注意一下幾點:
- 當私有應(yīng)用的配置跟被繼承應(yīng)用重復(fù)時,私有應(yīng)用的配置會覆蓋被繼承應(yīng)用的配置
- 如果一個應(yīng)用被標記為"可被繼承"后,這個應(yīng)用自己不能繼續(xù)繼承其它應(yīng)用
- 一個私有應(yīng)用可以繼承多個“可被繼承”的應(yīng)用,如果多個繼承的應(yīng)用間出現(xiàn)重復(fù)的配置,那么將按照繼承的順序,后面的應(yīng)用會覆蓋前面的應(yīng)用。
如果喜歡這個項目的,請給我star吧。謝謝。
Github地址:https://github.com/kklldog/AgileConfig