微服务设计之.net core使用nacos的配置中心
一、前言
在微服务的学习中,配置是很关键一项工作,因为使用微服务架构,拆分成多个微服务导致配置变多、重复配置、不易于统一管理。所以在微服务中需要一个统一管理配置的组件,减少配置、可视化配置等,单体应用是通过配置文件(json/xml/ini/txt/yml)在应用中进行配置读取,而现在由配置中心来完成。nacos不仅仅注册中心,同时还集成了配置中心,可以完成注入微服务的配置管理,所以通过下述来记录配置中心的使用。除了nacos外,还可以选择其他开源组件比如Consul、Apollo、AgileConfig,每一个都存在各自特性、是否轻量级、是否兼容各个平台。
二、nacos安装
在上一章节使用nacos的注册中心已经详细的介绍了安装的过程,安装完成后就可以进行配置中心的使用,如下图所示
上述配置管理中的配置列表是配置文件信息,历史版本是发布的配置记录版本信息可以选择回退操作,监听查询记录配置文件被那些微服务监听使用了。
其中Data Id、Group、NameSpace是关键项:
1、Data Id(配置 ID)Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
2、Group(配置分组)Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。
3、NameSpace(命令空间)用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
理解上述概要,nacos提供的配置管理从单个KEY-Value的配置项 => 一个配置(TEXT/JSON/XML/YAML/HTML/Properties)格式文件 (配置项集合)=>Data Id => Group(对Data ID 相同的配置集区分的分组) =>NameSpace(命令空间)构建整个配置中心,覆盖全部配置使用的场景,满足应用的配置需求。
三、nacos集成
通过对上述概念的学习,已经完成了nacos安装,开始进行Demo的实践
第一步、通过微服务关联在nacos的配置,在appsetting.json配置初始信息,如下所示:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "NacosConfig": { "Listeners": [ { "Optional": false, "DataId": "NacosServiceA", "Group": "DEFAULT_GROUP" }, { "Optional": false, "DataId": "NacosServiceADataBase", "Group": "DEFAULT_GROUP" } ], "Namespace": "", "ServerAddresses": [ "http://172.16.66.118:8848/" ], "UserName": "nacos", "Password": "nacos", "EndPoint": "", "ConfigUseRpc": false, "NamingUseRpc": false }, "JwtSettings": { "Secret": "ixkeE8eu2345k4zsixkeE8eu2345k4zsixkeE8eu2345k4zsixkeE8eu2345k4zsixkeE8eu2345k4zsixkeE8eu2345k4zsWeatherForecast", "Iss": "http://localhost:5013", "Aud": "api" } }
在NacosConfig配置节点中Listeners是微服务应用需要监听的配置项数据包括Data Id与Group,Namespace是命名空间一般区分测试环境、生产环境、开发环境或者其它定义,ServerAddresses则是配置了连接的nacos服务端可以配置集群。如上监听了public(命名空间)->DEFAULT_GROUP(分组)->DataId(配置Id)为NacosServiceA与NacosServiceADataBase的配置文件。
第二步、在nacos中配置Id中配置数据项,比如在NacosServiceADataBase配置连接字符串(配置Id可以根据实际需要区分数据连接、数据源、线程池、日志级别等定义)如下所示:
第三步、在代码中添加服务,通过asp.net core的配置文件读取方式读取配置数据,如下所示:
using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; using Nacos.AspNetCore.V2; using Nacos.V2.DependencyInjection; using Nacos.V2.Naming.Dtos; using Refit; using Refit.Extensions.Nacos; using System.Net.Http.Headers; using System.Text; using tqf.nacos.common.ProductServices; using System.IdentityModel.Tokens.Jwt; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); //配置中心 builder.Configuration.AddNacosV2Configuration(builder.Configuration.GetSection("NacosConfig")); //服务注册 builder.Services.AddNacosAspNet(builder.Configuration); // 配置 Refit 使用 Nacos 服务发现 builder.Services.AddNacosDiscoveryTypedClient<IWeatherForecastService> ("DEFAULT_GROUP", "DEFAULT") .ConfigureHttpClient(c => { // The service name must be lowercase! c.BaseAddress = new Uri("http://nacosserviceb"); c.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); // app.UseAuthorization(); app.MapControllers(); app.Run();
然后在代码中通过注入IConfiguration对象获取配置数据,如下所示:
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Hosting; using Nacos.V2; // using Refit; using tqf.nacos.common.ProductServices; namespace tqf.gateway.nacos.Controllers { /// <summary> /// /// </summary> [ApiController] [Route("[controller]/[action]")] public class IndexController : ControllerBase { private static readonly string[] Summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; /// <summary> /// /// </summary> private readonly ILogger<WeatherForecastController> _logger; /// <summary> /// /// </summary> private readonly IConfiguration _configuration; /// <summary> /// /// </summary> private readonly INacosNamingService _svc; /// <summary> /// /// </summary> private readonly IWeatherForecastService _weatherForecastService; /// <summary> /// /// </summary> /// <param name="logger"></param> /// <param name="configuration"></param> public IndexController(ILogger<WeatherForecastController> logger, IConfiguration configuration, INacosNamingService svc, IWeatherForecastService weatherForecastService) { _logger = logger; _svc = svc; _configuration = configuration; _weatherForecastService = weatherForecastService; } // [Authorize] [HttpGet] public string testa(string name) { Request.Headers.TryGetValue("sid", out var value); _logger.LogInformation("获取用户sid:"+value); _logger.LogInformation("获取参数name:" + name); return "servicea-testa"; } //[AllowAnonymous] [HttpGet] public string testno() { return "servicea-testno"; } [HttpGet] public string getConfig() { return _configuration.GetSection("ConnectString").Get<string>(); } } }
获取方式与在应用中使用配置文件是一样,如果在配置中心修改配置,那么应用会获取nacos推送的更新数据,即时获取更新后的配置数据项,如下所示:
四、总结
通过上述的实践,在nacos中完成一个数据中心的配置是很方便,提供比较完成功能,完全覆盖微服务的各个配置场景需求。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?