在.NET Core中用最原生的方式读取Nacos的配置
2020-04-26 08:17
295 查看
## 背景
之前老黄写过一篇《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
```
2. 创建一个.NET Core项目,并安装相应nuget包
这里将用ASP.NET Core Web Api做示例,同时要安装下面的nuget包
```
dotnet add package nacos-sdk-csharp-unofficial.Extensions.Configuration --version 0.2.6
```
更直接点,直接修改csproj
```
```
## 进行配置
打开`Program.cs`,在`CreateHostBuilder`加入Nacos的provider配置,都是Nacos的一些基础配置。
```cs
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, builder) =>
{
var c = builder.Build();
var dataId = c.GetValue("nacosconfig:DataId");
var group = c.GetValue("nacosconfig:Group");
var tenant = c.GetValue("nacosconfig:Tenant");
var optional = c.GetValue("nacosconfig:Optional");
var serverAddresses = c.GetSection("nacosconfig:ServerAddresses").Get();
// 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();
});
```
同样的,我们还要修改`appsettings.json`,把Nacos的配置写进去,主要是用来区分不同环境的配置来源。
```json
{
"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控制台进行配置的维护。
## 配置使用
新建一个配置
![](https://img2020.cnblogs.com/blog/558945/202004/558945-20200426081109420-1797436758.png)
添加一个对应的实体类
```cs
public class AppSettings
{
public string Str { get; set; }
public int Num { get; set; }
public List Arr { get; set; }
public SubObj SubObj { get; set; }
}
public class SubObj
{
public string a { get; set; }
}
```
因为要验证IOptions模式,所以要在`Startup`中加点代码
```cs
public void ConfigureServices(IServiceCollection services)
{
services.Configure(Configuration.GetSection("AppSettings"));
services.AddControllers();
}
```
下面就是真正的使用了!
```cs
[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 options,
IOptionsSnapshot sOptions,
IOptionsMonitor _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里面提供的最原始的,原汁原味。
启动访问这个接口,可以看到下面的输出。
![](https://img2020.cnblogs.com/blog/558945/202004/558945-20200426081137629-1476704869.png)
在控制台修改这个配置。
![](https://img2020.cnblogs.com/blog/558945/202004/558945-20200426081146761-393207831.png)
再次访问,可以发现,除了`IOptions`之外,都读取到了新的配置。
![](https://img2020.cnblogs.com/blog/558945/202004/558945-20200426081203521-453632963.png)
之所以`IOptions`没有获取到最新的配置,那是因为它的默认实现不会进行更新操作,也就是从启动到结束,它都是不会变的。
在有配置变更的情景,请尽可能不要用`IOptions`,用`IOptionsSnapshot`和`IOptionsMonitor`来替代!
## 总结
这里介绍了如何让.NET Core更容易对接Nacos配置的方法,希望对各位有所帮助。
如果您对 nacos-sdk-charp 这个项目感兴趣,也欢迎一起开发和维护这个项目。
本文首发于我的公众号:不才老黄
感兴趣的可以关注一下。
相关文章推荐
- .NET Core技术研究-最实用最常用的配置读取方式
- Spring-boot中读取config配置文件的两种方式
- java读取.properties配置文件 的几种方式
- 数据库连接的两种实现方式(读取配置文件)——DBCP&C3P0;DBCP实现连接代码,C3P0实现连接代码——包含完整代码
- 读取配置文件[方式二]之使用Awk实现
- java 三种读取配置文件的方式
- Spring-boot中读取config配置文件的两种方式
- .NET CORE 请求中数据包头和字符流的读取方式
- 读取配置文件的3中方式
- cocos2dx中调用TinyXml读取xml配置文件 || cocos2d-x 中跨平台tinyxml读取xml文件方式
- python 读取配置文件方式 获取股票
- 读取项目配置文件的几种方式
- SpringBoot读取配置文件的两种方式以及自定义配置文件的读取
- idea中原生Servlet3.0开发之---使用配置类和注解的方式整合SpringMVC
- 使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之三(配置文件读取)
- Java项目配置文件读取的两个方式
- Spring Boot读取配置的几种方式
- java 学习笔记 读取配置文件的三种方式
- Hibernate不同配置文件读取方式
- [Erlang]配置文件读取方式(ETS,BEAM)性能研究