纯 SDK 在.NET Core中使用Nacos 2.0 代码方式注册服务

引用地址:聊一聊如何在.NET Core中使用Nacos 2.0_dotNET跨平台

前言

随着 nacos 2.0.0 正式发布,老黄这边也跟着发布了 1.0.2 版本的 nacos-sdk-csharp。

下面简单聊一下相关的使用。

纯 SDK 的使用

首先要安装 nuget 包

<PackageReference Include="nacos-sdk-csharp" Version="1.0.2" />

这里有一点要注意,包名里面的 unofficial 已经移除,请确保使用对了正确的包。

下面就是依赖注入的配置。

 
  1. services.AddNacosV2Config(x =>

  2. {

  3.     x.ServerAddresses = new System.Collections.Generic.List<string> { "http://localhost:8848/" };

  4.     x.EndPoint = "";

  5.     x.Namespace = "cs-test";

  6.     /*x.UserName = "nacos";

  7.    x.Password = "nacos";*/

  8.     // swich to use http or rpc

  9.     x.ConfigUseRpc = true;

  10. });

  11. services.AddNacosV2Naming(x =>

  12. {

  13.     x.ServerAddresses = new System.Collections.Generic.List<string> { "http://localhost:8848/" };

  14.     x.EndPoint = "";

  15.     x.Namespace = "cs-test";

  16.     /*x.UserName = "nacos";

  17.    x.Password = "nacos";*/

  18.     // swich to use http or rpc

  19.     x.NamingUseRpc = true;

  20. });

其中有两个关键配置, ConfigUseRpc 和 NamingUseRpc,分别表示配置和服务是否要使用最新的 gRPC 协议和服务端对接。

服务端是 2.0.0 的,一定要设置成 true

接下来看看配置这一块的使用。

配置这边暴露出来的接口是 INacosConfigService

发布,获取,删除配置的操作示例如下:

 
  1. static async Task PublishConfig(INacosConfigService svc)

  2. {

  3.     var dataId = "demo-dateid";

  4.     var group = "demo-group";

  5.     var val = "test-value-" + DateTimeOffset.Now.ToUnixTimeSeconds().ToString();

  6.     await Task.Delay(500);

  7.     var flag = await svc.PublishConfig(dataId, group, val);

  8.     Console.WriteLine($"======================发布配置结果,{flag}");

  9. }

  10. static async Task GetConfig(INacosConfigService svc)

  11. {

  12.     var dataId = "demo-dateid";

  13.     var group = "demo-group";

  14.     await Task.Delay(500);

  15.     var config = await svc.GetConfig(dataId, group, 5000L);

  16.     Console.WriteLine($"======================获取配置结果,{config}");

  17. }

  18. static async Task RemoveConfig(INacosConfigService svc)

  19. {

  20.     var dataId = "demo-dateid";

  21.     var group = "demo-group";

  22.     await Task.Delay(500);

  23.     var flag = await svc.RemoveConfig(dataId, group);

  24.     Console.WriteLine($"=====================删除配置结果,{flag}");

  25. }

这三个是常规操作,不会有太大的变化。

配置监听这一块是有所调整的,Listener 变成是必须要实现 IListener 接口的实例了。

其实里面也就只有一个方法,下面是一个简单的实现,收到配置变更信息后,把配置信息输出到控制台。

 
  1. class DemoConfigListener : IListener

  2. {

  3.     public void ReceiveConfigInfo(string configInfo)

  4.     {

  5.         Console.WriteLine($"================收到配置变更信息了 ===》{configInfo}");

  6.     }

  7. }

