ASPCore结合Nacos来完成配置管理和服务发现
⽬录
前⾔
今年4⽉份的时候,和平台组的同事⼀起调研了⼀下Nacos,也就在那个时候写了 core版本的⾮官⽅版的。
虽然公司内部由于某些原因最后没有真正的⽤起来,但很多⼈还是挺看好的。在和镇汐沟通后,决定写⼀篇博客简单介绍⼀下。
下⾯这个图,就是本⽂的重点了。
Nacos的简介
Nacos是⼀个易于构建云原⽣应⽤的动态服务发现、配置管理和服务管理平台,它提供了⼀组简单易⽤的特性集,帮助我们快速实现动态服务发现、服务配置、服务元数据及流量管理。
它有下⾯的关键特性
服务发现和服务健康监测
动态配置服务
动态 DNS 服务
服务及其元数据管理
...
特性还是挺多的,也有挺多值的挖掘的地⽅。有关Nacos的更多信息可以访问下⾯的地址:八年级下册英语单词跟读
下⾯就开始正题了,第⼀步肯定是先把Nacos跑起来。
启动Nacos
由于是演⽰,所以直接⽤docker启动了Standalone Mysql模式的。
git clone --depth 1 /nacos-group/nacos-docker.git
cd nacos-docker
docker-compo -f example/standalone-mysql.yaml up
运⾏docker-compo后,会先拉取⼏个镜像回来,然后就看到下⾯的输出,基本就是正常启动了。
打开浏览器访问localhost:8848/nacos就可以看到Nacos控制台的登录界⾯了。
初始的⽤户名和密码都是 nacos,登录进来之后⼤概是这样的。
可以看到运⾏起来的Nacos,版本是1.1.3,还有清晰可见的⼏个⼤菜单,这些都是可以很⽅便我们去进⾏管理的。那我们就先来看⼀下Nacos的配置管理吧。
配置管理
在上⾯的特性⼤图中,已经很明确的告诉了我们配置管理的⼏个重要功能。
在配置中有⼏个⽐较重要的概念需要先了解⼀下。
tenant 租户信息,对应 Nacos 的命名空间字段。
dataId 配置ID。
group 配置分组。
先添加下⾯这个nuget包,然后看⼀下这个配置要怎么玩。
dotnet add package nacos-sdk-csharp-unofficial
还有必不可少的就是在Startup⾥⾯进⾏配置。
public void ConfigureServices(IServiceCollection rvices)
{
// configuration
rvices.AddNacos(configure =>
{
perturb
托福报名考试// default timeout
configure.DefaultTimeOut = 8;
// nacos's endpoint
configure.ServerAddress = new System.Collections.Generic.List<string> { "localhost:8848" };
// namespace赋闲的意思
configure.Namespace = "";
// listen interval
configure.ListenInterval = 1000;
});
nap timervices.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
shotinthedark
}
这个也算是⽐较常见的配置了,就不多说了,还可以通过配置⽂件来加载配置。
这些配置⾥⾯,其实最主要的就是Nacos的地址。
先来看看最简单的获取配置信息。
SDK中提供了⼀个名为INacosConfigClient的Client接⼝,这个接⼝⾥⾯的所有内容都是操作配置相关的。
[Route("api/[controller]")]
[ApiController]
public class ConfigController : ControllerBa
{
private readonly INacosConfigClient _configClient;
public ConfigController(INacosConfigClient configClient)
{
_configClient = configClient;
}
// GET api/config?key=demo1
[HttpGet("")]
public async Task<string> Get([FromQuery]string key)
颜色英语{
var res = await _configClient.GetConfigAsync(new GetConfigRequest
{
DataId = key,
Group = "DEFAULT_GROUP",
//Tenant = "tenant"
}) ;
return string.IsNullOrWhiteSpace(res) ? "Not Found" : res;
}
}
上⾯获取配置的这个获取配置的⽅法,⼤意就是读取默认命名空间(public)下⾯的DEFAULT_GROUP这个配置分组下⾯的,名为key的配置Id的值。如果我们输⼊的key,在Nacos上⾯没有,那个这个⽅法就会返回Not Found给调⽤⽅,如果有,那就会返回具体的配置值。
由于我们是刚运⾏起⾏,什么都没有操作,所以肯定是没有任何配置信息的。
那我们就先添加⼀个,看看效果如何。
同样在上⾯的控制器中加⼊下⾯的发布配置的⽅法,同样也是通过INacosConfigClient来添加配置。
// GET api/config/add?key=demo1&value=123
[HttpGet("add")]
public async Task<string> Add([FromQuery]string key, [FromQuery]string value)
{
var res = await _configClient.PublishConfigAsync(new PublishConfigRequest
{
powerful是什么意思DataId = key,
Group = "DEFAULT_GROUP",
//Tenant = "tenant"
Content = value
});
return res.ToString();
}
这个时候我们已经添加成功了。
\回去控制台,也可以看到刚才加的配置已经出来了。
再⼀次访问获取配置信息的接⼝,就已经可以拿到对应的配置内容了。
longlongtimeago
下⾯通过控制台去修改⼀下配置的内容。
点发布按钮的时候,会有⼀个⽐较页⾯,让我们对⽐前后修改了那些内容。
这个时候我们通过INacosConfigClient去访问的话,发现是获取不到我们刚才更新的内容的。
这个是因为,从Nacos读取配置成功后,会写⼊配置信息到本地缓存中,后⾯访问的话会优先去读缓存的内容。
那么要怎么做到有⼈修改了配置内容后,它能实时⽣效呢?其实很简单,只需要添加⼀下对配置的监听就可以了。
这个得益于Nacos允许我们监听配置,以便实时感知配置变更。如果配置变更,则⽤获取配置接⼝获取配置的最新值,动态刷新本地缓存。下⾯是⼀个简单的⽰例,这⾥⽤的是BackgroundService来处理的。
public class ListenConfigurationBgTask : BackgroundService
{
private readonly ILogger _logger;
private readonly INacosConfigClient _configClient;
public ListenConfigurationBgTask(ILoggerFactory loggerFactory, INacosConfigClient configClient)
>blur