Nacos配置中心+ASP.NET Core
Nacos配置中心
nacos
是一个构建云原生应用的动态服务发现、配置管理和服务管理平台。。
源码已上传至 github
配置管理
域名 core中所有的配置项,如域名进行集中管理,支持热加载,支持服务发现。
- nacos github https://域名/alibaba/nacos
- csharp sdk github https://域名/nacos-group/nacos-sdk-csharp
- csharp sdk 文档:https://nacos-sdk-域名/en/latest/introduction/域名
- https://域名/zh-cn/
安装请参考:https://域名/zh-cn/docs/quick-域名
开始
- windows 进入nacos的bin目录,或把目录
D:\work\tools\nacos\bin
(我本地)配置到环境变量中的Path中。
即可在任意位置,执行命令
域名 -m standalone
- standalone代表着单机模式运行,非集群模式
C:\WINDOWS\system32>域名 -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.域名:8848/nacos/域名
\' \' ;. ;.--. .-. | / / \'\' | |: :| : ;_
| | | \ | \__\/: . .. \' / \' | .; : \ \ `. https://域名
\' : | ; .\' ," .--.; |\' ; :__| : | `----. \
| | \'`--\' / / ,. |\' | \'.\'|\ \ / / /`--\' /
\' : | ; : .\' \ : : `----\' \'--\'. /
; |.\' | , .-./\ \ / `--\'---\'
\'---\' `--`---\' `----\'
默认运行在8848端口
- http://localhost:8848/nacos/#/login
- nacos
- nacos
必做
登录后,打开命名空间->新建命名空间->
-
命名空间ID
:这里填,cs-test
,注意下方的配置项Namespace请填写此值。 -
命名空间名:
这个只是用于展示区分,填cs-test
,建议直接和命名空间id相同即可。 -
描述:
:这个随便填
Nacos+Console
新建一个控制台项目
引入包
<PackageReference Include="域名ing" Version="6.0.0" />
<PackageReference Include="nacos-sdk-csharp" Version="1.2.2" />
static IHost AppStartup()
{
var host = 域名teDefaultBuilder()
.ConfigureServices((context, services) =>
{
ConfigureServices(context, services);
域名ransient<App>();
})
.ConfigureAppConfiguration((host, config) =>
{
})
.Build(); // Build the Host
return host;
}
配置nacos
的服务
static void ConfigureServices(HostBuilderContext context,IServiceCollection services)
{
域名acosV2Config(x =>
{
域名erAddresses = new 域名域名<string> { "http://localhost:8848/" };
域名oint = "";
域名space = "cs-test";
/*域名Name = "nacos";
域名word = "nacos";*/
// swich to use http or rpc
域名igUseRpc = true;
});
域名acosV2Naming(x =>
{
域名erAddresses = new 域名域名<string> { "http://localhost:8848/" };
域名oint = "";
域名space = "cs-test";
/*域名Name = "nacos";
域名word = "nacos";*/
// swich to use http or rpc
域名ngUseRpc = true;
});
}
调用
var host = AppStartup();
var service = 域名teInstance<App>(域名ices);
await 域名sync(args);
域名文件配置
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-" + 域名ixTimeSeconds().ToString();
await 域名y(500);
var flag = await 域名ishConfig(dataId, group, val);
域名eLine($"======================发布配置结果,{flag}");
}
static async Task GetConfig(INacosConfigService svc)
{
var dataId = "demo-dateid";
var group = "demo-group";
await 域名y(500);
var config = await 域名onfig(dataId, group, 5000L);
域名eLine($"======================获取配置结果,{config}");
}
static async Task RemoveConfig(INacosConfigService svc)
{
var dataId = "demo-dateid";
var group = "demo-group";
await 域名y(500);
var flag = await 域名veConfig(dataId, group);
域名eLine($"=====================删除配置结果,{flag}");
}
}
f5运行后可看到输出如下内容
======================发布配置结果,True
======================获取配置结果,test-value-1637000754
=====================删除配置结果,True
我们把await RemoveConfig(_ns);
这行删除,即可在nacos的网站上看到信息。
配置管理 -选cs-test
,可以看到Data Id为demo-dateid
,Group
为demo-group
的一行数据,点击行内的编辑即可看到具体信息。
Nacso+域名 Core
新增包
<PackageReference Include="nacos-sdk-域名etCore" Version="1.2.2" />
<PackageReference Include="nacos-sdk-域名iguration" Version="1.2.2" />
在Program中配置服务
域名igureAppConfiguration((context, builder) =>
{
var c = 域名d();
// 从配置文件读取Nacos相关配置
// 默认会使用JSON解析器来解析存在Nacos Server的配置
域名acosV2Configuration(域名ection("NacosConfig"));
// 也可以按需使用ini或yaml的解析器
// 域名acosV2Configuration(域名ection("NacosConfig"), 域名域名ance);
// 域名acosV2Configuration(域名ection("NacosConfig"), 域名域名ance);
});
域名
配置
{
"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": ""
}
}
在上面我们可以看到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
,像从域名中获取数据一样,可直接取出来。
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 = 域名ection("UserInfo").Get<UserInfo>();
var commonvalue = _configuration["commonkey"];
var demovalue = _configuration["demokey"];
域名nformation("commonkey:" + commonvalue);
域名nformation("demokey:" + demovalue);
return userInfo1;
}
会输出如下内容
info: 域名herForecastController[0]
commonkey:commonkey_value_值
info: 域名herForecastController[0]
demokey:demo_value_值
并在界面上返回 UserInfo的信息。
{
"name": "luo",
"sex": "Boy",
"age": 99
}
注意
- 当二个
DataId
中配置的json,包含相同的Key时,实际会依后面的Key中值为准。顺序以域名中的配置Listeners的数组顺序为依据。
当然我们通过强类型绑定UserInfo
,在Program
配置服务
域名igure<UserInfo>(域名ection("UserInfo"));
public ConfigController(ILogger<ConfigController> logger,
IConfiguration configuration,
IOptions<UserInfo> options1,
IOptionsSnapshot<UserInfo> options2,
IOptionsMonitor<UserInfo> options3
)
{
_logger = logger;
_configuration = configuration;
_user1 = 域名e;
_user2 = 域名e;
_user3 = 域名entValue;
}
[HttpGet]
public string Get()
{
string id = 域名uid().ToString("N");
域名nformation($"============== begin {id} =====================");
var str1 = 域名域名alizeObject(_user1);
域名nformation($"{id} IOptions = {str1}");
var str2 = 域名域名alizeObject(_user2);
域名nformation($"{id} IOptionsSnapshot = {str2}");
var str3 = 域名域名alizeObject(_user3);
域名nformation($"{id} IOptionsMonitor = {str3}");
域名nformation($"===============================================");
return "ok";
}
当然输出是一模一样的。我们在界面上再次调整下数据
info: 域名igController[0]
7bafb7f9cd2a46ec95324e38d01048aa IOptions = {"Name":"luo","Sex":"Boy","Age":99}
info: 域名igController[0]
7bafb7f9cd2a46ec95324e38d01048aa IOptionsSnapshot = {"Name":"luo","Sex":"Boy","Age":99}
info: 域名igController[0]
7bafb7f9cd2a46ec95324e38d01048aa IOptionsMonitor = {"Name":"luo","Sex":"Boy","Age":99}
只有IOptions<UserInfo>
不会变化,其他是会跟着变化的。
info: 域名igController[0]
604d8db7b0ad48ccbc64c3ccd06eb524 IOptions = {"Name":"luo","Sex":"Boy","Age":99}
info: 域名igController[0]
604d8db7b0ad48ccbc64c3ccd06eb524 IOptionsSnapshot = {"Name":"abc","Sex":"Boy","Age":99}
info: 域名igController[0]
604d8db7b0ad48ccbc64c3ccd06eb524 IOptionsMonitor = {"Name":"abc","Sex":"Boy","Age":99}
Docker 安装 Nacos
- https://域名/niunafei/p/域名
1.拉取镜像
docker pull nacos/nacos-server
2、创建本地的映射文件,域名erties,
mkdir -p /root/nacos/logs /root/nacos/conf
配置数据库
vim /root/nacos/conf/域名erties
- 域名erties
域名form=mysql
域名=1
域名.0=jdbc:mysql://ip:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
域名=userid
域名word=userpassword
下面通过配置来暴露除了/shutdown之外的所有端点。下面通过配置来暴露除了/shutdown之外的所有端点
域名.域名ude=*
运行容器:使用standalone
模式并开放8848端口,并映射配置文件和日志目录,数据库在域名erties中配置
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/域名erties:/home/nacos/conf/域名erties --restart always --name nacos nacos/nacos-server
其中-v 指定映射配置。左侧为linux文件,右侧为docker目录
更多指令
启动容器
docker start 容器id
或者
docker start nacos
关闭容器
docker stop nacos
博客
- 聊一聊如何在.NET Core中使用Nacos 2.0