Nacos配置中心

nacos 是一个构建云原生应用的动态服务发现、配置管理和服务管理平台。。

源码已上传至 github

配置管理

asp.net core中所有的配置项,如appsetting.json进行集中管理,支持热加载,支持服务发现。

安装请参考:https://nacos.io/zh-cn/docs/quick-start.html

开始

  • windows 进入nacos的bin目录,或把目录 D:\work\tools\nacos\bin(我本地)配置到环境变量中的Path中。

即可在任意位置,执行命令

startup.cmd -m standalone
  • standalone代表着单机模式运行,非集群模式
C:\WINDOWS\system32>startup.cmd -m standalone
"nacos is starting with standalone" ,--.
,--.'|
,--,: : | Nacos 2.0.3
,`--.'`| ' : ,---. Running in stand alone mode, All function modules
| : : | | ' ,'\ .--.--. Port: 8848
: | \ | : ,--.--. ,---. / / | / / ' Pid: 14504
| : ' '; | / \ / \. ; ,. :| : /`./ Console: http://192.168.0.10:8848/nacos/index.html
' ' ;. ;.--. .-. | / / '' | |: :| : ;_
| | | \ | \__\/: . .. ' / ' | .; : \ \ `. https://nacos.io
' : | ; .' ," .--.; |' ; :__| : | `----. \
| | '`--' / / ,. |' | '.'|\ \ / / /`--' /
' : | ; : .' \ : : `----' '--'. /
; |.' | , .-./\ \ / `--'---'
'---' `--`---' `----'

默认运行在8848端口

必做

登录后,打开命名空间->新建命名空间->

  • 命名空间ID:这里填,cs-test,注意下方的配置项Namespace请填写此值。
  • 命名空间名:这个只是用于展示区分,填cs-test,建议直接和命名空间id相同即可。
  • 描述::这个随便填

Nacos+Console

新建一个控制台项目

引入包

<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0" />
<PackageReference Include="nacos-sdk-csharp" Version="1.2.2" />
static IHost AppStartup()
{
var host = Host.CreateDefaultBuilder()
.ConfigureServices((context, services) =>
{
ConfigureServices(context, services);
services.AddTransient<App>();
})
.ConfigureAppConfiguration((host, config) =>
{ })
.Build(); // Build the Host return host;
}

配置nacos的服务

static void ConfigureServices(HostBuilderContext context,IServiceCollection services)
{
services.AddNacosV2Config(x =>
{
x.ServerAddresses = new System.Collections.Generic.List<string> { "http://localhost:8848/" };
x.EndPoint = "";
x.Namespace = "cs-test"; /*x.UserName = "nacos";
x.Password = "nacos";*/ // swich to use http or rpc
x.ConfigUseRpc = true;
}); services.AddNacosV2Naming(x =>
{
x.ServerAddresses = new System.Collections.Generic.List<string> { "http://localhost:8848/" };
x.EndPoint = "";
x.Namespace = "cs-test"; /*x.UserName = "nacos";
x.Password = "nacos";*/ // swich to use http or rpc
x.NamingUseRpc = true;
});
}

调用

var host = AppStartup();
var service = ActivatorUtilities.CreateInstance<App>(host.Services);
await service.RunAsync(args);

App.cs文件配置

public class App
{
private readonly ILogger<App> _logger;
private readonly INacosConfigService _ns;
public App(ILogger<App> logger, INacosConfigService ns)
{
_logger = logger;
_ns = ns;
} public async Task RunAsync(string[] args)
{
await PublishConfig(_ns);
await GetConfig(_ns);
await RemoveConfig(_ns);
} static async Task PublishConfig(INacosConfigService svc)
{
var dataId = "demo-dateid";
var group = "demo-group";
var val = "test-value-" + DateTimeOffset.Now.ToUnixTimeSeconds().ToString(); await Task.Delay(500);
var flag = await svc.PublishConfig(dataId, group, val);
Console.WriteLine($"======================发布配置结果,{flag}");
} static async Task GetConfig(INacosConfigService svc)
{
var dataId = "demo-dateid";
var group = "demo-group"; await Task.Delay(500);
var config = await svc.GetConfig(dataId, group, 5000L);
Console.WriteLine($"======================获取配置结果,{config}");
} static async Task RemoveConfig(INacosConfigService svc)
{
var dataId = "demo-dateid";
var group = "demo-group"; await Task.Delay(500);
var flag = await svc.RemoveConfig(dataId, group);
Console.WriteLine($"=====================删除配置结果,{flag}");
}
}

f5运行后可看到输出如下内容

======================发布配置结果,True
======================获取配置结果,test-value-1637000754
=====================删除配置结果,True

我们把await RemoveConfig(_ns);这行删除,即可在nacos的网站上看到信息。

配置管理 -选cs-test,可以看到Data Id为demo-dateidGroupdemo-group的一行数据,点击行内的编辑即可看到具体信息。

Nacso+Asp.NET Core

新增包