有了监听的实现后,就可以添加和移除监听了。

 
  1. static async Task ListenConfig(INacosConfigService svc, IListener listener)

  2. {

  3.     var dataId = "demo-dateid";

  4.     var group = "demo-group";

  5.     // 添加监听

  6.     await svc.AddListener(dataId, group, listener);

  7.     await Task.Delay(500);

  8.     // 模拟配置变更,listener会收到变更信息

  9.     await PublishConfig(svc);

  10.     await Task.Delay(500);

  11.     await PublishConfig(svc);

  12.     await Task.Delay(500);

  13.     // 移除监听

  14.     await svc.RemoveListener(dataId, group, listener);

  15.     // 配置变更后,listener不会收到变更信息

  16.     await PublishConfig(svc);

  17. }

把这些放在控制台里面跑一下

 
  1. DemoConfigListener listener = new DemoConfigListener();

  2. await PublishConfig(configSvc);

  3. await GetConfig(configSvc);

  4. await RemoveConfig(configSvc);

  5. await ListenConfig(configSvc, listener);

大概能看到下面这样的输出:

再来看一下服务这一块的使用。

服务这边暴露出来的接口是 INacosNamingService

注册,获取,注销服务的操作示例如下:

 
  1. static async Task RegisterInstance(INacosNamingService svc, int port = 9999)

  2. {

  3.     await Task.Delay(500);

  4.     var instace = new Nacos.V2.Naming.Dtos.Instance

  5.     {

  6.         ServiceName = "demo-svc1",

  7.         ClusterName = Nacos.V2.Common.Constants.DEFAULT_CLUSTER_NAME,

  8.         Ip = "127.0.0.1",

  9.         Port = port,

  10.         Enabled = true,

  11.         Ephemeral = true,

  12.         Healthy = true,

  13.         Weight = 100,

  14.         InstanceId = $"demo-svc1-127.0.0.1-{port}",

  15.         Metadata = new System.Collections.Generic.Dictionary<string, string>

  16.         {

  17.             { "m1", "v1" },

  18.             { "m2", "v2" },

  19.         }

  20.     };

  21.     // 注册实例有很多重载,选适合自己的即可。

  22.     await svc.RegisterInstance(instace.ServiceName, Nacos.V2.Common.Constants.DEFAULT_GROUP, instace);

  23.     Console.WriteLine($"======================注册实例成功");

  24. }

  25. static async Task GetAllInstances(INacosNamingService svc)

  26. {

  27.     await Task.Delay(500);

  28.     // 获取全部实例有很多重载,选适合自己的即可。最后一个参数表明要不要订阅这个服务

  29.     // SelectInstances, SelectOneHealthyInstance 是另外的方法可以获取服务信息。

  30.     var list = await svc.GetAllInstances("demo-svc1", Nacos.V2.Common.Constants.DEFAULT_GROUP, false);

  31.     Console.WriteLine($"======================获取实例成功,{Newtonsoft.Json.JsonConvert.SerializeObject(list)}");

  32. }

  33. static async Task DeregisterInstance(INacosNamingService svc)

  34. {

  35.     await Task.Delay(500);

  36.     // 注销实例有很多重载,选适合自己的即可。

  37.     await svc.DeregisterInstance("demo-svc1", Nacos.V2.Common.Constants.DEFAULT_GROUP, "127.0.0.1", 9999);

  38.     Console.WriteLine($"======================注销实例成功");

  39. }

这里的实例方法只是其中一部分,几乎每个方法都有很多的重载,大家按需选择即可。

服务的订阅,早期版本是一个印度小哥弄的一部分,基于udp的,不过效果并不好,所以一直没有启用这个功能。

在这个版本,已经启用了这个功能。

和监听配置一样,也要实现一个对应的接口  IEventListener

