一、什么是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. Docker 启动失败 (code=exited, status=1/FAILURE)错误解决办法

    ob for docker.service failed because the control process exited with error code. See "systemctl ...

  2. 【主流技术】聊一聊 Redis 的基本结构和简单应用(一)

    目录 前言 一.String 类型 二.List 类型 三.Hash 类型 四.Set 结构 五.Sort Set (Zset)结构 六.文章小结 前言 Redis 是目前互联网后端的热门中间件之一, ...

  3. 机器学习 | 剖析感知器算法 & Python实现

    前言:本系列博客参考于 <机器学习算法导论>和<Python机器学习> 如有侵权,敬请谅解.本书尽量用总结性的语言重述本书内容,避免侵权. 上一篇已经初步介绍了机器学习相关知识 ...

  4. MySQL 的 crash-safe 原理解析

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/5i9wmJs4_Er7RaYfNnETyA作者:xieweipeng MySQL作为当下最流行 ...

  5. 深度学习降噪专题课:实现WSPK实时蒙特卡洛降噪算法

    大家好~本课程基于全连接和卷积神经网络,学习LBF等深度学习降噪算法,实现实时路径追踪渲染的降噪 本课程偏向于应用实现,主要介绍深度学习降噪算法的实现思路,演示实现的效果,给出实现的相关代码 线上课程 ...

  6. vue-cli3开启gzip压缩

    首先添加yarn add 插件 "compression-webpack-plugin" 然后在vue.config.js里引入 在configureWebpack里增加插件代码. ...

  7. P1228-递归【黄】

    这道大递归我一开始就找对了方向,不过了MLE,然后从网上搜索到了一个贼有用的概念--尾递归,即如果递归的下一句就是return且没有返回值或者返回值不含有递归函数则编译器会做优化,不会压入新的函数而是 ...

  8. 文心一言 VS 讯飞星火 VS chatgpt (185)-- 算法导论14.1 2题

    二.用go语言,对于图 14-1中的红黑树 T 和关键字 x.key 为35的结点x,说明执行 OS-RANK(T,x) 的过程. 文心一言: 在红黑树中,OS-RANK(T, x) 是一个操作,用于 ...

  9. 单例bean与原型bean的区别

    在使用Spring开发时,Spring提供了五种scope,分别为singleton,prototype,request,session,global session. 上图为各个scope描述的官方 ...

  10. [转帖]07、kvm虚拟机的克隆

    操作前先关闭虚拟机 虚拟机的克隆 一.命令行克隆virt-clone(方法一) virt-clone -o vm1 -n vm2 -f /kvmdata/vm2.img 参数说明: -o:指定需要被c ...