在.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啟動一個單機版的。

<code>docker-compose -f example/standalone-mysql-8.yaml up
/<code>
  1. 創建一個.NET Core項目,並安裝相應nuget包

這裡將用ASP.NET Core Web Api做示例,同時要安裝下面的nuget包

<code>dotnet add package nacos-sdk-csharp-unofficial.Extensions.Configuration --version 0.2.6
/<code>

更直接點,直接修改csproj

<code>
    

/<code>

進行配置

打開Program.cs,在CreateHostBuilder加入Nacos的provider配置,都是Nacos的一些基礎配置。

<code>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();
            });
/<code>

同樣的,我們還要修改appsettings.json,把Nacos的配置寫進去,主要是用來區分不同環境的配置來源。

<code>{
  "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"]
  }
}
/<code>

好了,到這裡,用於配置Nacos相關的內容就結束了。接下來,要做的就是在nacos控制檯進行配置的維護。

配置使用

新建一個配置

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

添加一個對應的實體類

<code>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; }
}
/<code>

因為要驗證IOptions模式,所以要在Startup中加點代碼

<code>public void ConfigureServices(IServiceCollection services)
{
    services.Configure(Configuration.GetSection("AppSettings"));
    services.AddControllers();
}
/<code>

下面就是真正的使用了!

<code>[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(#34;============== begin {id} =====================");
    
        var conn = _configuration.GetConnectionString("Default");
        Console.WriteLine(#34;{id} conn = {conn}");
    
        var version = _configuration["version"];
        Console.WriteLine(#34;{id} version = {version}");
    
        var str1 = Newtonsoft.Json.JsonConvert.SerializeObject(_settings);
        Console.WriteLine(#34;{id} IOptions = {str1}");
    
        var str2 = Newtonsoft.Json.JsonConvert.SerializeObject(_sSettings);
        Console.WriteLine(#34;{id} IOptionsSnapshot = {str2}");
    
        var str3 = Newtonsoft.Json.JsonConvert.SerializeObject(_mSettings);
        Console.WriteLine(#34;{id} IOptionsMonitor = {str3}");
    
        Console.WriteLine(#34;===============================================");
    
        return "ok";
    }
}
/<code>

從上面的代碼,看上去應該熟悉的不能再熟悉了吧!這些配置的用法,就是.NET Core裡面提供的最原始的,原汁原味。

啟動訪問這個接口,可以看到下面的輸出。

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

在控制檯修改這個配置。

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

再次訪問,可以發現,除了IOptions之外,都讀取到了新的配置。

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

之所以IOptions沒有獲取到最新的配置,那是因為它的默認實現不會進行更新操作,也就是從啟動到結束,它都是不會變的。

在有配置變更的情景,請儘可能不要用IOptions,用IOptionsSnapshot和IOptionsMonitor來替代!

總結

這裡介紹瞭如何讓.NET Core更容易對接Nacos配置的方法,希望對各位有所幫助。

如果您對 nacos-sdk-charp 這個項目感興趣,也歡迎一起開發和維護這個項目。


分享到:


相關文章: