AspnetCore接入Nacos配置中心
一、什么是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配置中心的更多相关文章
- Nacos配置中心+ASP.NET Core
Nacos配置中心 nacos 是一个构建云原生应用的动态服务发现.配置管理和服务管理平台.. 源码已上传至 github 配置管理 asp.net core中所有的配置项,如appsetting.j ...
- SpringBoot使用Nacos配置中心
本文介绍SpringBoot如何使用阿里巴巴Nacos做配置中心. 1.Nacos简介 Nacos是阿里巴巴集团开源的一个易于使用的平台,专为动态服务发现,配置和服务管理而设计.它可以帮助您轻松构建云 ...
- Nacos配置中心
本文介绍spring cloud 集成 nacos案例 官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html](https://nacos.io/zh ...
- Spring Cloud 系列之 Alibaba Nacos 配置中心
Nacos 介绍 Nacos 是 Alibaba 公司推出的开源工具,用于实现分布式系统的服务发现与配置管理.英文全称 Dynamic Naming and Configuration Service ...
- Nacos配置中心使用
在系统开发过程中,开发者通常会将一些需要变更的参数.变量等从代码中分离出来独立管理,以独立的配置文件的形式存在.目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进 ...
- 微服务从nacos配置中心获得配置信息
一,安装nacos, 略 二,创建父工程和微服务工程 service1, service2,以idea为例 1, new -> project -> Maven -> 填写group ...
- Nacos配置中心和服务的注册发现
在上一篇中,我们已经把Nacos的集群搭建好了,那么既然已经搭建好了,就要在咱们的项目中去使用.Nacos既可以做配置中心,也可以做注册中心.我们先来看看在项目中如何使用Nacos做配置中心. Nac ...
- Spring Cloud Config、Apollo、Nacos配置中心选型及对比
Spring Cloud Config.Apollo.Nacos配置中心选型及对比 1.Nacos 1.1 Nacos主要提供以下四大功能 2.Spring Cloud Config 3.Apollo ...
- Spring Cloud Alibaba(5)---Nacos(配置中心)
Nacos(配置中心) 有关Spring Cloud Alibaba之前写过四篇文章,这篇也是在上面项目的基础上进行开发. Spring Cloud Alibaba(1)---入门篇 Spring C ...
- 【Nacos】Springboot整合Nacos配置中心(二) 多环境配置
本篇随笔接上一篇文章:Springboot整合Nacos配置中心(一),主要记录Nacos多环境的配置的方法 Nacos多环境的配置 方法一: 1.在项目中的bootstrap.yaml文件中配置激活 ...
随机推荐
- Python pickle 二进制序列化和反序列化 - 数据持久化
模块 pickle 实现了对一个 Python 对象结构的二进制序列化和反序列化. "pickling" 是将 Python 对象及其所拥有的层次结构转化为一个字节流的过程,而 & ...
- 【HZERO】定时任务
- vmware中 centos 突然不能联网,ens33丢失,见了鬼了..........
本人笔记本上vmware中centos允许一直很稳定,今天启动centos准备docker打包,结果发现不能联网了!!! ifconfig一下,发现ens33没了,见鬼了吧! 于是一通vmware虚拟 ...
- C++ Idioms Pimpl
References C++ Coding Standard 這本書的中文版不知道是不是翻譯問題,還是原作就有這種傾向,有些咬文嚼字的很不好懂. Exceptional C++ 這本比上面那本容易理解 ...
- Python 使用pip或easy_install或手动安装库/模块/软件包
pip是easy_install的改进版,提供更好的提示信息,删除package等功能.老版本的python中只有easy_install,没有pip.本文主要介绍使用pip或easy_install ...
- 如何做一次完美的 ABTest?
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/mO5MdwG7apD6RzDhFwZhog作者:DuZhimin 越来越多的公司都在尝试 AB ...
- Kafka的Rebalance机制可能造成的影响及解决方案
一.kafka的rebalance机制在Kafka中,当有新消费者加入或者订阅的Topic数发生变化时,会触发Rebalance(再均衡:在同一个消费者组当中,分区的所有权从一个消费者转移到另外一个消 ...
- 【TouchGFX】Widgets and Containers
Widgets and Containers 是 TouchGFX 应用最基础的东西,他们贯穿于 UI 的整个开发,属于 TouchGFX 的预制组件,同时也支持自定义实现 Widgets Widge ...
- VIte+Vue3 打包在本地 双击 index.html 打开项目
npm i @vitejs/plugin-legacy --save import legacy from '@vitejs/plugin-legacy'; export default define ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.1)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...