一、什么是nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。详细架构图如下:

官网地址:https://nacos.io/zh-cn/index.html。

二、AspnetCore快速接入

1.引用sdk nuget package

nacos-sdk-csharp.AspNetCore
nacos-sdk-csharp.Extensions.Configuration

2.配置中心配置如下:

{
"NacosConfig": {
"Listeners": [
{
"Optional": false,
"DataId": "common",
"Group": "DEFAULT_GROUP"
},
{
"Optional": false,
"DataId": "bussiness",
"Group": "DEFAULT_GROUP"
}
],
"Namespace": "abcyswenli",
"ServerAddresses": [ "http://10.10.1.90:8848/" ],
"UserName": "yswenli",
"Password": "walle",
"ConfigUseRpc": false,
"NamingUseRpc": false
}
}

a、必须要有 ConfigUseRpc和NamingUseRpc这2个参数,若用的是http协议,则都是false ,若用grpc协议则为true.(这个官方提供的demo没有写,就会报错)
b、Listeners 对应配置文件。DataId是配置名称,Tenant是命名空间名称。Group组名。
c、ServerAddresses是Nacos的服务器地址,可以添加多个。
d、若是新的命名空间,则 Namespace对应的是命名空间的Id.
e、Listeners里添加的配置文件一定要存在,不要有多余的节点,可以少,但是不可以多。Group也不能填错。
f、Namespace处填写的是配置的id,不是名称

3.服务注册Naming的配置如下:

"nacos": {
"EndPoint": "sub-domain.aliyun.com:8080",
"ServerAddresses": [ "http://localhost:8848" ],
"DefaultTimeOut": 15000,
"Namespace": "cs", // Please set the value of Namespace ID !!!!!!!!
"ListenInterval": 1000,
"ServiceName": "App1",
"GroupName": "DEFAULT_GROUP",
"ClusterName": "DEFAULT",
"Ip": "",
"PreferredNetworks": "", // select an IP that matches the prefix as the service registration IP
"Port": 0,
"Weight": 100,
"RegisterEnabled": true,
"InstanceEnabled": true,
"Ephemeral": true,
"Secure": false,
"AccessKey": "",
"SecretKey": "",
"UserName": "",
"Password": "",
"ConfigUseRpc": true,
"NamingUseRpc": true,
"NamingLoadCacheAtStart": "",
"LBStrategy": "WeightRandom", //WeightRandom WeightRoundRobin
"Metadata": {
"aa": "bb",
"cc": "dd"
}
}

4.在aspnetcore中,用中间件实现对接nacos配置中心