里面同样也就只有一个方法,下面是一个简单的实现,收到变更信息后,把服务信息输出到控制台。

 
  1. class DemoEventListener : IEventListener

  2. {

  3.     public Task OnEvent(IEvent @event)

  4.     {

  5.         if (@event is Nacos.V2.Naming.Event.InstancesChangeEvent e)

  6.         {

  7.             Console.WriteLine($"==========收到服务变更事件=======》{Newtonsoft.Json.JsonConvert.SerializeObject(e)}");

  8.         }

  9.         return Task.CompletedTask;

  10.     }

订阅的具体使用:

 
  1. static async Task Subscribe(INacosNamingService svc, IEventListener listener)

  2. {

  3.     // 订阅服务变化

  4.     await svc.Subscribe("demo-svc1", Nacos.V2.Common.Constants.DEFAULT_GROUP, listener);

  5.     // 模拟服务变化,listener会收到变更信息

  6.     await RegisterInstance(svc, 9997);

  7.     await Task.Delay(3000);

  8.     // 取消订阅

  9.     await svc.Unsubscribe("demo-svc1", Nacos.V2.Common.Constants.DEFAULT_GROUP, listener);

  10.     // 服务变化后,listener不会收到变更信息

  11.     await RegisterInstance(svc);

  12.     await Task.Delay(1000);

  13. }

同样放到控制台看看效果。

 
  1. DemoEventListener eventListener = new DemoEventListener();

  2. await RegisterInstance(namingSvc);

  3. await GetAllInstances(namingSvc);

  4. await DeregisterInstance(namingSvc);

  5. await Subscribe(namingSvc, eventListener);

大致输出如下:

到这里的话,纯 SDK 的基本使用就告一段落了。

下面再来看看集成 ASP.NET Core 的简单用法。

集成配置

集成配置,是为了集成 Microsoft.Extensions.Configuration, 只需要变更 Provider 就可以替换配置源。

首先要安装 nuget 包

<PackageReference Include="nacos-sdk-csharp.Extensions.Configuration" Version="1.0.2" />

然后是相关配置

 
  1. {

  2.   "NacosConfig": {

  3.     "Listeners": [

  4.       {

  5.         "Optional": false,

  6.         "DataId": "options1",

  7.         "Group": "DEFAULT_GROUP"

  8.       },

  9.       {

  10.         "Optional": false,

  11.         "DataId": "options2",

  12.         "Group": "DEFAULT_GROUP"

  13.       },

  14.       {

  15.         "Optional": false,

  16.         "DataId": "raw",

  17.         "Group": "DEFAULT_GROUP"

  18.       }

  19.     ],  

  20.     "Tenant": "cs",

  21.     "ServerAddresses": [ "http://localhost:8848/" ],

  22.     "UserName": "",

  23.     "Password": "",

  24.     "AccessKey": "",

  25.     "SecretKey": "",

  26.     "EndPoint": ""

  27.   }

  28. }

这里的意思是,这个应用需要监听三个配置项的变化,分别是 options1,options2 和 raw。

Optional 设置成 false,表示这个配置项不是可选的,是必须的,少了它程序就会出错。

需要在 nacos 控制台添加对应的配置。

如果使用 Option 的方式来读取配置的话,还需要在 Startup 里面进行绑定。

 
  1. public void ConfigureServices(IServiceCollection services)

  2. {

  3.     services.Configure<Options1>(Configuration.GetSection("AppSettings:Options1"));

  4.     services.Configure<Options2>(Configuration.GetSection("AppSettings:Options2"));

  5.     services.AddControllers();

  6. }

然后暴露出一个接口来查看配置。

 
  1. [ApiController]

  2. [Route("api/[controller]")]

  3. public class ConfigController : ControllerBase

  4. {

  5.     private readonly ILogger<ConfigController> _logger;

  6.     private readonly IConfiguration _configuration;

  7.     private readonly Options1 _settings1;

  8.     private readonly Options2 _settings2;

  9.     public ConfigController(

  10.         ILogger<ConfigController> logger,

  11.         IConfiguration configuration,

  12.         IOptionsMonitor<Options1> settings1,

  13.         IOptionsMonitor<Options2> settings2)

  14.     {

  15.         _logger = logger;

  16.         _configuration = configuration;

  17.         _settings1 = settings1.CurrentValue;

  18.         _settings2 = settings2.CurrentValue;

  19.     }

  20.     [HttpGet]

  21.     public string Get()

  22.     {

  23.         _logger.LogInformation($"=====Options1======{Newtonsoft.Json.JsonConvert.SerializeObject(_settings1)}======");

  24.         _logger.LogInformation($"=====Options2======{Newtonsoft.Json.JsonConvert.SerializeObject(_settings2)}======");

  25.         _logger.LogInformation($"=====Raw With ConnectionStr======{_configuration.GetConnectionString("Default")}======");

  26.         _logger.LogInformation($"=====Raw With Other======{_configuration["other"]}======");

  27.         return "ok";

  28.     }

  29. }

初次访问,正常输出相应的配置信息。

在控制台修改部分信息后,再次访问,可以看到对应的配置信息已经更新了。

集成服务

集成服务,是为了方便程序启动时,自动把服务注册到 Nacos 里面。

首先要安装 nuget 包

<PackageReference Include="nacos-sdk-csharp.Extensions.AspNetCore" Version="1.0.2" />

然后是服务的相关配置。

 
  1.  "nacos": {

  2.     "EndPoint": "",

  3.     "ServerAddresses": [ "http://localhost:8848" ],

  4.     "DefaultTimeOut": 15000,

  5.     "Namespace": "cs",

  6.     "ListenInterval": 1000,

  7.     "ServiceName": "NetCoreNamingDemo",

  8.     "GroupName": "DEFAULT_GROUP",

  9.     "ClusterName": "DEFAULT",

  10.     "Ip": "",

  11.     "PreferredNetworks": "192.168",

  12.     "Port": 9877,

  13.     "Weight": 100,

  14.     "RegisterEnabled": true,

  15.     "InstanceEnabled": true,

  16.     "Ephemeral": true,

  17.     "Secure": false,

  18.     "AccessKey": "",

  19.     "SecretKey": "",

  20.     "UserName": "",

  21.     "Password": "",

  22.     "ConfigUseRpc": true,

  23.     "NamingUseRpc": true,

  24.     "NamingLoadCacheAtStart": "",

  25.     "Metadata": {

  26.       "aa": "bb",

  27.       "cc": "dd"

  28.     }

  29.   }

这里面多了几个配置要单独说明一下。

  • InstanceEnabled, 表示这个服务注册上去后,是否马上就上线

  • Secure,表示当前服务是否是安全实例,用于标识访问的时候是否要启用 https,这个在发现服务后,可以从 Metadata 里面取到

然后再 Startup 里面添加自动注册的代码。

 
  1. public void ConfigureServices(IServiceCollection services)

  2. {

  3.     services.AddNacosAspNet(Configuration);

  4.     services.AddControllers();

  5. }

启动服务后,可以在 nacos 控制台看到相关的服务信息。

接下来就可以通过 INacosNamingService 接口来获取到这个服务了。

 
  1. // 找出一个健康的实例

  2. var instance = await _svc.SelectOneHealthyInstance("NetCoreNamingDemo", "DEFAULT_GROUP");

  3. var host = $"{instance.Ip}:{instance.Port}";

  4. // 根据 secure 来判断服务要不要用 https,

  5. // 这里是约定,参考了 spring cloud 那边,不是强制的,也可以用其他标识

  6. var baseUrl = instance.Metadata.TryGetValue("secure", out _)

  7.     ? $"https://{host}"

  8.     : $"http://{host}";

  9. if (string.IsNullOrWhiteSpace(baseUrl)) return "empty";

  10. var url = $"{baseUrl}";

  11. var client = _factory.CreateClient();

  12. var resp = await client.GetAsync(url);

  13. return await resp.Content.ReadAsStringAsync();

写在最后

本文虽然简单介绍了如何在 .NET Core 中使用 nacos 2.0 ,还有更多用法和细节等待挖掘和实现。

感兴趣的话,欢迎您的加入,一起开发完善。

nacos-sdk-csharp 的地址 :https://github.com/nacos-group/nacos-sdk-csharp

本文示例代码的地址 :https://github.com/catcherwong-archive/Nacos2Demo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值