背景

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

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

感兴趣的可以关注一下。

最新文章

  1. word20161129
  2. GTD中定位篇
  3. linux --备份oracle
  4. 【论文阅读记录】Real-Time Correlative Scan Matching
  5. PHP浮点型
  6. owin 中间件 katana 如何解密cookie
  7. delphi 修改Hint的字体和颜色
  8. [swustoj 327] 最小的最大与最大的最小
  9. css中z-index属性(标签层叠次序)
  10. Druid使用记录
  11. 使用Identity Server 4建立Authorization Server (5)
  12. MyCat-schema.xml详解
  13. [转帖]Docker容器CPU、memory资源限制
  14. 斯坦福大学公开课机器学习:advice for applying machine learning | diagnosing bias vs. variance(机器学习:诊断偏差和方差问题)
  15. web前端 3大储存 Cookie、localStorge、sessionStorage
  16. 用 ASP.NET MVC 实现基于 XMLHttpRequest long polling(长轮询) 的 Comet(转)
  17. ActiveReports 报表应用教程 (15)---报表换肤
  18. 三篇文章了解 TiDB 技术内幕——说存储
  19. PHP $_POST
  20. java 调试

热门文章

  1. Flume数据采集结合etcd作为配置中心在爬虫数据采集处理中的架构实践。
  2. 模拟Java内存溢出
  3. 《Java基础复习》—常识与入门
  4. 记一次Windb死锁排查
  5. linux系统部署安装过程
  6. 自动下载bing当日墙纸,并改变为gnome桌面壁纸
  7. Vue+Mock.js模拟登录和表格的增删改查
  8. foreach-- for循环的增强型:for(类型 变量 : 数组对象) { 使用变量 }
  9. 通过Powershell检查SMTP地址是否被检测网站列入黑名单
  10. 智能指针 shared_ptr