ASP.NET Core 使用 Nacos
1. 说明
nacos 维护数据采用分级制, 采用物理二级, 逻辑三级的结构来维护数据.
- 物理上使用命名空间作为数据隔离, 是完全隔离的数据. 一般不同运行环境使用不同的命名空间. 例如
dev,sit等. - 逻辑上使用三层, 是指在命名空间下, 使用联合层级. 采用 组名 +
dataId的形式来提供配置.
加入集群, 多实例等结构后,
nacos管理数据的层级也会增加.
nacos 官方提供了 SDK 的连接, 直接可以使用:

.NET 需要使用的基础包是: nacos-sdk-csharp, 它提供了所有可用的接口, 包括配置操作, 以及服务注册与发现.
C# 的文档地址为: https://nacos-sdk-csharp.readthedocs.io/en/latest/
2. 配置服务
2.1 使用步骤
基本使用步骤:
- 引入
nacos-sdk-csharp. - 调用
AddNacosV2Config扩展方法, 注册服务, 并配置nacos服务器的信息. - 在代码中注入
INacosConfigService. - 调用配置服务的
GetConfig()方法来活动配置信息. 配置信息是一个字符串. - 如果调用
GetConfigAndSignListener()时可以传入一个监听器, 或直接调用配置服务的AddListener()方法直接注册监听器. - 当配置数据发生变更时, 监听器会收到消息, 触发
ReceiveConfigInfo()方法, 更新配置数据.
监听器是实现了 IListener 接口的类.
namespace Nacos.V2;
public interface IListener {
void ReceiveConfigInfo(string configInfo);
}
2.2 获取配置参考代码
引入 nacos-sdk-csharp:
<PackageReference Include="nacos-sdk-csharp" Version="1.3.10" />
注册服务, 配置 nacos 服务器:
builder.Services.AddNacosV2Config(x =>
{
x.ServerAddresses = new List<string> { "http://localhost:8848/" };
x.Namespace = "cs";
x.UserName = "nacos";
x.Password = "nacos";
});
// or
builder.Services.AddNacosV2Config(builder.Configuration);
控制器中注入服务:
private readonly INacosConfigService _config;
public HomeController(INacosConfigService config) {
_config = config;
}
创建监听器:
public class MyListener : IListener {
public void ReceiveConfigInfo(string configInfo) {
Console.WriteLine("接收到数据===> {0}", configInfo);
}
}
调用 GetConfig 方法来获得配置:
var conf = await _config.GetConfig(dataId, group, timeOut);
调用 AddListener 来注册监听器:
var listener = new MyListener();
await _config.AddListener(dataId, group, listener);
或者调用 GetConfigAndSignListener 来获取配置, 并注册监听器:
var listener = new MyListener();
var conf = await _config.GetConfigAndSignListener(dataId, group, timeOut, listener);
3. 服务发现
3.1 使用说明
获取配置也可以使用 nacos-sdk-csharp, 使用里面的名字服务.
builder.Services.AddNacosV2Naming(x => {
x.ServerAddresses = new List<string> { "http://localhost:8848/" };
x.Namespace = "public";
x.UserName = "nacos";
x.Password = "nacos";
});
然后注入的时候使用 INacosNamingService
可用方法包括:
| 方法名 | 含义 |
|---|---|
RegisterInstance | 注册服务. |
DeregisterInstance | 移除服务. |
GetAllInstances | 获得所有服务. |
SelectInstances | 获得复合条件的所有服务. |
SelectOneHealthyInstance | 选择一个可用的服务. |
Subscribe | 订阅一个服务, 服务变更时会收到通知. |
Unsubscribe | 注销订阅. |
订阅服务时也需要创建一个监听器, 使用接口:
public interface IEventListener {
Task OnEvent(IEvent @event);
}
早期的接口还需要定时发送心跳包给 nacos 服务器, 来保持连接. 新的接口采用长连接, 可以保证一直保持通信, 直至项目停止.
3.2 使用 nacos-sdk-csharp.AspNetCore
实际上使用 nacos-sdk-csharp.AspNetCore 来注册服务更加合适. 它会自动注册.
builder.Services.AddNacosAspNet(x =>
{
x.ServerAddresses = new List<string> { "http://localhost:8848/" };
x.Namespace = "cs";
x.ServiceName = "App2";
x.GroupName = "DEFAULT_GROUP";
x.ClusterName = "DEFAULT";
x.Ip = "";
x.PreferredNetworks = "";
x.Port = 0;
x.Weight = 100;
x.RegisterEnabled = true;
x.InstanceEnabled = true;
x.Ephemeral = true;
x.Secure = false;
});
// or
builder.Services.AddNacosAspNet(builder.Configuration);
因此一般使用的都是发现服务的方法, 例如 SelectOneHealthyInstance, 拿到服务对应的 IP 与 Port 后, 在构建 Uri, 实例化 HttpClient 来请求数据.
注意: 配置的时候命名空间需要使用命名空间的 ID, 而不是显示的名字.

3.3 使用步骤
使用步骤:
创建两个项目, 分别姓名为
nacos-productor和nacos-consumer.nacos-productor项目中- 引用
nacos-sdk-csharp.AspNetCore. - 注册服务 (保证项目启动后就会自动注册).
- 编写需要提供服务的接口 (在控制器中定义方法).
- 引用
nacos-consumer项目中- 引用
nacos-sdk-csharp. - 注册服务. 这里是利用名字获取服务, 可以调用
AddNacosV2Naming方法注册名字服务. - 在控制器中注入
INacosNamingService服务. - 调用获取实例的方法来获得生产者的
IP与port. - 构造
Uri来调用接口.
- 引用