[Stardust]星尘配置中心
在分布式系統(tǒng)開發(fā)中,配置中心必不可少。在中通幾年時間里,為了配合大數(shù)據(jù)計算平臺,統(tǒng)一管理數(shù)百個微小應(yīng)用,設(shè)計了一套輕量級配置中心。星塵配置中心在其理念基礎(chǔ)上改進(jìn),針對中小團(tuán)隊(duì)而全新設(shè)計!
源碼:https://github.com/NewLifeX/Stardust
試用:http://star.newlifex.com
Nuget包:NewLife.Stardust、NewLife.Stardust.Extensions
快速預(yù)覽
三個應(yīng)用,配置數(shù)據(jù)如下:
基于標(biāo)簽的變量引用,是星塵配置中心的亮點(diǎn),請求接口返回數(shù)據(jù)如下:
配置請求時加上作用域 scope=prod
不同作用域,返回了不同的配置值。prod域不存在,使用了_master的默認(rèn)空域配置10.0.0.1。
功能特點(diǎn)
配置中心本質(zhì)上就是一個名值字典,在開發(fā)實(shí)踐中需要解決多環(huán)境、多團(tuán)隊(duì)協(xié)同等問題。
星塵配置中心主要功能特點(diǎn)如下:
使用簡單,設(shè)置名值配置后,應(yīng)用可通過接口獲取配置,NewLife組件配置系統(tǒng)集成;
支持嵌套,${_teamName}即可從本應(yīng)用或共享應(yīng)用中獲取_teamName進(jìn)行替換,可以靈活構(gòu)建各種配置項(xiàng);
支持共享,Common應(yīng)用共享給StarWeb,StarWeb可以直接返回Common的配置,或者作為替換變量,Common就是各團(tuán)隊(duì)統(tǒng)一使用的配置值,一次修改多個應(yīng)用生效;
支持忽略,下劃線開頭的配置項(xiàng)僅作為變量,不會返回給客戶端;
支持跨應(yīng)用引用,StarWeb的conn_shop設(shè)置${_master@Db},指定引用Db應(yīng)用的_master變量,而無需Db共享給StarWeb,只有DBA維護(hù)Db和Redis,而幾乎所有應(yīng)用都需要用到;
支持多作用域,Db有默認(rèn)空域以及dev作用域的_master,以區(qū)分生產(chǎn)環(huán)境和開發(fā)環(huán)境的數(shù)據(jù)庫配置,StarWeb應(yīng)用使用時只管引用_master,dev作用域?qū)⒋┩傅剿斜灰米兞?#xff1b;
基本用法
使用 HttpConfigProvider 可以直接訪問星塵配置中心,也可以訪問阿波羅配置中心,具體參考
此處為語雀文檔,點(diǎn)擊鏈接查看:https://www.yuque.com/go/doc/31612474
示例代碼:
var provider = new HttpConfigProvider {Server = "http://star.newlifex.com:6600",//Server = "http://localhost:6600",AppId = "StarWeb" };var str = provider["test1"]; Assert.NotEmpty(str);var keys = provider.Keys.ToArray(); Assert.NotNull(keys);var model = provider.Load<Model2>(); Assert.NotNull(model); Assert.NotEmpty(model.Test); Assert.Equal(str, model.Test); Assert.NotEmpty(model.Shop); Assert.NotEmpty(model.Title); Assert.Equal("NewLife開發(fā)團(tuán)隊(duì)", model.Title);var model2 = new Model2(); provider.Bind(model2); Assert.Equal(str, model2.Test); Assert.NotEmpty(model.Shop); Assert.Equal("NewLife開發(fā)團(tuán)隊(duì)", model.Title);provider.LoadAll();實(shí)例化HttpConfigProvider時,需要指定星塵服務(wù)端地址和應(yīng)用AppId,還需要密鑰Secret(如果服務(wù)端設(shè)置了應(yīng)用密鑰)。
得到provider以后,就可以直接訪問配置數(shù)據(jù)了,例如 provider["test1"]。
也可以通過Load方法,把配置數(shù)據(jù)設(shè)置到一個對象的屬性上去。
還可以通過Bind方法,把配置數(shù)據(jù)綁定到一個對象的屬性上,這個辦法還具備自動刷新功能,也就是說,服務(wù)器配置數(shù)據(jù)變化以后,HttpConfigProvider內(nèi)部將會更新該對象的屬性。這里的更新可能因?yàn)榫W(wǎng)絡(luò)原因最多有一分鐘的延遲。Bind的用法非常適用于配置對象。
集成用法
星塵配置中心的客戶端集成在星塵組件包 NewLife.Stardust 中,直接從nuget引用。
實(shí)例化星塵工廠后,即可得到配置提供者對象:
var star = new StarFactory(null, "StarWeb", null);services.AddSingleton(star); services.AddSingleton(star.Tracer); services.AddSingleton(star.Config);// 數(shù)據(jù)庫連接配置 DAL.GetConfig = star.Config.GetConfig;這的star.Config,就是上面“基本用法”中的IConfigProvider,實(shí)際類型HttpConfigProvider。借助星塵工廠,統(tǒng)一了應(yīng)用的身份驗(yàn)證。同時,這里不需要自己配置星塵服務(wù)端地址,它將會自動讀取配置文件appsettings.json的StarServer配置項(xiàng),或者跟服務(wù)器節(jié)點(diǎn)本機(jī)的StarAgent溝通得到。
DAL是數(shù)據(jù)中間件的數(shù)據(jù)層,GetConfig直接建立跟星塵配置中心的綁定關(guān)系,此舉讓XCode能夠跟星塵緊密結(jié)合在一起。
這里把star.Config注入到ioc中,業(yè)務(wù)代碼使用的時候,就可以通過IConfigProvider得到實(shí)際配置對象。
消費(fèi)使用例子如下,JobHost解析使用了IConfigProvider,SyncOrder等作業(yè)類內(nèi)部也可以解析使用。
using System; using System.Threading; using System.Threading.Tasks; using AntJob; using AntJob.Providers; using NewLife; using NewLife.Configuration; using NewLife.Log; using NewLife.Model; using OrderCenter.Api.JobServices;namespace OrderCenter.Tasks.JobServices {public class JobHost : BackgroundService{private readonly IServiceProvider _provider;private readonly IConfigProvider _config;private readonly OrderStatService _stat;private Scheduler _scheduler;public JobHost(IServiceProvider provider, IConfigProvider config, OrderStatService service){_provider = provider;_config = config;_stat = service;}protected override Task ExecuteAsync(CancellationToken stoppingToken){var set = AntSetting.Current;var services = ObjectContainer.Current;var server = _config["antServer"];if (!server.IsNullOrEmpty()){set.Server = server;set.Save();}// 實(shí)例化調(diào)度器var sc = new Scheduler{Tracer = DefaultTracer.Instance,// 使用分布式調(diào)度引擎替換默認(rèn)的本地文件調(diào)度Provider = new NetworkJobProvider{Server = set.Server,AppID = set.AppID,Secret = set.Secret,Debug = false}};// 訂單冷熱同步。熱表訂單同步到冷表sc.AddHandler<SyncOrder>();sc.AddHandler<SyncOrder2>();// 啟動調(diào)度引擎,調(diào)度器內(nèi)部多線程處理sc.Start();_scheduler = sc;return Task.CompletedTask;}public override Task StopAsync(CancellationToken cancellationToken){_scheduler.TryDispose();_scheduler = null;return Task.CompletedTask;}} }.NET Core 高度集成用法
在Asp.NET Core應(yīng)用中,可以整體引入星塵全家桶,除了配置中心,還有監(jiān)控中心、注冊中心(服務(wù)注冊與發(fā)現(xiàn))、日志中心等。
只需要在Startup的ConfigureServices中使用一句:services.AddStardust("StarWeb")
這里不需要自己配置星塵服務(wù)端地址和密鑰,它將會自動讀取配置文件appsettings.json的StarServer配置項(xiàng),或者跟服務(wù)器節(jié)點(diǎn)本機(jī)的StarAgent溝通得到。
using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using NewLife.Cube; using Stardust.Data; using Stardust.Server.Services; using XCode.DataAccessLayer;namespace Stardust.Web {public class Startup{public Startup(IConfiguration configuration) => Configuration = configuration;public IConfiguration Configuration { get; }public void ConfigureServices(IServiceCollection services){var star = services.AddStardust("StarWeb");services.AddControllersWithViews();services.AddCube();}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){// 使用Cube前添加自己的管道if (env.IsDevelopment())app.UseDeveloperExceptionPage();elseapp.UseExceptionHandler("/CubeHome/Error");app.UseCube(env);app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",pattern: "{controller=CubeHome}/{action=Index}/{id?}");});// 發(fā)布服務(wù)到星塵注冊中心,需要指定服務(wù)名app.RegisterService("StarWeb");}} }配置管理
應(yīng)用引入NewLife.Stardust包接入星塵配置中心以后,配置中心將會自動創(chuàng)建應(yīng)用(要求StarServer下的config/starserver.config的AutoRegister設(shè)置為true)。
應(yīng)用配置
進(jìn)入星塵StarWeb管理平臺(例如http://star.newlifex.com/),配置中心子系統(tǒng),應(yīng)用配置頁面,即可管理各個應(yīng)用的配置數(shù)據(jù)。
每個應(yīng)用的基本信息,包括:
啟用。是否禁止該應(yīng)用使用配置中心;
版本。該應(yīng)用正在使用的配置版本號,客戶端請求配置數(shù)據(jù)時,如果傳入相同版本號,則認(rèn)為配置沒有改變,不返回任何配置數(shù)據(jù),意為讓客戶端繼續(xù)使用上一次的配置數(shù)據(jù);
下一版本。下一個未發(fā)布版本,該應(yīng)用的配置數(shù)據(jù)有改變,但是還沒有發(fā)布,此時下一版本號會比當(dāng)前版本號要大,同時“發(fā)布”按鈕顯示出來;
定時發(fā)布。設(shè)置定時發(fā)布下一個版本的時間,到期后自動發(fā)布下一版本;
可被依賴。指定應(yīng)用是否可以被其它應(yīng)用依賴,例如項(xiàng)目組內(nèi)部的工控配置,可以寫到一起,設(shè)置為可被依賴,然后其它項(xiàng)目即可直接依賴該應(yīng)用,從而得到該應(yīng)用的全部配置數(shù)據(jù),融入自有配置數(shù)據(jù);
依賴應(yīng)用。當(dāng)前應(yīng)用依賴其它的應(yīng)用;
全局。全局應(yīng)用意為該應(yīng)用的配置數(shù)據(jù)融入所有其它應(yīng)用的配置數(shù)據(jù)中,在其它應(yīng)用拉取時一起返回;
管理配置
從應(yīng)用配置找到應(yīng)用,點(diǎn)擊“配置”進(jìn)入管理頁面。
在這里可以添加配置數(shù)據(jù),也可以修改維護(hù)配置。不用擔(dān)心對線上系統(tǒng)造成影響,因?yàn)樵诎l(fā)布修改之前,所做修改并不會被各個應(yīng)用客戶端拉取。
配置名稱以下劃線開頭時,僅用于內(nèi)嵌的變量引用,并不會返回給客戶端。這是星塵配置中心的一個特色。
在星塵配置中心,某個應(yīng)用之下,配置名稱并不是唯一的,配置名稱加上作用域Scope才是唯一。也就是說,同樣一個配置中,不同的作用域可以有不同的值。作用域Scope常用于dev/test/prod/uat等環(huán)境區(qū)分。
如果某個配置數(shù)據(jù)作用域?yàn)榭?#xff0c;表示該配置的默認(rèn)值,當(dāng)該配置名稱沒有任何作用域配置客戶端請求時,使用空域配置數(shù)據(jù)。如果沒有空域配置,客戶端指定的配置域又找不到時,配置中心將會給客戶端返回錯誤信息。
作用域不僅僅適用于某個應(yīng)用,而是能夠穿透到內(nèi)嵌應(yīng)用。因此,conn_shop配置值是${_master@Db};database=shop,引用了Db應(yīng)用的_master,而Db里面配置了多個_master,分別對應(yīng)不同的配置值。conn_shop得以在不同環(huán)境下使用不同的數(shù)據(jù)庫連接字符串。
全局應(yīng)用
每個公司可以指定一個應(yīng)用作為全局應(yīng)用,存放所有應(yīng)用都需要使用的配置數(shù)據(jù),例如CompanyName=新生命。各個應(yīng)用就不再需要配置CompanyName,而應(yīng)用端可以直接使用。
當(dāng)然,系統(tǒng)并沒有限制只能使用一個全局應(yīng)用,設(shè)置多個全局應(yīng)用也是可以的,只是可能帶來管理上的麻煩。
演示系統(tǒng)中的Common就是全局應(yīng)用,它內(nèi)部的_teamName可被所有應(yīng)用直接使用,而無需建立依賴關(guān)系。
需要注意的是,_teamName以下劃線開頭,表示內(nèi)部配置,僅用于變量引用,不會作為配置數(shù)據(jù)返回給應(yīng)用客戶端。
同名配置優(yōu)先級:應(yīng)用內(nèi)該Scope配置>應(yīng)用內(nèi)空域配置>依賴應(yīng)用>全局應(yīng)用
依賴應(yīng)用
考慮到團(tuán)隊(duì)內(nèi)部的公共應(yīng)用需要,可以設(shè)置某個應(yīng)用為團(tuán)隊(duì)內(nèi)部的公共應(yīng)用。團(tuán)隊(duì)內(nèi)部各個應(yīng)用可以直接引用該依賴引用。一個公司可能有多個開發(fā)團(tuán)隊(duì),不同的團(tuán)隊(duì)有自己的公共應(yīng)用。
演示系統(tǒng)中的Db就是可被依賴的應(yīng)用,然后StarWeb應(yīng)用依賴了該Db應(yīng)用,多選。
因此StarWeb自動“獲得”了Db的所有配置項(xiàng),這里只有_master。
需要注意的是,_master以下劃線開頭,表示內(nèi)部配置,僅用于變量引用,不會作為配置數(shù)據(jù)返回給應(yīng)用客戶端。
同名配置優(yōu)先級:應(yīng)用內(nèi)該Scope配置>應(yīng)用內(nèi)空域配置>依賴應(yīng)用>全局應(yīng)用
變量引用
基于公共配置抽象的需要,星塵配置中心支持變量引用。允許一個配置數(shù)據(jù)引用其它配置內(nèi)容。配置標(biāo)簽以美元符號和大括號組成,例如conn_shop的配置值${_master@Db};database=shop,表示引用Db應(yīng)用的_master配置值,然后在后面加上一些自己的內(nèi)容。
這里的例子跟依賴應(yīng)用有點(diǎn)關(guān)系,如果建立了依賴引用,那么這里可以直接寫${_master};database=shop。因此,依賴引用不是必須的,可以通過@Db的形式,強(qiáng)行引用任意其它應(yīng)用的配置數(shù)據(jù)。但是強(qiáng)烈不建議這么做,因?yàn)檫@樣子會讓被引用者根本分不清楚自己被誰引用了,從而帶來管理風(fēng)險。
同名配置優(yōu)先級:應(yīng)用內(nèi)該Scope配置>應(yīng)用內(nèi)空域配置>依賴應(yīng)用>全局應(yīng)用
版本發(fā)布
新增或者修改配置數(shù)據(jù)以后,配置數(shù)據(jù)版本號將會變成當(dāng)前應(yīng)用版本號加一,表示這是未發(fā)布新版本。
此時,在應(yīng)用內(nèi)部,或者外面列表頁,點(diǎn)擊“發(fā)布”,都將會把當(dāng)前版本號改為下一版本號,通知客戶端該應(yīng)用的配置數(shù)據(jù)有改變。
作用域規(guī)則
配置客戶端默認(rèn)并不會向配置中心提交scope,而是由配置中心根據(jù)來源IP地址計算得到scope。
當(dāng)IP滿足某個匹配條件時,產(chǎn)生某個結(jié)果,scope等于指定值。
同步阿波羅配置
星塵配置中心支持從阿波羅同步指定應(yīng)用同步配置數(shù)據(jù)。
阿波羅接入,并不需要密鑰驗(yàn)證,所以……
總結(jié)
星塵配置中心客戶端可以緊密結(jié)合星塵,通知緊密結(jié)合XCode數(shù)據(jù)中間件、魔方快速開發(fā)平臺、螞蟻調(diào)度系統(tǒng)、Redis消息隊(duì)列等等NewLife系列產(chǎn)品組件。
同時,該客戶端還可以對接阿波羅配置中心,使用方法不變。
星塵配置中心為了簡化使用,提升用戶體驗(yàn),不再設(shè)置命名空間等概念。建議普通用戶直接給各個應(yīng)用設(shè)置配置數(shù)據(jù)即可,少數(shù)高級用戶可以使用全局、依賴、引用等高級特性。
總結(jié)
以上是生活随笔為你收集整理的[Stardust]星尘配置中心的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跟几个程序员聊了聊他们的每月薪资收入
- 下一篇: 移除 ZooKeeper 的 kafka