在.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,这个就请各位多多包涵!!

前提条件
启动Nacos Server
最简单的方式,用docker启动一个单机版的。

docker-compose -f example/standalone-mysql-8.yaml up
创建一个.NET Core项目,并安装相应nuget包
这里将用ASP.NET Core Web Api做示例,同时要安装下面的nuget包

dotnet add package nacos-sdk-csharp-unofficial.Extensions.Configuration --version 0.2.6
更直接点,直接修改csproj

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


进行配置
打开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,用IOptionsSnapshot和IOptionsMonitor来替代!

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

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

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

感兴趣的可以关注一下。

如果您认为这篇文章还不错或者有所收获,可以点击右下角的【推荐】按钮,因为你的支持是我继续写作,分享的最大动力!
作者:Catcher ( 黄文清 )
来源:http://catcher1994.cnblogs.com/

相关文章
|
11天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
26天前
|
Dubbo 关系型数据库 MySQL
nacos常见问题之命名空间配置数据上线修改如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
92 1
|
26天前
|
存储 运维 监控
NACOS 配置中心和注册中心是分两个集群部署还是放在一个集群中
【2月更文挑战第33天】NACOS 配置中心和注册中心是分两个集群部署还是放在一个集群中
71 2
|
1月前
|
运维 Java Nacos
nacos常见问题之配置账号密码
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
201 6
|
11天前
|
SpringCloudAlibaba Java Nacos
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)
|
26天前
|
编解码 Java Nacos
nacos常见问题之密码加密配置如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
127 0
|
26天前
|
安全 前端开发 Nacos
nacos常见问题之配置注册的白名单如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
81 0
|
26天前
|
网络安全 Nacos 数据安全/隐私保护
nacos常见问题之配置内容不显示也修改不了如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
97 0
|
26天前
|
运维 Java Nacos
nacos常见问题之配置不生效不加载shared-configs 配置如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
76 0
|
1月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
C#/.NET/.NET Core拾遗补漏合集(持续更新)