背景

之前老黄写过一篇《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 这个项目感兴趣,也欢迎一起开发和维护这个项目。

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

感兴趣的可以关注一下。

在.NET Core中用最原生的方式读取Nacos的配置的更多相关文章

  1. NET Core静态文件的缓存方式

    NET Core静态文件的缓存方式 阅读目录 一.前言 二.StaticFileMiddleware 三.ASP.NET Core与CDN? 四.写在最后 回到目录 一.前言 我们在优化Web服务的时 ...

  2. [转]NET Core静态文件的缓存方式

    本文转自:https://www.cnblogs.com/Leo_wl/p/6059349.html 阅读目录 NET Core静态文件的缓存方式 一.前言 二.StaticFileMiddlewar ...

  3. Android 自动编译、打包生成apk文件 2 - 使用原生Ant方式

    from://http://blog.csdn.net/androiddevelop/article/details/11100109 相关文章列表: <Android 自动编译.打包生成apk ...

  4. .NET Core中使用RabbitMQ正确方式

    .NET Core中使用RabbitMQ正确方式 首先甩官网:http://www.rabbitmq.com/ 然后是.NET Client链接:http://www.rabbitmq.com/dot ...

  5. Docker + .NET Core(三)-两种发布方式

    原文:Docker + .NET Core(三)-两种发布方式 第一种,自己手写dockerfile发布,上传至hubDocker 正常发布到文件夹中,发布文件上传至linux机器上.如 /www/a ...

  6. 使用原生JDBC方式对数据库进行操作

    使用原生JDBC方式对数据库进行操作,包括六个步骤: 1.加载JDBC驱动程序 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM.可以通过java.lang.Class类的静态方法forNa ...

  7. servlet中用注解的方式读取web.xml中的配置信息

    在学习servletContext的时候,我们知道了可以在web.xml中通过<context-param>标签来定义全局的属性(所有servlet都能读取的信息),并在servlet中通 ...

  8. JavaScript日历控件开发 C# 读取 appconfig文件配置数据库连接字符串,和配置文件 List<T>.ForEach 调用异步方法的意外 ef 增加或者更新的习惯思维 asp.net core导入excel 一个二级联动

    JavaScript日历控件开发   概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果代码地址:https://github.com/aspwebc ...

  9. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(七)-- 结构化配置

    本篇将记录.Net Core里颇有特色的结构化配置的使用方法. 相比较之前通过Web.Config或者App.Config配置文件里使用xml节点定义配置内容的方式,.Net Core在配置系统上发生 ...

随机推荐

  1. 分库分表实践-Sharding-JDBC

    最近一段时间在研究分库分表的一些问题,正好周末有点时间就简单做下总结,也方便自己以后查看. 关于为什么要做分库分表,什么是水平分表,垂直分表等概念,相信大家都知道,这里就不在赘述了. 本文只讲述使用S ...

  2. MiniUi遇到的一个Bug或者说坑,以div里面的内容自适应高度

    页面源码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  3. 原生js焦点轮播图的实现

    继续学习打卡,武汉加油,逆战必胜!今日咱们主要探讨一下原生js写轮播图的问题, 简单解析一下思路: 1,首先写好css样式问题 2,考虑全局变量:自动播放的定时器,以及记录图片位置的角标Index 2 ...

  4. 【Java技术系列】爱情36技之Bug大战

    1. 鲁迅先生说:程序员,天不怕地不怕,就怕小虫儿爬呀爬,爬呀爬. 随着时间的推移,鲁迅先生又说:真正勇猛的程序员,敢于让虫子面对惨淡的虫生. 虫子在程序员心中是啥东西?虫子的学名为 Bug,是多少入 ...

  5. 简单实现Win10炫酷下滑关机

    实现效果如下图,鼠标左键按下下拉关机: 先说下实现思路和实现过程(包括失败过程),不想了解的可直接往下拉查看红色字体标注的最终实现方法. 首先实现下滑关机的Windows自带的一个功能(程序)Slid ...

  6. CSS实现文本,DIV垂直居中

    https://blog.csdn.net/linayangoo/article/details/88528774 1.水平居中 1.行内元素水平居中 text-align:center; 利用tex ...

  7. 如何连接到Oracle数据库?

    如何连接到Oracle数据库?   使用SQL * Plus连接Oracle数据库服务器 SQL * Plus是交互式查询工具,我们在安装Oracle数据库服务器或客户端时会自动安装.SQL * Pl ...

  8. 【PHP】数组

    一.生活中的数组: a)    教室的座位:第一天来教室的时候,每个座位上都有自己的一个名字,我们可以通过这个名字快速定位到自己的座位在什么位置! b)    电影院的座位:我们买了电影票之后,能够通 ...

  9. Spring(三):bean的自动装配

    Bean的自动装配 自动装配是Spring满足bean依赖的一种方式. Spring会在上下文中自动寻找,并自动给bean装配属性 Spring中三种装配方式 在xml中显式的配置. 在java中显式 ...

  10. python3的subprocess的各个方法的区别(二)

    subprocess如何避免死锁 如果交互是双工的,即涉及读取和写入,则尤其如此.这种交互可能导致死锁,因为两个进程都可能最终等待另一个进程的输出 您希望从子进程标准输出管道读取,但标准错误管道的缓冲 ...