1. 配置中心
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数、启动参数等。应用程序根据配置改变自身的行为,但一般程序不会去修改配置。
对于配置,大家在日常开发中应该很熟悉,我在另一个系列的文章中也有详细的讲解,可以参考:ASP.NET Core - 配置系统之配置读取。配置的加载有多种方式,其中 hard code 在应用中的方式最不可取的,而配置文件、环境变量、启动参数、甚至数据库的方式,在微服务架构中多机器、多应用、多实例的情况下也有很大不足,会使得配置分散,不易于管理。想象一下,如果你启动了一个服务的多个实例,一旦配置需要更改,在没有配置中心的情况,你得将每个实例的配置信息改一遍,这将是非常繁琐且低效的工作。
配置中心就是一种统一管理各种应用配置的基础服务组件,它将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
一个合格的配置中心需要满足如下特性:
- 配置项容易读取和修改
- 分布式环境下应用配置的可管理性,即提供远程管理配置的能力
- 支持对配置的修改的检视以把控风险
- 可以查看配置修改的历史记录
- 不同部署环境下应用配置的隔离性
2. Nacos配置中心
Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。除了提供服务注册与发现功能之外,还能够提供了配置中心功能,Nacos 配置中的基本流程图如下。
3. Nacos配置中心集群工作原理
Nacos 集群结构是一种无中心化节点的设计,没有主从节点,也没有选举机制,通过虚拟IP(VIP)实现热备。
数据存储分为两部分:
- Mysql数据库存储,所有 Nacos 节点共享同一份数据,数据的副本机制由 Mysql 本身的主从方案来解决,从而保证数据的可靠性。
- 每个节点的本地磁盘,会保存一份全量数据,具体路径:/data/program/nacos-1/data/config-data/${GROUP}。
在 Nacos 的设计中,Mysql是一个中心数据仓库,且认为在 Mysql 中的数据是绝对正确的。 除此之外,Nacos在启动时会把 Mysql 中的数据写一份到本地磁盘。这样可以提高性能,当客户端需要请求某个配置项时,服务端会先从磁盘中读取对应文件返回,而磁盘的读取效率要比数据库效率高。
当配置发生变更时,Nacos 会把变更的配置保存到数据库,然后再写入本地文件。接着发送一个 HTTP 请求,给到集群中的其他节点,其他节点收到事件后,从 Mysql 中 dump 刚刚写入的数据到本地文件中。另外,NacosServer 启动后,会同步启动一个定时任务,每隔6小时,会 dump 一次全量数据到本地文件。
4. Nacos配置中心的使用
登录 Nacos 管理平台,左侧菜单的第一个节点就是配置管理。Nacos 配置中心通过命名空间、Group、DataID来定位一份配置信息。
点击右边的“+”号新增一份配置,配置文件支持多种格式。
Nacos 配置中心提供历史版本查询和监听查询,支持历史版本回滚,也会在用户对配置进行修改时,提供差异比较。
同时支持配置信息的导入、导出以及克隆
5. .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 也已经移除掉了。
微服务系列文章:
上一篇:服务间的通讯-WebApiClient
下一篇:配置中心—Consul配置管理