一篇《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
  1. 创建一个.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的一些基础配置。

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的配置写进去,主要是用来区分不同环境的配置来源。

{  "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控制台进行配置的维护。

配置使用

新建一个配置




docker nacos 时 出现derby docker配置nacos_docker配置 nacos


添加一个对应的实体类

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中加点代码

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

下面就是真正的使用了!

[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里面提供的最原始的,原汁原味。

启动访问这个接口,可以看到下面的输出。


docker nacos 时 出现derby docker配置nacos_Core_02


在控制台修改这个配置。


docker nacos 时 出现derby docker配置nacos_docker配置 nacos_03


再次访问,可以发现,除了IOptions之外,都读取到了新的配置。


docker nacos 时 出现derby docker配置nacos_Core_04


之所以IOptions没有获取到最新的配置,那是因为它的默认实现不会进行更新操作,也就是从启动到结束,它都是不会变的。

在有配置变更的情景,请尽可能不要用IOptions,用IOptionsSnapshot和IOptionsMonitor来替代!

总结

这里介绍了如何让.NET Core更容易对接Nacos配置的方法,希望对各位有所帮助。

如果您对 nacos-sdk-charp 这个项目感兴趣,也欢迎一起开发和维护这个项目。