背景
之前老黄写过一篇《ASP.NET Core结合Nacos来完成配置管理和服务发现》简单介绍了如何让.NET Core程序接入Nacos,之前的SDK里面更多的是对Nacos的Open API进行了封装以及对服务注册和发现的封装。
配置这一块当时并没有过多的处理,用起来有时感觉不会特别顺手,所以将它和.NET Core的配置结合起来了,让它用起来更简便。
怎么个简便法呢?
可以说,除了多添加一下provider,其他的操作都是和最原始的一模一样,你想用IConfiguration就用IConfiguration,想用IOptions系列就用IOptions系列。
更容易做到无缝迁移!
当然,这个SDK出自老黄的手,难免会有一些坑和bug,这个就请各位多多包涵!!
前提条件
启动Nacos Server
最简单的方式,用docker启动一个单机版的。
docker-compose -f example/standalone-mysql-8.yaml up
创建一个.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,用IOptionsSnapshot和IOptionsMonitor来替代!
总结
这里介绍了如何让.NET Core更容易对接Nacos配置的方法,希望对各位有所帮助。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。



