Skip to content
.NET 开发者指北.NET 开发者指北
CMS
.NET指北
FreeKit
Docker
关于
博客
github icon
    • .NET Core 学习示例文档
      • 创建简单Hello World
        • .NET Core 简单测试项目
          • FreeSql+ASP.NET Core
            • RESTful+FreeSql+AutoMapper
              • IdentityServer4
                • 七牛云对象存储
                  • ImCore 即时通讯
                    • Nacos 配置中心
                      • 配置管理
                        • 开始
                        • 必做
                          • Nacos+Console
                            • Nacso+Asp.NET Core
                              • Docker 安装 Nacos
                                • 更多指令
                                • 博客
                                • Serilog指北
                                  • 在 ASP.NET Core 6 如何添加 Startup.cs
                                    • 在 ASP.NET Core 6 中添加Startup.cs的整洁方式

                                    Nacos 配置中心

                                    calendar icon2021年12月22日timer icon大约 5 分钟word icon约 1648 字

                                    此页内容
                                    • 配置管理
                                      • 开始
                                    • 必做
                                    • Nacos+Console
                                    • Nacso+Asp.NET Core
                                    • Docker 安装 Nacos
                                      • 更多指令
                                    • 博客

                                    # Nacos 配置中心

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

                                    # 配置管理

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

                                    • nacos github https://github.com/alibaba/nacosopen in new window
                                    • csharp sdk github https://github.com/nacos-group/nacos-sdk-csharpopen in new window
                                    • csharp sdk 文档:https://nacos-sdk-csharp.readthedocs.io/en/latest/introduction/gettingstarted.htmlopen in new window
                                    • https://nacos.io/zh-cn/open in new window

                                    安装请参考:https://nacos.io/zh-cn/docs/quick-start.htmlopen in new window

                                    # 开始

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

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

                                    startup.cmd -m standalone
                                    
                                    1
                                    • 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
                                    '   : |  ; .' ," .--.; |'   ; :__|   :    |  `----.   \
                                    |   | '`--'  /  /  ,.  |'   | '.'|\   \  /  /  /`--'  /
                                    '   : |     ;  :   .'   \   :    : `----'  '--'.     /
                                    ;   |.'     |  ,     .-./\   \  /            `--'---'
                                    '---'        `--`---'     `----'
                                    
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6
                                    7
                                    8
                                    9
                                    10
                                    11
                                    12
                                    13
                                    14
                                    15
                                    16
                                    17
                                    18

                                    默认运行在 8848 端口

                                    • http://localhost:8848/nacos/#/login
                                    • nacos
                                    • nacos

                                    # 必做

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

                                    • 命名空间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" />
                                    
                                    1
                                    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;
                                    }
                                    
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6
                                    7
                                    8
                                    9
                                    10
                                    11
                                    12
                                    13
                                    14
                                    15
                                    16
                                    17

                                    配置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;
                                        });
                                    }
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6
                                    7
                                    8
                                    9
                                    10
                                    11
                                    12
                                    13
                                    14
                                    15
                                    16
                                    17
                                    18
                                    19
                                    20
                                    21
                                    22
                                    23
                                    24
                                    25
                                    26
                                    27
                                    28

                                    调用

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

                                    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}");
                                        }
                                    }
                                    
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6
                                    7
                                    8
                                    9
                                    10
                                    11
                                    12
                                    13
                                    14
                                    15
                                    16
                                    17
                                    18
                                    19
                                    20
                                    21
                                    22
                                    23
                                    24
                                    25
                                    26
                                    27
                                    28
                                    29
                                    30
                                    31
                                    32
                                    33
                                    34
                                    35
                                    36
                                    37
                                    38
                                    39
                                    40
                                    41
                                    42
                                    43
                                    44
                                    45
                                    46
                                    47
                                    48
                                    49

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

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

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

                                    配置管理 -选cs-test,可以看到Data Id为demo-dateid,Group为demo-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" />
                                    
                                    1
                                    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);
                                            });
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6
                                    7
                                    8
                                    9
                                    10
                                    11

                                    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": ""
                                      }
                                    }
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6
                                    7
                                    8
                                    9
                                    10
                                    11
                                    12
                                    13
                                    14
                                    15
                                    16
                                    17
                                    18
                                    19
                                    20
                                    21
                                    22
                                    23
                                    24
                                    25

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

                                    新增二个配置项

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

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

                                    我们新增一个类

                                        public class UserInfo
                                        {
                                            public string Name { get; set; }
                                            public string Sex { get; set; }
                                            public int Age { get; set; }
                                        }
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6

                                    在默认的控制器注入 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;
                                        }
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6
                                    7
                                    8
                                    9
                                    10
                                    11
                                    12
                                    13
                                    14
                                    15
                                    16
                                    17
                                    18
                                    19

                                    会输出如下内容

                                    info: NacosApi.Controllers.WeatherForecastController[0]
                                          commonkey:commonkey_value_值
                                    info: NacosApi.Controllers.WeatherForecastController[0]
                                          demokey:demo_value_值
                                    
                                    1
                                    2
                                    3
                                    4

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

                                    {
                                      "name": "luo",
                                      "sex": "Boy",
                                      "age": 99
                                    }
                                    
                                    1
                                    2
                                    3
                                    4
                                    5

                                    # 注意

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

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

                                    builder.Services.Configure<UserInfo>(builder.Configuration.GetSection("UserInfo"));
                                    
                                    1
                                    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";
                                    }
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6
                                    7
                                    8
                                    9
                                    10
                                    11
                                    12
                                    13
                                    14
                                    15
                                    16
                                    17
                                    18
                                    19
                                    20
                                    21
                                    22
                                    23
                                    24
                                    25
                                    26
                                    27
                                    28
                                    29
                                    30
                                    31
                                    32
                                    33
                                    34

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

                                    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}
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6

                                    只有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}
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6

                                    # Docker 安装 Nacos

                                    • https://www.cnblogs.com/niunafei/p/12803965.htmlopen in new window

                                      1.拉取镜像

                                    docker pull nacos/nacos-server
                                    
                                    1

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

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

                                    配置数据库

                                    vim /root/nacos/conf/application.properties
                                    
                                    1
                                    • 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
                                    
                                    
                                    1
                                    2
                                    3
                                    4
                                    5
                                    6

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

                                    management.endpoints.web.exposure.include=*
                                    
                                    1

                                    运行容器:使用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
                                    
                                    1

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

                                    # 更多指令

                                    启动容器

                                    docker start 容器id
                                    或者
                                    docker start nacos
                                    
                                    1
                                    2
                                    3

                                    关闭容器

                                    docker stop nacos
                                    
                                    1

                                    # 博客

                                    • 聊一聊如何在.NET Core 中使用 Nacos 2.0open in new window
                                    edit icon在 GitHub 上编辑此页open in new window
                                    上次编辑于: 2022/6/2 11:02:17
                                    贡献者: igeekfan,luoyunchong
                                    上一页
                                    ImCore 即时通讯
                                    下一页
                                    Serilog指北
                                    MIT Licensed | Copyright © 2021-present luoyunchong
                                    苏ICP备16046457号-1

                                    该应用可以安装在你的 PC 或移动设备上。这将使该 Web 应用程序外观和行为与其他应用程序相同。它将在出现在应用程序列表中,并可以固定到主屏幕,开始菜单或任务栏。此 Web 应用程序还将能够与其他应用程序和你的操作系统安全地进行交互。

                                    详情