背景

之前老黄写过一篇《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

<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配置的方法,希望对各位有所帮助。

到此这篇关于在.net core中用最原生的方式读取nacos的配置的文章就介绍到这了,更多相关.net core读取nacos的配置内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!