jk's notes
  • ASP.NET Core 使用 Nacos

ASP.NET Core 使用 Nacos

1. 说明

nacos 维护数据采用分级制, 采用物理二级, 逻辑三级的结构来维护数据.

  • 物理上使用命名空间作为数据隔离, 是完全隔离的数据. 一般不同运行环境使用不同的命名空间. 例如 dev, sit 等.
  • 逻辑上使用三层, 是指在命名空间下, 使用联合层级. 采用 组名 + dataId 的形式来提供配置.

加入集群, 多实例等结构后, nacos 管理数据的层级也会增加.

nacos 官方提供了 SDK 的连接, 直接可以使用:

image-20251030161403378

.NET 需要使用的基础包是: nacos-sdk-csharp, 它提供了所有可用的接口, 包括配置操作, 以及服务注册与发现.

C# 的文档地址为: https://nacos-sdk-csharp.readthedocs.io/en/latest/

2. 配置服务

2.1 使用步骤

基本使用步骤:

  1. 引入 nacos-sdk-csharp.
  2. 调用 AddNacosV2Config 扩展方法, 注册服务, 并配置 nacos 服务器的信息.
  3. 在代码中注入 INacosConfigService.
  4. 调用配置服务的 GetConfig() 方法来活动配置信息. 配置信息是一个字符串.
  5. 如果调用 GetConfigAndSignListener() 时可以传入一个监听器, 或直接调用配置服务的 AddListener() 方法直接注册监听器.
  6. 当配置数据发生变更时, 监听器会收到消息, 触发 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, 而不是显示的名字.

image-20251030181759787

3.3 使用步骤

使用步骤:

  1. 创建两个项目, 分别姓名为 nacos-productor 和 nacos-consumer.

  2. nacos-productor 项目中

    1. 引用 nacos-sdk-csharp.AspNetCore.
    2. 注册服务 (保证项目启动后就会自动注册).
    3. 编写需要提供服务的接口 (在控制器中定义方法).
  3. nacos-consumer 项目中

    1. 引用 nacos-sdk-csharp.
    2. 注册服务. 这里是利用名字获取服务, 可以调用 AddNacosV2Naming 方法注册名字服务.
    3. 在控制器中注入 INacosNamingService 服务.
    4. 调用获取实例的方法来获得生产者的 IP 与 port.
    5. 构造 Uri 来调用接口.
Last Updated: 10/31/25, 4:39 PM
Contributors: jk