配置中心—nacos配置中心
- 配置中心
- Nacos配置中心
- Nacos配置中心集群工作原理
- Nacos配置中心的使用
- .net core集成Nacos配置中心
配置中心
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数、启动参数等。应用程序根据配置改变自身的行为,但一般程序不会去修改配置
对于配置,大家在日常开发中应该很熟悉。配置的加载有多种方式,其中hard code在应用中的方式最不可取的,而配置文件、环境变量、启动参数、甚至数据库的方式,在微服务架构中多机器、多应用、多实例的情况下也有很大不足,会使得配置分散,不易于管理。想象一下,如果你启动了一个服务的多个实例,一旦配置需要更改,在没有配置中心的情况,你得将每个实例的配置信息改一遍,这将是非常繁琐且低效的工作。
配置中心就是一种统一管理各种应用配置的基础服务组件,它将将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
一个合格的配置中心需要满足如下特性:
• 配置项容易读取和修改
• 分布式环境下应用配置的可管理性,即提供远程管理配置的能力
• 支持对配置的修改的检视以把控风险
• 可以查看配置修改的历史记录
不同部署环境下应用配置的隔离性
Nacos配置中心
Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。除了提供服务注册与发现功能之外,还能够提供了配置中心功能,nacos配置中的基本流程图如下。
Nacos配置中心集群工作原理
Nacos集群结构是一种无中心化节点的设计,没有主从节点,也没有选举机制,通过虚拟IP(VIP)实现热备,就需要增加。
数据存储分为两部分:
- Mysql数据库存储,所有Nacos节点共享同一份数据,数据的副本机制由Mysql本身的主从方案来解决,从而保证数据的可靠性。
- 每个节点的本地磁盘,会保存一份全量数据,具体路径:/data/program/nacos-1/data/config-data/${GROUP}.
在Nacos的设计中,Mysql是一个中心数据仓库,且认为在Mysql中的数据是绝对正确的。 除此之外,Nacos在启动时会把Mysql中的数据写一份到本地磁盘。这样可以提高性能,当客户端需要请求某个配置项时,服务端会想Ian从磁盘中读取对应文件返回,而磁盘的读取
效率要比数据库效率高。
当配置发生变更时,Nacos会把变更的配置保存到数据库,然后再写入本地文件。
接着发送一个HTTP请求,给到集群中的其他节点,其他节点收到事件后,从Mysql中dump
刚刚写入的数据到本地文件中。另外,NacosServer启动后,会同步启动一个定时任务,每隔6小时,会dump一次全量数据到本地文件
Nacos配置中心的使用
登录nacos管理平台,左侧菜单的第一个节点就是配置管理。nacos配置中心通过命名空间、Group、DataID来定位一份配置信息。
点击右边的“+”号新增一份配置,配置文件支持多种格式。
nacos配置中心提供历史版本查询和监听查询,支持历史版本回滚,也会在用户对配置进行修改时,提供差异比较。
同时支持配置信息的导入、导出以及克隆
.net core集成Nacos配置中心
- 安装依赖包
Install-package nacos-sdk-csharp.Extensions.Configuration
- 添加nacos配置信息
appsetting.json文件中添加nacos配置信息,这些配置信息是必须的,无法放到配置中心的,毕竟应用需要这些配置信息才能够连接上nacos配置中心。
"Nacos": {
"Listeners": [
{
"Optional": false,
"DataId": "test1",
"Group": "DEFAULT_GROUP"
}
],
"Namespace": "yyl", // Please set the value of Namespace ID !!!!!!!!
"ServerAddresses": [ "http://localhost:8848/" ],
"UserName": "nacos",
"Password": "nacos",
"AccessKey": "",
"SecretKey": "",
"ConfigUseRpc": false,
"NamingUseRpc": false
}
这里需要注意的是,ConfigUseRpc和NamingUseRpc这2个参数必须存在,若用的是http协议,则都是false ,若用grpc协议则为true.
- 加载配置中心配置信息
.net core应用自宿主主机构建的时候连接nacos,获取配置中心配置信息。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, builder) =>
{
// 通过配置连接nacos配置中心,将配置中心中的配置加载到项目中的IConfiguration中
var configuration = builder.Build();
builder.AddNacosV2Configuration(configuration.GetSection("nacos"));
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
- 配置信息的获取
nacos配置中心中的配置信息使用和本地配置文件中的配置信息的使用方式一样,直接注入IConfiguration进行获取即可。
[ApiController]
[Route("/api/[Controller]")]
public class ConfigController : Controller
{
private readonly IConfiguration _configuration;
public ConfigController(
IConfiguration configuration)
{
_configuration = configuration;
}
[HttpGet]
[Route("")]
public Task<string> Get()
{
var config = _configuration["appName"];
return Task.FromResult(config);
}
}
新版的sdk nacos-sdk-csharp.Extensions.Configuration 自动支持配置信息的热加载,也就是说配置中心的配置信息一改变,应用就能够获取得到最新的配置信息。
而旧版的sdk nacos-sdk-csharp-unoffical.Extensions.Configuration 是不行的,需要添加监听,才能即时获取到配置信息的变化。而nacos-sdk-csharp-unoffical.Extensions.Configuration 中提供的主动获取配置信息的接口INacosConfigClient也已经移除掉了。