.net6使用nacos作为配置中心 电脑版发表于:2022/11/13 21:05 tn2>consul+.net core实现配置中心: https://www.tnblog.net/aojiancc2/article/details/6815 nacos的安装参考: https://www.tnblog.net/aojiancc2/article/details/7865 nacos的官方文档: https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html .net 的sdk https://github.com/nacos-group/nacos-sdk-csharp nacos下.net的驱动地址: https://github.com/nacos-group/nacos-sdk-csharp [TOC] ## .net6使用nacos作为配置中心基本使用 ### 第一步,添加依赖库 ``` <PackageReference Include="nacos-sdk-csharp" Version="1.3.4" /> <PackageReference Include="nacos-sdk-csharp.AspNetCore" Version="1.3.4" /> <PackageReference Include="nacos-sdk-csharp.Extensions.Configuration" Version="1.3.4" /> <PackageReference Include="nacos-sdk-csharp.IniParser" Version="1.3.4" /> <PackageReference Include="nacos-sdk-csharp.YamlParser" Version="1.3.4" /> ``` ### 第二步,在appsettings.json中配置好使用nacos的信息 ``` { "NacosConfig": { "Listeners": [ { "Optional": false, "DataId": "tnblog.main.test", "Group": "DEFAULT_GROUP" } ], //"Namespace": "csharp-demo", // Please set the value of Namespace ID !!!!!!!! "ServerAddresses": [ "http://xxx.yyy.zzz.yyyy:8848" ], "UserName": "nacos", "Password": "nacos" //"AccessKey": "", //"SecretKey": "" //"EndPoint": "acm.aliyun.com", //"ConfigFilterAssemblies": [ "YouPrefix.AssemblyName" ], //"ConfigFilterExtInfo": "some ext infomation" } } ``` 最主要就是nacos服务的地址,登录nacos的账户与密码等。以及需要配置到nacos上面的配置信息,比如我这里配置的要读取的是Group为DEFAULT_GROUP,DataId为tnblog.main.test的配置。这个我们就需要在nacos中去配置好,相关的配置。  **比如我们随便配置一点内容:** 就把appsettings.json中默认的日志配置进去,然后加了一点数据库与Kestrel的配置,项目启动端口什么的。 ``` { "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "Kestrel": { "Limits": { "MaxConcurrentConnections": 100, "MaxConcurrentUpgradedConnections": 100 }, "DisableStringReuse": true, "EndPoints": { "Http": { "Url": "http://*:8805" // 项目启动端口 } } }, "DbConfig":{ "DbType": 0, //数据库连接字符串 "ConnectionString": "Data Source=localhost;port=3306;Initial Catalog=TNBLOG;uid=root;pwd=123456;CharSet=utf8mb4;Allow User Variables=true;", "IsAutoCloseConnection": true } } ``` 在nacos中的配置效果如下:  ### 第三步,在Program.cs中去加载nacos配置 ``` var app = builder.Build(); builder.Host.UseNacosConfig(section: "NacosConfig", parser: null, logAction: null); // .UseNacosConfig(section: "NacosConfig", parser: Nacos.YamlParser.YamlConfigurationStringParser.Instance logAction: null) // .UseNacosConfig(section: "NacosConfig", parser: Nacos.IniParser.IniConfigurationStringParser.Instance logAction: null) //v1.3.3之前版本的用法 //builder.Host.ConfigureAppConfiguration(webBuilder => //{ // webBuilder.AddNacosV2Configuration(webBuilder.Build().GetSection("nacos")); // Console.WriteLine("ConfigureWebHostDefaults"); //}); ``` 基本的操作就完成了,现在我们读取配置文件的内容就已经是配置在nacos上面的了 ## 测试读取配置 ``` private readonly IConfiguration _configuration; private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger, IConfiguration configuration) { _logger = logger; _configuration = configuration; } [HttpGet] public IEnumerable<string> Get() { var dbConfig = _configuration.GetSection("DbConfig"); //读取连接字符串配置 string connectionString = dbConfig["ConnectionString"]; //读取配置 string isAutoCloseConnection = _configuration["DbConfig:IsAutoCloseConnection"]; return new List<string>() { connectionString, isAutoCloseConnection }; } ``` 使用配置的启动端口8805去访问项目进行测试就能看到配置会被成功读取:  #### 项目下载地址 https://download.tnblog.net/resource/index/f0c04703387b4ec5908ba4e022ccbe81 ## 加载多个配置文件,比如加载独立的与公共的 很简单在Listeners中去配置多个就行了,这样就可以加载多个配置文件了。  比如我这里加载了tnblog.main.common以及tnblog.main.test两个配置文件。  加载多个配置文件后,每个配置文件中的内容都可以使用,如果多个配置文件中有重复的配置,后面的会覆盖前面的。 **测试读取的代码** 在两个配置文件中去写点配置,然后读取测试即可 ``` [HttpGet] public IEnumerable<string> Get() { var dbConfig = _configuration.GetSection("DbConfig"); //读取连接字符串配置 string connectionString = dbConfig["ConnectionString"]; //读取配置 string isAutoCloseConnection = _configuration["DbConfig:IsAutoCloseConnection"]; //读取common里边的配置 string UserName = _configuration["UserName"]; string Password = _configuration["Password"]; return new List<string>() { connectionString, isAutoCloseConnection }; } ``` ## 怎么动态的加载不同的配置文件,比如动态切换生产环境与本地开发环境 **很简单,配合.net 中的环境变量使用即可。** 比如我们开发的环境使用的nacos地址是http://192.168.1.1:8848, 线上使用的nacos地址是https://www.tnblog.net/nacos **我们就可以在appsettings.json中配置两个出来** 比如 ``` //开发环境使用的nacos "NacosConfig-Development": { "Listeners": [ { "Optional": false, "DataId": "tnblog.main.test", "Group": "DEFAULT_GROUP" } ], "ServerAddresses": [ "http://192.168.1.1:8848" ], "UserName": "nacos", "Password": "nacos" }, //正式环境使用的nacos "NacosConfig-Production": { "Listeners": [ { "Optional": false, "DataId": "tnblog.main.test", "Group": "DEFAULT_GROUP" } ], "ServerAddresses": [ "https://www.tnblog.net/nacos" ], "UserName": "nacos", "Password": "nacos" } ``` **然后在Program.cs使用nacos配置的时候根据环境变量来即可** ``` //获取环境变量。可以环境变量的不同去读取不同naocs服务的配置 string environmentName = builder.Environment.EnvironmentName; //nacos注册中心 builder.Host.UseNacosConfig(section: "NacosConfig-"+ environmentName, parser: null, logAction: null); ``` 测试的时候你本地直接运行获取的就是Development的配置,如果是发布出来后运行的获取的就是Production **当然你也可以在同一个nacos服务中根据不同的环境变量去加载不同的配置文件** 比如你在nacos中创建配置环境的时候可以命名:tnblog.main.test.Development以及tnblog.main.test.Production然后根据不同的环境变量去加载不同的配置。根据实际情况灵活运用即可。 ## 常用错误解决 ....