微服务设计之.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中完成一个数据中心的配置是很方便,提供比较完成功能,完全覆盖微服务的各个配置场景需求。

参考nacos的文档:https://nacos.io/zh-cn/docs/concepts.html

posted @ 2024-03-28 23:22  tuqunfu  阅读(7)  评论(0编辑  收藏  举报