ASP.NET Core集成Nacos配置中心之适配多格式配置

Stella981
• 阅读 820

前言

默认情况下,用nacos-sdk-csharp集成ASP.NET Core的配置系统,是基于JSON格式的数据。

随着业务系统的多样化,可能用的配置格式也是各有千秋的。有的会用yaml/yml,有的会用ini,有的会用xml,等等。

那么如果我们存在nacos里面的配置数据是非JSON格式的,我们要怎么去适配呢?

老黄在下面为大家一一解答,主要从两个问题点来切入。

  1. 集成yaml/yml格式的的配置

  2. 定制不同格式的parser

集成yaml/yml格式的的配置

目前最新的稳定版及预览版除了默认的JSON外,还支持yaml/ymlini两种格式,这里就以yaml/yml为例来说明。

这里会创建一个WebAPI项目来演示,创建好项目后,安装下面两个nuget包

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

一个是.NET Core的集成包,一个是yaml格式的数据解析包。

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, builder) =>
             {
                 var c = builder.Build();

                 // read configuration from config files, and the data type is yaml/yml
                 builder.AddNacosConfiguration(
                 c.GetSection("NacosConfig"),
                 Nacos.YamlParser.YamlConfigurationStringParser.Instance);
             })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

还要先配置nacos相关的内容。

{
  "NacosConfig": {
    "Optional": false,
    "DataId": "yamlconfigdemo",
    "Group": "",
    "Tenant": "f47e0ae1-982a-4a64-aea3-52506492a3d4",
    "ServerAddresses": [ "http://localhost:8848/" ],
    "UserName": "",
    "Password": "",
    "AccessKey": "",
    "SecretKey": "",
    "EndPoint": ""
  }
}

后面是定义配置的映射类,这一步是可选的,目的是为了使用配置的时候可以点出来。

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

要映射,别忘了在Startup里面加这一句。

services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));

然后是控制器读配置。

[ApiController]
[Route("api/[controller]")]
public class ConfigController : ControllerBase
{
    private readonly ILogger<ConfigController> _logger;
    private readonly IConfiguration _configuration;
    private readonly AppSettings _settings;
    private readonly AppSettings _sSettings;
    private readonly AppSettings _mSettings;

    public ConfigController(
        ILogger<ConfigController> logger,
        IConfiguration configuration,
        IOptions<AppSettings> options,
        IOptionsSnapshot<AppSettings> sOptions,
        IOptionsMonitor<AppSettings> _mOptions
        )
    {
        _logger = logger;
        _configuration = configuration;
        _settings = options.Value;
        _sSettings = sOptions.Value;
        _mSettings = _mOptions.CurrentValue;
    }

    [HttpGet]
    public string Get()
    {
        string id = Guid.NewGuid().ToString("N");

        _logger.LogInformation($"============== begin {id} =====================");

        var conn = _configuration.GetConnectionString("Default");
        _logger.LogInformation($"{id} conn = {conn}");

        var version = _configuration["version"];
        _logger.LogInformation($"{id} version = {version}");

        var str1 = Newtonsoft.Json.JsonConvert.SerializeObject(_settings);
        _logger.LogInformation($"{id} IOptions = {str1}");

        var str2 = Newtonsoft.Json.JsonConvert.SerializeObject(_sSettings);
        _logger.LogInformation($"{id} IOptionsSnapshot = {str2}");

        var str3 = Newtonsoft.Json.JsonConvert.SerializeObject(_mSettings);
        _logger.LogInformation($"{id} IOptionsMonitor = {str3}");

        _logger.LogInformation($"===============================================");

        return "ok";
    }
}

因为这个配置不是可选的,所以在启动应用之前,要添加下面的配置在nacos里面,不然启动是会报错的。

ASP.NET Core集成Nacos配置中心之适配多格式配置

具体配置示例如下:

ConnectionStrings: 
  Default: Server=127.0.0.1;Port=3306;Database=demo;User Id=root;Password=123456; 
version: 测试version
AppSettings: 
  Str: val
  num: 1
  arr: 
  - 1
  - 2
  - 3
  subobj: 
    a: b

运行并访问 http://localhost:5000/api/config,我们可以看到程序的日志输出,是能正常拿到配置的数据的。

ASP.NET Core集成Nacos配置中心之适配多格式配置

这也就是说,我们的程序已经可以正常读取Yaml格式的配置了。

再来看看修改之后能不能及时获取到最新的配置。

ASP.NET Core集成Nacos配置中心之适配多格式配置

修改后再访问一次。

ASP.NET Core集成Nacos配置中心之适配多格式配置

从结果看,也是能及时获取到最新的配置。

就目前来说,JSON,yaml/yml,ini格式的数据应该能满足60%~80%左右的需求,如果遇到一个“新格式”,我们要怎么做呢?

下面来具体看看。

定制自己的parser

在Nacos客户端里面,定义了一个名为INacosConfigurationParser的接口,具体如下:

public interface INacosConfigurationParser
{
    IDictionary<string, string> Parse(string input);
}

这个接口里面也只有一个方法,这个方法的目的就是把字符串类型的配置,转化成一个键值对,从而让.NET Core的配置系统能够识别出来。

下面来个不完整的例子:

public class XmlConfigurationStringParser : INacosConfigurationParser
{
    public static XmlConfigurationStringParser Instance = new XmlConfigurationStringParser();

    public IDictionary<string, string> Parse(string input)
    {
        // 具体的解析逻辑
    }
}

实现好自己的parser之后,就可以在Program里面去指定这个parser了。

// builder.AddNacosConfiguration(
// c.GetSection("NacosConfig"),
// Nacos.YamlParser.YamlConfigurationStringParser.Instance);

