當服務逐漸的增多,對各服務的配置管理愈加重要,輕量級的配置中心,入手或是搭建都簡單許多,基於.net core開發的輕量級配置中心AgileConfig,功能強大,上手簡單。
https://github.com/dotnetcore/AgileConfig
AgileConfig架構圖
AgileConfig配置端搭建
1、新建一個資料夾用來作為配置儲存
mkdir agileconfig
2、新開資料庫&配置賬戶名
3、下載映象&建立容器
AgileConfig支援sqlserver,mysql,sqlite, PostgreSql,Oracle 五種資料庫。依照實際使用的資料庫型別選擇,此處我這使用mysql。
sudo docker run \
--name StarCityAgileConfig \
-e TZ=Asia/Shanghai \
-e adminConsole=true \
-e db:provider=mysql \
-e db:conn="Server=xxx; Database=xxx;Port=xxx;charset=utf8;uid=xxx;pwd=xxx;" \
-p 9527:5000 \
-v /agileconfig:/app/db \
-d \
kklldog/agile_config:latest
- name:容器名,給定個容器名。
- TZ:指定時區。
- adminConsole:配置程式是否使用管理控制檯。
- 如果為true則啟用控制檯功能,訪問該例項會出現管理介面。
- 每個例項都可以選擇使用管理介面,共用一套資料來源只是呈現埠不同
- 預設賬號為admin,首次登入需要設定密碼,設定後多個管理介面都可以通用
- db:provider:配置程式的資料庫型別。
- 目前程式支援:sqlite,mysql,sqlserver,npgsql, oracle 五種資料庫。
- 按照專案中允許的資料庫使用即可。
- 首個節點啟動後會建立資料表(相當好~)。
- db:env:{env}:provider,可以指定特定環境下使用某個資料庫,如db:env:PROD.provider=sqlserver, db:env:DEVELOPMENT.provider=mysql
- db:conn:配置資料庫連線串。
- 按照不同的資料庫型別設定不同的資料庫連線字串。
- 資料庫使用第二步建立的庫。
- 預設內建了 DEV, TEST, STAGING, PROD 四個常用的環境,如不夠,可直接操作agc_setting 表,增加自定義環境。
- db:env:{env}:conn,可以指定特定環境下使用某個資料庫,如db:env:PROD.conn=xxx, db:env:DEVELOPMENT.conn=xxx
- p:指定對外埠,使用者客戶端去連線。
- 設定允許使用的對外埠即可。
- v:節點的資料卷掛載
- 此處掛載到第一步設定的資料夾路徑下,可按實際需要設定掛載路徑或是不設定-v引數也行。
- -d:後臺執行
4、開啟地址,配置預設賬號admin的密碼
5、節點管理
首個節點進入管理介面後,可以將自身加入到節點列表中。
可以在節點列表中增加節點,這樣方便所有節點可以統一管理。
客戶端設定
1、在需要管理配置的專案中增加Nuget包,以接入AgileConfig配置端
Install-Package AgileConfig.Client
2、在AgileConfig配置端註冊客戶端資訊
3、在appsettings.json增加連線AgileConfig的節點,將第二步中的ID和金鑰填入配置中,設定連線的配置端節點,可以設定多個節點,隨機連線一個節點。
{
"AgileConfig": {
"appId": "app",
"secret": "xxx",
"nodes": "http://localhost:9527,http://localhost:9528"//多個節點使用逗號分隔,
"name": "client_name",
"tag": "tag1",
"env": "DEV"
}
}
當某個節點不可用,客戶端會切換到其他節點,所有節點不可用,使用記憶體快取配置或是讀取本地檔案快取配置。
4、在Program設定使用AgileConfig,如此增加環境後,AgileConfigProvider便會從相應環境appsettings.json中讀取上述配置
.ConfigureAppConfiguration((context, config) =>
{
var envName = context.HostingEnvironment.EnvironmentName;
var configClient = new ConfigClient($"appsettings.{envName}.json");
config.AddAgileConfig(configClient, arg => Console.WriteLine($"config changed , action:{arg.Action} key:{arg.Key}"));
})
在Startup中新增服務
services.AddAgileConfig();
5、設定需要讀取配置的程式碼,按照AspNetCore讀取配置的方式即可,啟動客戶端
[Route("api/[controller]")]
[ApiController]
public class HealthController : ControllerBase
{
private readonly ILogger<HealthController> _logger;
private readonly IConfiguration _configuration;
public HealthController(ILogger<HealthController> logger, IConfiguration configuration)
{
_logger = logger;
_configuration = configuration;
}
[HttpGet]
[Route("Index")]
public IActionResult Index()
{
_logger.LogWarning($"This is HealthController {_configuration["Port"]}.");
return Ok();
}
}
6、AgileConfig配置端配置,按照json格式設定,新建或是編輯已有配置或是匯入json檔案或資料等都行,點選發布則下發到各連線的客戶端中。
釋出完畢,再次請求便是最新的配置資訊,作為配置中心提供的熱載入提供了更多的靈活度。
7、在配置端這邊還有許多功能,如對客戶端的管理,客戶端連線的檢視等,配置項歷史記錄,版本回滾等,系統日誌方便追蹤多端間連線問題,以及配置端的使用者管理等。
配置讀取優先順序
如果在AgileConfig中有則預設從那取值,沒有再去找機密檔案,再去找appsettings.{env}.json,最後appsettings.json,當然優先順序最高的還是環境變數和命令列的配置。
作為.Net中的輪子,我是挺喜歡用這個的,搭建上手理解都極為方便,功能強大,操作簡便,同時部署起來也是極為輕鬆,資源佔有少,皮膚也漂亮(相比Apollo)。
AgileConfig大佬地址:https://www.cnblogs.com/kklldog/p/agile-config.html
AgileConfig地址:https://github.com/dotnetcore/AgileConfig
2021-12-27,望技術有成後能回來看見自己的腳步