AgileConfig輕量級(jí)配置中心
AgileConfig 是一個(gè)基于 .net core 開發(fā)的輕量級(jí)配置中心。
- 部署簡(jiǎn)單,最少只需要一個(gè)數(shù)據(jù)節(jié)點(diǎn),支持docker部署
- 支持多節(jié)點(diǎn)分布式部署來(lái)保證高可用
- 配置支持按應(yīng)用隔離,應(yīng)用內(nèi)配置支持分組隔離
- 使用長(zhǎng)連接技術(shù),配置信息實(shí)時(shí)推送至客戶端
- 支持IConfiguration,IOptions模式讀取配置,原程序幾乎可以不用改造
- 配置修改支持版本記錄,隨時(shí)回滾配置
- 如果所有節(jié)點(diǎn)都故障,客戶端支持從本地緩存讀取配置
服務(wù)端項(xiàng)目AgileConfig
客戶端項(xiàng)目AgileConfig_Client
示例項(xiàng)目AgileConfigMVCSample
架構(gòu)
AgileConfig的架構(gòu)比較簡(jiǎn)單,主要是分3塊:
客戶端
客戶端程序是使用netstandard2.0開發(fā)的一個(gè)類庫(kù),方便.net core程序接入,nuget搜a(bǔ)gileconfig.client就可以安裝??梢栽趩?dòng)客戶端的時(shí)候配置多個(gè)節(jié)點(diǎn)的地址,客戶端會(huì)隨機(jī)挑選一個(gè)進(jìn)行連接,連接成功后會(huì)維持一個(gè)websocket長(zhǎng)連接。如果連接的節(jié)點(diǎn)發(fā)生故障導(dǎo)致連接中斷,客戶端會(huì)繼續(xù)隨機(jī)一個(gè)節(jié)點(diǎn)進(jìn)行連接,直到連接成功。
節(jié)點(diǎn)、管理程序
節(jié)點(diǎn)是使用asp.net core開發(fā)的一個(gè)服務(wù)。為了部署簡(jiǎn)單,直接把管理程序跟節(jié)點(diǎn)服務(wù)合二為一了。任何一個(gè)節(jié)點(diǎn)都可以在啟動(dòng)的時(shí)候配置環(huán)境變量開啟管理程序功能。
數(shù)據(jù)庫(kù)
使用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)數(shù)據(jù),目前支持Sqlserver, Mysql, Sqlite, PostgreSql,Oracle 五種數(shù)據(jù)庫(kù)。最新版本已經(jīng)切換為Freesql為數(shù)據(jù)訪問(wèn)組件。Freesql對(duì)多數(shù)據(jù)庫(kù)的支持更加強(qiáng)勁,特別是對(duì)國(guó)產(chǎn)數(shù)據(jù)庫(kù)的支持。但是因?yàn)闆](méi)有國(guó)產(chǎn)數(shù)據(jù)庫(kù)的測(cè)試環(huán)境,本項(xiàng)目并未支持,如果有需要我可是開分支嘗試支持,但是測(cè)試工作就要靠用戶啦。
注意:如果使用<=1.0.4之前版本的用戶請(qǐng)不要更新,因?yàn)镋FCore跟Freesql自動(dòng)建的庫(kù)可能存在稍許差異,保險(xiǎn)起見(jiàn)不要更新吧。
部署服務(wù)端
初始化數(shù)據(jù)庫(kù)
用戶只需要手工建一個(gè)空庫(kù),所有的表在第一次啟動(dòng)的時(shí)候都會(huì)自動(dòng)生成。目前支持sqlserver,mysql,sqlite, PostgreSql,Oracle 五種數(shù)據(jù)庫(kù)。 provider對(duì)照:
sqlserver = SqlServer
mysql = MySql
sqlite = Sqlite
npgsql = PostgreSql
oracle = Oracle
使用服務(wù)端
運(yùn)行服務(wù)端
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
通過(guò)docker建立一個(gè)agile_config實(shí)例,其中有3個(gè)環(huán)境變量需要配置:
- adminConsole 配置程序是否為管理控制臺(tái)。如果為true則啟用控制臺(tái)功能,訪問(wèn)該實(shí)例會(huì)出現(xiàn)管理界面。
- db:provider 配置程序的數(shù)據(jù)庫(kù)類型。目前程序支持:sqlite,mysql,sqlserver,npgsql, oracle 五種數(shù)據(jù)庫(kù)。
- db:conn 配置數(shù)據(jù)庫(kù)連接串
初始化管理員密碼
第一次運(yùn)行程序需要初始化管理員密碼
節(jié)點(diǎn)
AgileConfig支持多節(jié)點(diǎn)部署,所有的節(jié)點(diǎn)都是平行的。為了簡(jiǎn)化部署,AgileConfig并沒(méi)有單獨(dú)的控制臺(tái)程序,請(qǐng)直接使用任意一個(gè)節(jié)點(diǎn)作為控制臺(tái)。當(dāng)環(huán)境變量adminConsole=true時(shí),該節(jié)點(diǎn)同時(shí)兼?zhèn)鋽?shù)據(jù)節(jié)點(diǎn)跟控制臺(tái)功能。為了控制臺(tái)能夠管理節(jié)點(diǎn),所以需要在控制臺(tái)配置節(jié)點(diǎn)的信息。
注意:即使是作為控制臺(tái)的數(shù)據(jù)節(jié)點(diǎn)同樣需要添加到管理程序,以便管理它。
應(yīng)用
AgileConfig支持多應(yīng)用程序接入。需要為每個(gè)應(yīng)用程序配置名稱、ID、秘鑰等信息。
配置項(xiàng)
配置完應(yīng)用信息后可以為每個(gè)應(yīng)用配置配置項(xiàng)。配置項(xiàng)支持分組。新添加的配置并不會(huì)被客戶端感知到,需要手工點(diǎn)擊“上線”才會(huì)推送給客戶端。已上線的配置如果發(fā)生修改、刪除、回滾操作,會(huì)實(shí)時(shí)推送給客戶端。版本歷史記錄了配置的歷史信息,可以回滾至任意版本。
客戶端
控制臺(tái)可以查看已連接的客戶端。
系統(tǒng)日志
系統(tǒng)日志記錄了AgileConfig生產(chǎn)中的一些關(guān)鍵信息。
使用客戶端
客戶端AgileConfig_Client是使用.net core standard2.0編寫的一個(gè)類庫(kù),已發(fā)布到nuget,方便用戶集成。
使用nuget安裝客戶端類庫(kù)
Install-Package AgileConfig.Client
初始化客戶端
以asp.net core mvc項(xiàng)目為例:
{
"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"http://多個(gè)節(jié)點(diǎn)使用逗號(hào)分隔
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
//讀取本地配置
var localconfig = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json").Build();
//從本地配置里讀取AgileConfig的相關(guān)信息
var appId = localconfig["AgileConfig:appId"];
var secret = localconfig["AgileConfig:secret"];
var nodes = localconfig["AgileConfig:nodes"];
//new一個(gè)client實(shí)例
var configClient = new ConfigClient(appId, secret, nodes);
//使用AddAgileConfig配置一個(gè)新的IConfigurationSource
config.AddAgileConfig(configClient);
//找一個(gè)變量掛載client實(shí)例,以便其他地方可以直接使用實(shí)例訪問(wèn)配置
ConfigClient = configClient;
//注冊(cè)配置項(xiàng)修改事件
configClient.ConfigChanged += ConfigClient_ConfigChanged;
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
讀取配置
AgileConfig支持asp.net core 標(biāo)準(zhǔn)的IConfiguration,跟IOptions模式讀取配置。還支持直接通過(guò)AgileConfigClient實(shí)例直接讀?。?/p>
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的實(shí)例讀取配置
/// </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");
}
}