<PackageReference Include="nacos-sdk-csharp.AspNetCore" Version="1.2.2" />
<PackageReference Include="nacos-sdk-csharp.Extensions.Configuration" Version="1.2.2" />

在Program中配置服务

builder.Host.ConfigureAppConfiguration((context, builder) =>
{
var c = builder.Build(); // 从配置文件读取Nacos相关配置
// 默认会使用JSON解析器来解析存在Nacos Server的配置
builder.AddNacosV2Configuration(c.GetSection("NacosConfig"));
// 也可以按需使用ini或yaml的解析器
// builder.AddNacosV2Configuration(c.GetSection("NacosConfig"), Nacos.IniParser.IniConfigurationStringParser.Instance);
// builder.AddNacosV2Configuration(c.GetSection("NacosConfig"), Nacos.YamlParser.YamlConfigurationStringParser.Instance);
});

appsetting.json配置

{
"NacosConfig": {
"Listeners": [
{
"Optional": false,
"DataId": "common",
"Group": "DEFAULT_GROUP"
},
{
"Optional": false,
"DataId": "demo",
"Group": "DEFAULT_GROUP"
}
],
"Namespace": "cs-test",
"ServerAddresses": [
"http://localhost:8848/"
],
"UserName": "nacos",
"Password": "nacos",
"AccessKey": "",
"SecretKey": "",
"EndPoint": "",
"ConfigFilterAssemblies": [
],
"ConfigFilterExtInfo": ""
}
}

在上面我们可以看到DataIdcommon的、我们去管理端UI,命名空间为cs-test新增一个配置

新增二个配置项

  • Data ID:common
  • Group:DEFAULT_GROUP
  • 配置内容:选择json。
{
"UserInfo":{
"Name":"luo",
"Sex":"Boy",
"Age":99
},
"commonkey":"commonkey_value_值"
}
  • Data ID:demo
  • Group:DEFAULT_GROUP
  • 配置内容:选择json。
{
"demokey":"demo_value_值"
}

那我们如何获取的这么一个json值和demokey中的值呢。

我们新增一个类

    public class UserInfo
{
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
}

在默认的控制器注入 IConfiguration,像从appsettings.json中获取数据一样,可直接取出来。

    private readonly ILogger<ConfigController> _logger;
private readonly IConfiguration _configuration; public ConfigController(ILogger<WeatherForecastController> logger, IConfiguration configuration)
{
_logger = logger;
_configuration = configuration;
} [HttpGet("getconfig")]
public UserInfo GetConfig()
{
var userInfo1 = _configuration.GetSection("UserInfo").Get<UserInfo>();
var commonvalue = _configuration["commonkey"];
var demovalue = _configuration["demokey"];
_logger.LogInformation("commonkey:" + commonvalue);
_logger.LogInformation("demokey:" + demovalue);
return userInfo1;
}

会输出如下内容

info: NacosApi.Controllers.WeatherForecastController[0]
commonkey:commonkey_value_值
info: NacosApi.Controllers.WeatherForecastController[0]
demokey:demo_value_值

并在界面上返回 UserInfo的信息。

{
"name": "luo",
"sex": "Boy",
"age": 99
}

注意

  • 当二个DataId中配置的json,包含相同的Key时,实际会依后面的Key中值为准。顺序以appsetting.json中的配置Listeners的数组顺序为依据。

当然我们通过强类型绑定UserInfo,在Program配置服务

builder.Services.Configure<UserInfo>(builder.Configuration.GetSection("UserInfo"));
public ConfigController(ILogger<ConfigController> logger,
IConfiguration configuration,
IOptions<UserInfo> options1,
IOptionsSnapshot<UserInfo> options2,
IOptionsMonitor<UserInfo> options3
)
{
_logger = logger;
_configuration = configuration;
_user1 = options1.Value;
_user2 = options2.Value;
_user3 = options3.CurrentValue;
} [HttpGet]
public string Get()
{
string id = Guid.NewGuid().ToString("N"); _logger.LogInformation($"============== begin {id} ====================="); var str1 = Newtonsoft.Json.JsonConvert.SerializeObject(_user1);
_logger.LogInformation($"{id} IOptions = {str1}"); var str2 = Newtonsoft.Json.JsonConvert.SerializeObject(_user2);
_logger.LogInformation($"{id} IOptionsSnapshot = {str2}"); var str3 = Newtonsoft.Json.JsonConvert.SerializeObject(_user3);
_logger.LogInformation($"{id} IOptionsMonitor = {str3}"); _logger.LogInformation($"==============================================="); return "ok";
}

当然输出是一模一样的。我们在界面上再次调整下数据

info: NacosApi.Controllers.ConfigController[0]
7bafb7f9cd2a46ec95324e38d01048aa IOptions = {"Name":"luo","Sex":"Boy","Age":99}
info: NacosApi.Controllers.ConfigController[0]
7bafb7f9cd2a46ec95324e38d01048aa IOptionsSnapshot = {"Name":"luo","Sex":"Boy","Age":99}
info: NacosApi.Controllers.ConfigController[0]
7bafb7f9cd2a46ec95324e38d01048aa IOptionsMonitor = {"Name":"luo","Sex":"Boy","Age":99}

