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 sorted排序小结
转载至: https://blog.csdn.net/ray_up/article/details/42084863 在python中排序有两个专用函数,一个是sort,另一个sorted.其中sor ...
- ME51N 创建采购申请
1业务说明 当寻源后,将寻源结果汇总,并创建采购申请,之后据此创建采购订单. 此文档使用BAPI:BAPI_REQUISITION_CREATE创建采购申请 2前台实现 事务代码:ME51N 3代码实 ...
- Python | 使用SVM支持向量机进行鸢尾花分类
运行环境 Python: 3.7.1 库: sklearn (Python的机器学习工具箱) 目的: 根据鸢尾花的四个特征,对三种鸢尾花进行分类 数据(共150行,这里截取前6行,完整数据以及代码的下 ...
- CH#17C 舞动的夜晚(最大流+强连通分量)
舞动的夜晚 CH Round #17 描述 L公司和H公司举办了一次联谊晚会.晚会上,L公司的N位员工和H公司的M位员工打算进行一场交际舞.在这些领导中,一些L公司的员工和H公司的员工之间是互相认识的 ...
- 【每日一题】41. 德玛西亚万岁 (状态压缩DP)
补题链接:Here 经典状压DP问题 坑点,注意多组输入... const int N = 16, mod = 100000000; int f[N][1 << N]; int a[N]; ...
- 定向减免!函数计算让 ETL 数据加工更简单
业内较为常见的高频短时 ETL 数据加工场景,即频率高时延短,一般费用大头均在函数调用次数上,推荐方案一般为攒批处理,高额的计算成本往往令用户感到头疼,函数计算推出定向减免方案,让 ETL数据加工更简 ...
- 高级数据结构---B树和B+树及mysql索引分析
mysql索引数据结构:https://www.cnblogs.com/nijunyang/p/11406688.html 几种树结构的对比: 二叉查找树:二叉搜索树,二叉排序树,优点查找快,但是在某 ...
- COM组件开发-关于在开发环境下COM组件的(来自 HRESULT 的异常:0x80080005 (CO_E_SERVER_EXEC_FAILURE)) 以及 在CLR语言下可能报错 未能加载文件或程序集“Interop.xxx 的问题
1.关于在开发环境下COM组件的(来自 HRESULT 的异常:0x80080005 (CO_E_SERVER_EXEC_FAILURE)) 开发环境下,COM组件注册的文件 不一定是你自己现在程序调 ...
- idea导入maven项目结构不全
本文为博主原创,转载请注明出处 将本地的项目导入idea中,其操作第一步为: File->open->选中导入maven项目的pom文件,正常情况通过该步骤项目就会导入到idea中. 通过 ...
- 解决Ubuntu 20.04下VS code无法使用中文输入法的问题
技术背景 在Ubuntu 20.04下,如果从应用商城中直接下载VS code,有可能会导致无法使用中文输入法的问题,那么就只能从其他地方写了中文再复制过来,非常的麻烦.从一些文章中收集到的信息来看, ...