builder.AddNacosConfiguration(
c.GetSection("NacosConfig"),
XmlConfigurationStringParser.Instance);

这个时候就会使用XmlConfigurationStringParser去解析配置了。

总结

有了这个特性之后,基本上只要能把对应格式的数据正常解析,就能很好的集成到ASP.NET Core里面了。

如果nacos控制台里面的配置格式没有我们需要的,我们可以直接配置成TEXT格式,这个是不影响我们使用的,只是显示的时候没那么直观。

最后,如果您对 nacos-sdk-csharp 这个项目感兴趣,可以加入我们一起来完善哟,issue,PR都ok的。

nacos 2.x版本可能会引用grpc或rsocket进行长链接的改造,到时sdk这边可能也会是一个比较有意思的改进。

项目地址:

https://github.com/nacos-group/nacos-sdk-csharp

ASP.NET Core集成Nacos配置中心之适配多格式配置

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
springcloud的配置文件的读取顺序
SpringBoot默认支持properties和YAML两种格式的配置文件。前者格式简单,但是只支持键值对。如果需要表达列表,最好使用YAML格式。SpringBoot支持自动加载约定名称的配置文件,例如application.yml。如果是自定义名称的配置文件,就要另找方法了。可惜的是,不像前者有@PropertySource这样方便的加载方式,
Aidan075 Aidan075
3年前
一篇长文带你在python里玩转Json数据
↑一个宝藏公众号,长的好看的人都关注了Json简介Json(JavaScriptObjectNotation)很多网站都会用到Json格式来进行数据的传输和交换,就像上篇我提到的,它们返回的数据都是Json格式的。这因为Json是一种轻量级的数据交换格式,具有数据格式简单,读写方便易懂等很多优点。用它来进行前后端的数据传输,大
LeeFJ LeeFJ
1年前
Foxnic-Web 代码生成 (2) —— 代码生成的配置类
上一节,我们已经讲述了代码生成的基本步骤,但是对细节部分并未展开。利用FoxnicGenerator包进行代码生成的方式是多种多样的,我们这里提到的配置类这是其中一种,例如在FoxnicEAM项目里,有很多的代码生成非使用配置类来完成的。  我们优先选择配置类讲解,显然配置类有其优势。首先,配置类按数据表隔离,一数据表一模块一个配置类。其次,在配置类内部,按配置对象的不同,分别在不同的方法内进行配置代码的编写。例如,配置模型时在configModel方法内编写配置代码,配置字段时在configFields方法内编写配置代码。  那么,代码生成的配置为什么要用Java类,而不是用Json、XML或YML呢?首先,不管是Json、XML或YML、Java,都是在编辑器敲文本。那么哪一种方式敲文本是最方便的呢,自然是Java了,因为有开发工具强大的支持。
捉虫大师 捉虫大师
3年前
Nacos注册中心之概要设计
前言在之前的文章中分析了Nacos配置中心,配置中心的核心是配置的创建、读取、推送。注册中心的核心比配置中心多一个服务探活模块,他俩的相似度非常高,甚至阿里内部的注册中心就叫ConfigServer。Nacos注册中心打算分成几个模块来分析,本文重点在于概要设计,基于2.0.0版本。环境搭建用Nacos的源码来搭建源码阅读和调试环境,可参考Nacos调试
Stella981 Stella981
3年前
Nacos配置中心动态获取数组配置
有的时候我们需要动态获取一系列的配置项,假设我们在nacos配置中心的配置如下,nacos配置中心的其他设置请参考Nacos搭建流程(https://my.oschina.net/u/3768341/blog/3138297)skill:name:爆炸冲刺在SpringCloud代
Stella981 Stella981
3年前
Spring Cloud Alibaba系列之Nacos分布式配置中心
SpringCloudAlibaba系列之Nacos分布式配置中心1、前言介绍SpringCloudAlibabaNacosConfig提供用于存储配置和其他元数据的key/value存储,为分布式系统中的外部化配置提供服务器端和客户端支持,nacosconfig是SpringCloudconfigServer和
Wesley13 Wesley13
3年前
Go配置文件热加载
在日常项目的开发中,我们经常会使用配置文件来保存项目的基本元数据,配置文件的类型有很多,如:JSON、xml、yaml、甚至可能是个纯文本格式的文件。不管是什么类型的配置数据,在某些场景下,我们可会有热更新当前配置文件内容的需求,比如:使用Go运行的一个常驻进程,运行了一个WebServer服务进程。此时,如果配置文件发生变化,我们
Wesley13 Wesley13
3年前
.Net Core Configuration Etcd数据源
前言    .NetCore为我们提供了一套强大的Configuration配置系统,使用简单扩展性强。通过这套配置系统我们可以将Json、Xml、Ini等数据源加载到程序中,也可以自己扩展其他形式的存储源。今天我们要做的就是通过自定义的方式为其扩展Etcd数据源操作。何为Etdc    在使用etcd之前我们先介绍一下Etcd
Wesley13 Wesley13
3年前
MySQL 部署分布式架构 MyCAT (五)
分片(水平拆分)4.全局表业务使用场景:如果你的业务中有些数据类似于数据字典,比如配置文件的配置,常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大,而且大部分的业务场景都会用到,那么这种表适合于Mycat全局表,无须对数据进行切分,要在所有的分片上保存一份数据即可
Stella981 Stella981
3年前
Golang 入门系列(九) 如何读取YAML,JSON,INI等配置文件
实际项目中,读取相关的系统配置文件是很常见的事情。今天就来说一说,Golang是如何读取YAML,JSON,INI等配置文件的。1\.json使用JSON应该比较熟悉,它是一种轻量级的数据交换格式。层次结构简洁清晰,易于阅读和编写,同时也易于机器解析和生成。  1.创建conf.json:{