只有IOptions<UserInfo>不会变化,其他是会跟着变化的。

info: NacosApi.Controllers.ConfigController[0]
604d8db7b0ad48ccbc64c3ccd06eb524 IOptions = {"Name":"luo","Sex":"Boy","Age":99}
info: NacosApi.Controllers.ConfigController[0]
604d8db7b0ad48ccbc64c3ccd06eb524 IOptionsSnapshot = {"Name":"abc","Sex":"Boy","Age":99}
info: NacosApi.Controllers.ConfigController[0]
604d8db7b0ad48ccbc64c3ccd06eb524 IOptionsMonitor = {"Name":"abc","Sex":"Boy","Age":99}

Docker 安装 Nacos

1.拉取镜像

docker pull nacos/nacos-server

2、创建本地的映射文件,application.properties,

mkdir -p  /root/nacos/logs /root/nacos/conf

配置数据库

vim /root/nacos/conf/application.properties
  • application.properties
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://ip:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=userid
db.password=userpassword

下面通过配置来暴露除了/shutdown之外的所有端点。下面通过配置来暴露除了/shutdown之外的所有端点

management.endpoints.web.exposure.include=*

运行容器:使用standalone模式并开放8848端口,并映射配置文件和日志目录,数据库在application.properties中配置

docker run -d -p 8848:8848 -p 9848:9848 -p 9555:9555 -e MODE=standalone -e PREFER_HOST_MODE=hostname -v /root/nacos/logs:/home/nacos/logs -v /root/nacos/conf/application.properties:/home/nacos/conf/application.properties --restart always --name nacos nacos/nacos-server

其中-v 指定映射配置。左侧为linux文件,右侧为docker目录

更多指令

启动容器

docker start 容器id
或者
docker start nacos

关闭容器

docker stop nacos

博客

Nacos配置中心+ASP.NET Core的更多相关文章

  1. SpringBoot使用Nacos配置中心

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

  2. ASP.NET Core 配置 MVC - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 配置 MVC - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 MVC 前面几章节中,我们都是基于 ASP.NET 空项目 ...

  3. ASP.NET Core 项目配置 ( Startup ) - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 项目配置 ( Startup ) - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 项目配置 ( Startup ) 前面几章节 ...

  4. Nacos配置中心

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

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

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

  6. Nacos配置中心使用

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

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

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

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

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

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

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

随机推荐

  1. Cycling City CF521E

    Cycling City 毒瘤题 首先建dfs树,由于是个无向图所有返祖边都是连向祖先的. 判是否有解其实很简单,只要图不是一个仙人掌就有解了. 仙人掌有关可以看这个博客 但是这道题由于要输出路径成功 ...

  2. 详解getchar()函数与缓冲区

    1.首先,我们看一下这段代码: 它的简单意思就是从键盘读入一个字符,然后输出到屏幕.理所当然,我们输入1,输出就是1,输入2,输出就是2. 那么我们如果输出的是12呢? 它的输出是1. 这里我们先简单 ...

  3. OpenSSH 密码和公钥认证原理探究

    目录 配置和保护SSH H3 - 使用SSH 访问远程命令行 H4 - 什么是OpenSSH ? H4 - 登录方式: H4 - 登录并执行临时命令: H4 - 查看登录用户 H4 - 登录原理 密码 ...

  4. 02 Windows安装C语言开发工具CodeBlocks

    CodeBlocks安装 使用微信扫码关注微信公众号,并回复:"C语言环境",免费获取下载链接! 1.卸载CodeBlocks(电脑未装此软件,跳过)    进入目录:C:\Pro ...

  5. django中的filter(), all(), get()

    1. 类名.objects中的get(), filter(), all() 的区别 结论: (1)all()返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使 ...

  6. 利用extern共享全局变量

    方法: 在xxx.h中利用extern关键字声明全局变量 extern int a; 在xxx.cpp中#include<xxx.h> 再定义 int a; 赋不赋初值无所谓,之后该全局变 ...

  7. 虚机扩大容量与vm减少所占容量

    Linux的虚拟机碎片整理 sudo dd if=/dev/zero of=/free bs=1M sudo rm -f /free 镜像压缩 移动镜像 VBoxManage internalcomm ...

  8. poi做一个简单的EXCAL

    //创建一个实体类 package text; import java.util.Date; public class Student { private int id; private String ...

  9. Tomcat简单介绍

    1.目录结构 在conf文件夹中修改了配置之后一定要重启Tomcat

  10. 【Fastjson】Fastjson反序列化由浅入深

    Fastjson真-简-介 fastjson是由alibaba开发并维护的一个json工具,以其特有的算法,号称最快的json库 fastjson的使用 首先先创一个简单的测试类User public ...