一、什么是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. Hugging News #0506: StarCoder, DeepFloyd/IF 好多新的重量级模型

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  2. LayUI多文件上传,支持历史上传预览

    记录一次项目开发中,LayUI多个图片进行优化,需要支持多个图片上传.可删除某一个图片.支持加载上次上次图片. 页面代码: <div class="layui-upload" ...

  3. 当谈论 React hook,我们究竟说的是什么?

    这个标题很大,但是落点很小,只是我,一个开发者在学习和使用 hooks 中的一点感受和总结. React hook 的由来 React hook 的由来,其实也可以看作是前端技术不断演进的结果. 在 ...

  4. C# RSA 非对称加密

    代码: RSAHelper.cs(RSA加密工具类): using System; using System.Security.Cryptography; using System.Text; nam ...

  5. POJ 1985.Cow Marathon(DFS求树的直径模板题)

    两次BFS/DFS求树的直径 我们可以先从任意一点开始DFS,记录下当前点所能到达的最远距离,这个点为P. 在从P开始DFS记录下所能达到的最远点的距离,这个点为Q. \(P , Q\)就是直径的端点 ...

  6. 二、mysql安装(主从)

    上一篇: 一.mysql5.7 rpm 安装(单机)  https://www.cnblogs.com/yclh/p/14951314.html 环境      192.168.0.1 主节点     ...

  7. uni-app打包h5页面ios唤起软键盘踩坑

    问题:页面有很多input框,上面的input输入框,当虚拟键盘出来时没问题,但是下面的input输入框,就会出现问题,input输入框会跑到键盘后面. 网上一阵百度,找到原因:安卓手机中唤起软键盘时 ...

  8. P1216-DP【橙】

    在这道题中,我第一次用了memset,确实方便,不过需要注意的是只有全部赋值-1和0的时候才能使用它,否则他能干出吓死人的事.以及memset在cstring头文件里,在本地就算不include也能照 ...

  9. Kubernetes 网络:Pod 和 container 的那点猫腻

    1. Kubernetes 网络模型 在 Kubernetes 的网络模型中,最小的网络单位是 Pod.Pod 的网络设计原则是 IP-per-Pod,即 Pod 中 container 共享同一套网 ...

  10. 如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 3

    在本教程的前两部分,我们分别了解和学习了Prometheus 和 Grafana 的基本概念和使用的前提条件,以及使用 Helm 在 Kubernetes 上安装 Prometheus. 在今天的教程 ...