1. 程式人生 > >在.NET Core中用最原生的方式讀取Nacos的配置

在.NET Core中用最原生的方式讀取Nacos的配置

## 背景 之前老黃寫過一篇《ASP.NET Core結合Nacos來完成配置管理和服務發現》簡單介紹瞭如何讓.NET Core程式接入Nacos,之前的SDK裡面更多的是對Nacos的Open API進行了封裝以及對服務註冊和發現的封裝。 配置這一塊當時並沒有過多的處理,用起來有時感覺不會特別順手,所以將它和.NET Core的配置結合起來了,讓它用起來更簡便。 怎麼個簡便法呢? 可以說,除了多新增一下provider,其他的操作都是和最原始的一模一樣,你想用`IConfiguration`就用`IConfiguration`,想用`IOptions`系列就用`IOptions`系列。 更容易做到無縫遷移! 當然,這個SDK出自老黃的手,難免會有一些坑和bug,這個就請各位多多包涵!! ## 前提條件 1. 啟動Nacos Server 最簡單的方式,用docker啟動一個單機版的。 ``` docker-compose -f example/standalone-mysql-8.yaml up ``` 2. 建立一個.NET Core專案,並安裝相應nuget包 這裡將用ASP.NET Core Web Api做示例,同時要安裝下面的nuget包 ``` dotnet add package nacos-sdk-csharp-unofficial.Extensions.Configuration --version 0.2.6 ``` 更直接點,直接修改csproj ``` ``` ## 進行配置 開啟`Program.cs`,在`CreateHostBuilder`加入Nacos的provider配置,都是Nacos的一些基礎配置。 ```cs public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, builder) => { var c = builder.Build(); var dataId = c.GetValue("nacosconfig:DataId"); var group = c.GetValue("nacosconfig:Group"); var tenant = c.GetValue("nacosconfig:Tenant"); var optional = c.GetValue("nacosconfig:Optional"); var serverAddresses = c.GetSection("nacosconfig:ServerAddresses").Get>(); // 0.2.6版本之前,只支援這種方式 builder.AddNacosConfiguration(x => { x.DataId = dataId; x.Group = group; x.Tenant = tenant; x.Optional = optional; x.ServerAddresses = serverAddresses; }); //// 0.2.6版本之後可以從配置檔案讀取Nacos的基本配置 //builder.AddNacosConfiguration(c.GetSection("nacosconfig")); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); ``` 同樣的,我們還要修改`appsettings.json`,把Nacos的配置寫進去,主要是用來區分不同環境的配置來源。 ```json { "Logging": { "LogLevel": { "Default": "Warning", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime" :"Information" } }, "nacosconfig":{ "Optional": false, "DataId": "msconfigapp", "Group": "", "Tenant": "ca31c37e-478c-46ed-b7ea-d0ebaa080221", "ServerAddresses": ["localhost:8848"] } } ``` 好了,到這裡,用於配置Nacos相關的內容就結束了。接下來,要做的就是在nacos控制檯進行配置的維護。 ## 配置使用 新建一個配置 ![](https://img2020.cnblogs.com/blog/558945/202004/558945-20200426081109420-1797436758.png) 新增一個對應的實體類 ```cs public class AppSettings { public string Str { get; set; } public int Num { get; set; } public List Arr { get; set; } public SubObj SubObj { get; set; } } public class SubObj { public string a { get; set; } } ``` 因為要驗證IOptions模式,所以要在`Startup`中加點程式碼 ```cs public void ConfigureServices(IServiceCollection services) { services.Configure(Configuration.GetSection("AppSettings")); services.AddControllers(); } ``` 下面就是真正的使用了! ```cs [ApiController] [Route("api/[controller]")] public class ConfigController : ControllerBase { private readonly IConfiguration _configuration; private readonly AppSettings _settings; private readonly AppSettings _sSettings; private readonly AppSettings _mSettings; public ConfigController( IConfiguration configuration, IOptions options, IOptionsSnapshot sOptions, IOptionsMonitor _mOptions ) { _configuration = configuration; _settings = options.Value; _sSettings = sOptions.Value; _mSettings = _mOptions.CurrentValue; } [HttpGet] public string Get() { string id = Guid.NewGuid().ToString("N"); Console.WriteLine($"============== begin {id} ====================="); var conn = _configuration.GetConnectionString("Default"); Console.WriteLine($"{id} conn = {conn}"); var version = _configuration["version"]; Console.WriteLine($"{id} version = {version}"); var str1 = Newtonsoft.Json.JsonConvert.SerializeObject(_settings); Console.WriteLine($"{id} IOptions = {str1}"); var str2 = Newtonsoft.Json.JsonConvert.SerializeObject(_sSettings); Console.WriteLine($"{id} IOptionsSnapshot = {str2}"); var str3 = Newtonsoft.Json.JsonConvert.SerializeObject(_mSettings); Console.WriteLine($"{id} IOptionsMonitor = {str3}"); Console.WriteLine($"==============================================="); return "ok"; } } ``` 從上面的程式碼,看上去應該熟悉的不能再熟悉了吧!這些配置的用法,就是.NET Core裡面提供的最原始的,原汁原味。 啟動訪問這個介面,可以看到下面的輸出。 ![](https://img2020.cnblogs.com/blog/558945/202004/558945-20200426081137629-1476704869.png) 在控制檯修改這個配置。 ![](https://img2020.cnblogs.com/blog/558945/202004/558945-20200426081146761-393207831.png) 再次訪問,可以發現,除了`IOptions`之外,都讀取到了新的配置。 ![](https://img2020.cnblogs.com/blog/558945/202004/558945-20200426081203521-453632963.png) 之所以`IOptions`沒有獲取到最新的配置,那是因為它的預設實現不會進行更新操作,也就是從啟動到結束,它都是不會變的。 在有配置變更的情景,請儘可能不要用`IOptions`,用`IOptionsSnapshot`和`IOptionsMonitor`來替代! ## 總結 這裡介紹瞭如何讓.NET Core更容易對接Nacos配置的方法,希望對各位有所幫助。 如果您對 nacos-sdk-charp 這個專案感興趣,也歡迎一起開發和維護這個專案。 本文首發於我的公眾號:不才老黃 感興趣的可以關注一下。