前言

默认情况下,用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包

"nacos-sdk-csharp-unofficial.Extensions.Configuration" Version="0.5.0" />"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();            });}

还要先配置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(Configuration.GetSection("AppSettings"));

然后是控制器读配置。

[ApiController][Route("api/[controller]")]public class ConfigController : ControllerBase{    private readonly ILogger _logger;private readonly IConfiguration _configuration;private readonly AppSettings _settings;private readonly AppSettings _sSettings;private readonly AppSettings _mSettings;public ConfigController(        ILogger logger,        IConfiguration configuration,        IOptions options,        IOptionsSnapshot sOptions,        IOptionsMonitor _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里面,不然启动是会报错的。


具体配置示例如下:

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

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


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

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


修改后再访问一次。


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

就目前来说,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


获取json配置_ASP.NET Core集成Nacos配置中心之适配多格式配置相关推荐

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

    前言 默认情况下,用nacos-sdk-csharp集成ASP.NET Core的配置系统,是基于JSON格式的数据. 随着业务系统的多样化,可能用的配置格式也是各有千秋的.有的会用yaml/yml, ...

  2. spring cloud集成nacos注册中心、配置中心、服务远程调用

    简介 Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理. Nacos 帮助您更敏捷和容易地构建.交付和 ...

  3. 手动造轮子——为Ocelot集成Nacos注册中心

    前言 近期在看博客的时候或者在群里看聊天的时候,发现很多都提到了Ocelot网关的问题.我之前也研究过一点,网关本身是一种通用的解决方案,主要的工作就是拦截请求统一处理,比如认证.授权.熔断.限流.注 ...

  4. Spring Gateway集成 Nacos注册中心不能够发现服务的问题解决

    一.问题描述 我们现在是在用Nacos替换Eureka,原来Eureka和Spring gateway运行正常,可以通过Spring gateway调用注册到Eureka中的服务. 当前Spring ...

  5. gatling的环境配置_将Gatling集成到Gradle构建中–了解SourceSet和配置

    gatling的环境配置 我最近在一个项目中工作,我们不得不将出色的负载测试工具Gatling集成到基于Gradle的版本中. 有可用的gradle插件使此操作变得容易,其中有两个是this和this ...

  6. springboot nacos_springboot集成nacos

    1.现在nacos进行配置添加 2.springboot项目集成nacos nacos上有说明,根据不同的工程进行配置,如下图 集成nacos客户端包 com.alibaba.boot nacos-c ...

  7. Nacos配置管理中心

    一.Nacos配置管理 也就是说Nacos不仅能充当注册中心,还能用来配置成配置中心. 1.统一配置管理 代码演示如下所示: 现在我们知道,Nacos配置管理中心已经有管理好的配置文件了(userse ...

  8. 聊一聊.NET Core结合Nacos实现配置加解密

    背景 当我们把应用的配置都放到配置中心后,很多人会想到这样一个问题,配置里面有敏感的信息要怎么处理呢? 信息既然敏感的话,那么加个密就好了嘛,相信大部分人的第一感觉都是这个,确实这个是最简单也是最合适 ...

  9. .NetCore获取Json和Xml格式的配置信息

    本篇将和大家分享的是:如何获取Json和Xml格式的配置信息,主要介绍的是Configuration扩展方法的使用,因为netcore的web应用在Startup中已经默认嵌入appsettings. ...

最新文章

  1. WebApi接口 - 响应输出xml和json
  2. 课程升级 | 极速构建知识体系,即学即用 Serverless
  3. 爬小说遇到编码问题 笔趣阁
  4. 《Flex 第一步》
  5. java线程条件变量_使用条件变量(多线程笔记)
  6. Elasticsearch--入门-_get查询数据 乐观锁字段---全文检索引擎ElasticSearch工作笔记006
  7. mysql密码正确却提示错误,不使用密码反而能登录
  8. 经典字符串匹配算法——KMP算法
  9. 砌体的弹性模量计算_砌体弹性模量等参数的取值.doc
  10. 专题:手把手学习硬件基础之手册阅读------TM1620
  11. python绘制相频特性曲线_用Python绘制音乐图谱
  12. 【DevOps研发管理方案】一:方案简介
  13. asp.net mvc 实现判断用户是否登录的两种方式
  14. 操作系统--03内存管理
  15. 仿微信的网络聊天室项目开发【完整源码讲解】
  16. ramdisk文件系统的介绍与制作
  17. 获取code.google.com上的开源代码的方法
  18. 空气质量预测 灰色预测模型 模糊综合评价模型
  19. #五、江恩的共振点是什么?
  20. 用Unity写一个12306验证器的恶搞图生成软件

热门文章

  1. jsoup爬虫,爬取全站代码
  2. Unity 初级保龄球游戏
  3. python/socket编程之粘包
  4. ActiveMQ消息队列的使用
  5. Interface接口
  6. zoj3494BCD Code(ac自动机+数位dp)
  7. yaourt下载安装dropbox提示curl ssl证书错误
  8. 分布式的Key-Value存储系统Cassandra
  9. 桥梁模式 :Bridge(转自Terrylee)
  10. python插件使用教程_Python插件机制实现详解