Nacos配置中心+ASP.NET Core
- 2021 年 12 月 26 日
- 筆記
- .NET Core, Asp.Net Core, nacos
Nacos配置中心
nacos
是一個構建雲原生應用的動態服務發現、配置管理和服務管理平台。。
源碼已上傳至 github
配置管理
asp.net core中所有的配置項,如appsetting.json進行集中管理,支持熱加載,支持服務發現。
- nacos github //github.com/alibaba/nacos
- csharp sdk github //github.com/nacos-group/nacos-sdk-csharp
- csharp sdk 文檔://nacos-sdk-csharp.readthedocs.io/en/latest/introduction/gettingstarted.html
- //nacos.io/zh-cn/
安裝請參考://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: //192.168.0.10:8848/nacos/index.html
' ' ;. ;.--. .-. | / / '' | |: :| : ;_
| | | \ | \__\/: . .. ' / ' | .; : \ \ `. //nacos.io
' : | ; .' ," .--.; |' ; :__| : | `----. \
| | '`--' / / ,. |' | '.'|\ \ / / /`--' /
' : | ; : .' \ : : `----' '--'. /
; |.' | , .-./\ \ / `--'---'
'---' `--`---' `----'
默認運行在8848端口
- //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" />
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> { "//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> { "//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-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" />
在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": [
"//localhost:8848/"
],
"UserName": "nacos",
"Password": "nacos",
"AccessKey": "",
"SecretKey": "",
"EndPoint": "",
"ConfigFilterAssemblies": [
],
"ConfigFilterExtInfo": ""
}
}
在上面我們可以看到DataId
為common
的、我們去管理端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