/// <summary>
/// nacos集成中间件工具类
/// </summary>
internal static class NacosUtil
{
/// <summary>
/// 初始化nacos
/// </summary>
/// <param name="services"></param>
/// <param name="configuration"></param>
public static void GetNacosConfigs(this IServiceCollection services, IConfiguration configuration)
{
var nacosConfig = configuration.GetSection("NacosConfig").Get<NacosConfig>();
services.AddNacosV2Config((n) =>
{
n.ConfigUseRpc = nacosConfig.ConfigUseRpc;
n.NamingUseRpc = nacosConfig.NamingUseRpc;
n.ServerAddresses = nacosConfig.ServerAddresses;
n.ListenInterval = 3000;
n.Namespace = nacosConfig.Namespace;
});
var serviceProvider = services.BuildServiceProvider();
var configSvc = serviceProvider.GetService<INacosConfigService>();
if (configSvc == null) throw new NotImplementedException("nacos初始化失败"); if (nacosConfig != null && nacosConfig.Listeners != null && nacosConfig.Listeners.Count > 0)
{
foreach (var item in nacosConfig.Listeners)
{
//初始化配置变化监听
configSvc.AddListener(item.DataId, item.Group, new NacosConfigListener(nacosConfig.Namespace, item.DataId, item.Group));
//初始化数据
var content = configSvc.GetConfig(item.DataId, item.Group, 3000).Result;
if (content.IsNotNullOrEmpty())
NacosConfigUtil.Set(nacosConfig.Namespace, item.Group, item.DataId, content);
}
}
}
// } /// <summary>
/// 配置变化监听
/// </summary>
internal class NacosConfigListener : IListener
{
string _nameSpace, _dataId, _group; /// <summary>
/// 配置变化监听
/// </summary>
/// <param name="nameSpace"></param>
/// <param name="dataId"></param>
/// <param name="group"></param>
public NacosConfigListener(string nameSpace, string dataId, string group)
{
_nameSpace = nameSpace;
_dataId = dataId;
_group = group;
}
/// <summary>
/// 接收配置方法
/// </summary>
/// <param name="configInfo"></param>
public void ReceiveConfigInfo(string configInfo)
{
Console.WriteLine("recieve:" + configInfo);
NacosConfigUtil.Set(_nameSpace, _dataId, _group, configInfo);
}
}

在上述代码中services在目前新版本中可以直接初始化配置中心、服务注册、OpenApi等功能,但是需要注意的是services.AddNacosV2Config((n) =>这个不直接传入configuration参数。

5.成功接入nacos配置中心后,可以在本地缓存来接收配置,以方便后续业务中使用


/// <summary>
/// Nacos配置工具类
/// </summary>
public static class NacosConfigUtil
{
static ConcurrentDictionary<string, IConfigurationRoot> _cache; static ConcurrentDictionary<string, ConcurrentDictionary<string, ConcurrentDictionary<string, string>>> _configDic; //namaspace用于环境,在运行中一般不变
static string _nameSpace; /// <summary>
/// Nacos配置工具类
/// </summary>
static NacosConfigUtil()
{
_configDic = new ConcurrentDictionary<string, ConcurrentDictionary<string, ConcurrentDictionary<string, string>>>();
_cache = new ConcurrentDictionary<string, IConfigurationRoot>();
} /// <summary>
/// GetRoot
/// </summary>
/// <param name="content"></param>
/// <returns></returns>
static IConfigurationRoot GetRoot(string content)
{
return new ConfigurationBuilder().AddJsonStream(content.ToStream()).Build();
} /// <summary>
/// 设置配置
/// </summary>
/// <param name="nameSpace"></param>
/// <param name="groupName"></param>
/// <param name="dataId"></param>
/// <param name="content"></param>
public static void Set(string nameSpace, string groupName, string dataId, string content)
{
_nameSpace = nameSpace;
if (!_configDic.ContainsKey(nameSpace))
{
_configDic[nameSpace] = new ConcurrentDictionary<string, ConcurrentDictionary<string, string>>();
}
if (!_configDic[nameSpace].ContainsKey(groupName))
{
_configDic[nameSpace][groupName] = new ConcurrentDictionary<string, string>();
}
_configDic[nameSpace][groupName][dataId] = content;
} /// <summary>
/// 获取配置
/// </summary>
/// <param name="groupName"></param>
/// <param name="dataId"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public static string Get(string groupName, string dataId)
{
if (!_configDic.ContainsKey(_nameSpace))
{
throw new NotImplementedException("当前配置还未初始化");
}
if (!_configDic[_nameSpace].ContainsKey(groupName))
{
return string.Empty;
}
if (!_configDic[_nameSpace][groupName].ContainsKey(dataId))
{
return string.Empty;
}
return _configDic[_nameSpace][groupName][dataId];
} /// <summary>
/// 获取配置
/// </summary>
/// <param name="groupName"></param>
/// <param name="dataId"></param>
/// <param name="sectionName"></param>
/// <returns></returns>
public static string? Get(string groupName, string dataId, string sectionName)
{
var content = Get(groupName, dataId);
if (content.IsNullOrEmpty()) return string.Empty;
return GetRoot(content)[sectionName];
} /// <summary>
/// 获取配置
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="groupName"></param>
/// <param name="dataId"></param>
/// <param name="sectionName"></param>
/// <returns></returns>
public static T? Get<T>(string groupName, string dataId, string sectionName)
{
var content = Get(groupName, dataId);
if (content.IsNullOrEmpty()) return default;
return GetRoot(content).GetSection(sectionName).Get<T>();
} /// <summary>
/// 读取配置字符串
/// </summary>
/// <param name="dataId"></param>
/// <param name="sectionName"></param>
/// <returns></returns>
public static string Read(string dataId,string sectionName)
{
return Get("DEFAULT_GROUP", dataId, sectionName);
} /// <summary>
/// 读取配置
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dataId"></param>
/// <param name="sectionName"></param>
/// <returns></returns>
public static T Read<T>(string dataId, string sectionName)
{
return Get<T>("DEFAULT_GROUP", dataId, sectionName);
}
}

6.在业务处可以使用上述接收类来读取配置

    /// <summary>
/// nacos配置测试
/// </summary>
[AllowAnonymous]
public class NacosTestController : BaseApiController
{
public NacosTestController(IWebHostEnvironment env) : base(env)
{
} /// <summary>
/// nacos配置测试
/// </summary>
/// <returns></returns>
[HttpGet]
public Result Test()
{
return SuccessResult(NacosConfigUtil.Get("BussinessService", "WALLE"));
}
}

动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

AspnetCore接入Nacos配置中心的更多相关文章

  1. Nacos配置中心+ASP.NET Core

    Nacos配置中心 nacos 是一个构建云原生应用的动态服务发现.配置管理和服务管理平台.. 源码已上传至 github 配置管理 asp.net core中所有的配置项,如appsetting.j ...

  2. SpringBoot使用Nacos配置中心

    本文介绍SpringBoot如何使用阿里巴巴Nacos做配置中心. 1.Nacos简介 Nacos是阿里巴巴集团开源的一个易于使用的平台,专为动态服务发现,配置和服务管理而设计.它可以帮助您轻松构建云 ...

  3. Nacos配置中心

    本文介绍spring cloud 集成 nacos案例 官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html](https://nacos.io/zh ...

  4. Spring Cloud 系列之 Alibaba Nacos 配置中心

    Nacos 介绍 Nacos 是 Alibaba 公司推出的开源工具,用于实现分布式系统的服务发现与配置管理.英文全称 Dynamic Naming and Configuration Service ...

  5. Nacos配置中心使用

    在系统开发过程中,开发者通常会将一些需要变更的参数.变量等从代码中分离出来独立管理,以独立的配置文件的形式存在.目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进 ...

  6. 微服务从nacos配置中心获得配置信息

    一,安装nacos, 略 二,创建父工程和微服务工程 service1, service2,以idea为例 1, new -> project -> Maven -> 填写group ...

  7. Nacos配置中心和服务的注册发现

    在上一篇中,我们已经把Nacos的集群搭建好了,那么既然已经搭建好了,就要在咱们的项目中去使用.Nacos既可以做配置中心,也可以做注册中心.我们先来看看在项目中如何使用Nacos做配置中心. Nac ...

  8. Spring Cloud Config、Apollo、Nacos配置中心选型及对比

    Spring Cloud Config.Apollo.Nacos配置中心选型及对比 1.Nacos 1.1 Nacos主要提供以下四大功能 2.Spring Cloud Config 3.Apollo ...

  9. Spring Cloud Alibaba(5)---Nacos(配置中心)

    Nacos(配置中心) 有关Spring Cloud Alibaba之前写过四篇文章,这篇也是在上面项目的基础上进行开发. Spring Cloud Alibaba(1)---入门篇 Spring C ...

  10. 【Nacos】Springboot整合Nacos配置中心(二) 多环境配置

    本篇随笔接上一篇文章:Springboot整合Nacos配置中心(一),主要记录Nacos多环境的配置的方法 Nacos多环境的配置 方法一: 1.在项目中的bootstrap.yaml文件中配置激活 ...

随机推荐

  1. AtCoder Beginner Contest 335 总结

    ABC335总结 A.202<s>3</s> 翻译 给你一个由小写英文字母和数字组成的字符串 \(S\). \(S\) 保证以 2023 结尾. 将 \(S\) 的最后一个字符 ...

  2. awk 文本编辑器

    1.简介 文本编辑器 非交互式的编辑器 编程语言 功能:对文本数据进行汇总和处理 是一个报告生成器 能够对数据进行排版 工作模式:行工作模式 读入一行 将整行内容存在$0里,一行等于一个记录 记录分隔 ...

  3. Spring 学习笔记(3)控制反转 IoC

    本篇文章主要对 Spring 框架中的核心功能之一控制反转 (IOC,Inversion of Control)进行介绍,采用理论 + 实战的方式给大家阐述其中的原理以及明确需要注意的地方. 控制反转 ...

  4. 制作PE工具箱

    事前准备: 能上网的电脑 x1 台 大于8G的U盘 x一个(如果需要储存安装镜像的话,如果不需要的话大于1G即可) 一.下载PE工具箱 推荐使用WEPE工具箱,无广告无推广.不推荐老X桃,大X菜,大X ...

  5. 无需代码绘制人工神经网络ANN模型结构图的方法

      本文介绍几种基于在线网页或软件的.不用代码的神经网络模型结构可视化绘图方法.   之前向大家介绍了一种基于Python第三方ann_visualizer模块的神经网络结构可视化方法,大家可以直接点 ...

  6. vue监听滚动到底部加载更多

    https://blog.csdn.net/qq_39762109/article/details/89354305 此方法有个bug

  7. springboot+dubbo+myBatis实现微服务集成

    springboot+dubbo+myBatis实现微服务集成 代码下载:https://download.csdn.net/download/typ1805/10485048 微服务架构成了当下的技 ...

  8. VUEX 使用学习四 : action

    转载请注明出处: action 用于处理异步任务:action,可以操作任意的异步操作,类似于mutations,但是是替代mutations来进行异步操作的.首先mutations中必须是同步方法, ...

  9. 搭建 github 报错 Permission denied (publickey)

    将 key 加入 github 出现如下问题 这是本地仓 user.name user.email 与 github 注册信息不一致造成 将本地仓 user 信息与 github 修改一致,出现如下问 ...

  10. MyBatis05——一对多和多对一处理

    多对一处理 1.数据库表的设计 CREATE TABLE `teacher` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRI ...