zoukankan      html  css  js  c++  java
  • 在.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
    
    1. 创建一个.NET Core项目,并安装相应nuget包

    这里将用ASP.NET Core Web Api做示例,同时要安装下面的nuget包

    dotnet add package nacos-sdk-csharp-unofficial.Extensions.Configuration --version 0.2.6
    

    更直接点,直接修改csproj

    <ItemGroup>
        <PackageReference Include="nacos-sdk-csharp-unofficial.Extensions.Configuration" Version="0.2.6" />
    </ItemGroup>
    

    进行配置

    打开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<string>("nacosconfig:DataId");
                     var group = c.GetValue<string>("nacosconfig:Group");
                     var tenant = c.GetValue<string>("nacosconfig:Tenant");
                     var optional = c.GetValue<bool>("nacosconfig:Optional");
                     var serverAddresses = c.GetSection("nacosconfig:ServerAddresses").Get<List<string>>();
                                   
                     // 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<Startup>();
                });
    

    同样的,我们还要修改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控制台进行配置的维护。

    配置使用

    新建一个配置

    添加一个对应的实体类

    public class AppSettings
    {
    	public string Str { get; set; }
    
    	public int Num { get; set; }
    
    	public List<int> 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<AppSettings>(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<AppSettings> options,
            IOptionsSnapshot<AppSettings> sOptions,
            IOptionsMonitor<AppSettings> _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里面提供的最原始的,原汁原味。

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

    在控制台修改这个配置。

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

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

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

    总结

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

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

    本文首发于我的公众号:不才老黄

    感兴趣的可以关注一下。

  • 相关阅读:
    hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并
    bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
    codevs 1191 树轴染色 线段树区间定值,求和
    vijos 1659 河蟹王国 线段树区间加、区间查询最大值
    tyvj:1038 忠诚 线段树 区间查询
    KL散度
    NumPy 从已有的数组创建数组
    NumPy 创建数组
    NumPy 数组属性
    NumPy 数据类型
  • 原文地址:https://www.cnblogs.com/catcher1994/p/12776725.html
Copyright © 2011-2022 走看看