聊一聊如何在.NET Core中使用Nacos 2.0

前言

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

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

纯 SDK 的使用

首先要安装 nuget 包

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

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

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

services.AddNacosV2Config(x =>
{x.ServerAddresses = new System.Collections.Generic.List<string> { "http://localhost:8848/" };x.EndPoint = "";x.Namespace = "cs-test";/*x.UserName = "nacos";x.Password = "nacos";*/// swich to use http or rpcx.ConfigUseRpc = true;
});services.AddNacosV2Naming(x =>
{x.ServerAddresses = new System.Collections.Generic.List<string> { "http://localhost:8848/" };x.EndPoint = "";x.Namespace = "cs-test";/*x.UserName = "nacos";x.Password = "nacos";*/// swich to use http or rpcx.NamingUseRpc = true;
});

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

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

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

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

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

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}");
}

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

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

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

class DemoConfigListener : IListener
{public void ReceiveConfigInfo(string configInfo){Console.WriteLine($"================收到配置变更信息了 ===》{configInfo}");}
}

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

static async Task ListenConfig(INacosConfigService svc, IListener listener)
{var dataId = "demo-dateid";var group = "demo-group";// 添加监听await svc.AddListener(dataId, group, listener);await Task.Delay(500);// 模拟配置变更,listener会收到变更信息await PublishConfig(svc);await Task.Delay(500);await PublishConfig(svc);await Task.Delay(500);// 移除监听await svc.RemoveListener(dataId, group, listener);// 配置变更后,listener不会收到变更信息await PublishConfig(svc);
}

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

DemoConfigListener listener = new DemoConfigListener();
await PublishConfig(configSvc);
await GetConfig(configSvc);
await RemoveConfig(configSvc);
await ListenConfig(configSvc, listener);

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

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

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

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

static async Task RegisterInstance(INacosNamingService svc, int port = 9999)
{await Task.Delay(500);var instace = new Nacos.V2.Naming.Dtos.Instance{ServiceName = "demo-svc1",ClusterName = Nacos.V2.Common.Constants.DEFAULT_CLUSTER_NAME,Ip = "127.0.0.1",Port = port,Enabled = true,Ephemeral = true,Healthy = true,Weight = 100,InstanceId = $"demo-svc1-127.0.0.1-{port}",Metadata = new System.Collections.Generic.Dictionary<string, string>{{ "m1", "v1" },{ "m2", "v2" },}};// 注册实例有很多重载,选适合自己的即可。await svc.RegisterInstance(instace.ServiceName, Nacos.V2.Common.Constants.DEFAULT_GROUP, instace);Console.WriteLine($"======================注册实例成功");
}static async Task GetAllInstances(INacosNamingService svc)
{await Task.Delay(500);// 获取全部实例有很多重载,选适合自己的即可。最后一个参数表明要不要订阅这个服务// SelectInstances, SelectOneHealthyInstance 是另外的方法可以获取服务信息。var list = await svc.GetAllInstances("demo-svc1", Nacos.V2.Common.Constants.DEFAULT_GROUP, false);Console.WriteLine($"======================获取实例成功,{Newtonsoft.Json.JsonConvert.SerializeObject(list)}");
}static async Task DeregisterInstance(INacosNamingService svc)
{await Task.Delay(500);// 注销实例有很多重载,选适合自己的即可。await svc.DeregisterInstance("demo-svc1", Nacos.V2.Common.Constants.DEFAULT_GROUP, "127.0.0.1", 9999);Console.WriteLine($"======================注销实例成功");
}

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

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

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

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

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

class DemoEventListener : IEventListener
{public Task OnEvent(IEvent @event){if (@event is Nacos.V2.Naming.Event.InstancesChangeEvent e){Console.WriteLine($"==========收到服务变更事件=======》{Newtonsoft.Json.JsonConvert.SerializeObject(e)}");}return Task.CompletedTask;}
} 

订阅的具体使用:

static async Task Subscribe(INacosNamingService svc, IEventListener listener)
{// 订阅服务变化await svc.Subscribe("demo-svc1", Nacos.V2.Common.Constants.DEFAULT_GROUP, listener);// 模拟服务变化,listener会收到变更信息await RegisterInstance(svc, 9997);await Task.Delay(3000);// 取消订阅await svc.Unsubscribe("demo-svc1", Nacos.V2.Common.Constants.DEFAULT_GROUP, listener);// 服务变化后,listener不会收到变更信息await RegisterInstance(svc);await Task.Delay(1000);
}

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

DemoEventListener eventListener = new DemoEventListener();
await RegisterInstance(namingSvc);
await GetAllInstances(namingSvc);
await DeregisterInstance(namingSvc);
await Subscribe(namingSvc, eventListener);

大致输出如下:

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

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

集成配置

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

首先要安装 nuget 包

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

然后是相关配置

{"NacosConfig": {"Listeners": [{"Optional": false,"DataId": "options1","Group": "DEFAULT_GROUP"},{"Optional": false,"DataId": "options2","Group": "DEFAULT_GROUP"},{"Optional": false,"DataId": "raw","Group": "DEFAULT_GROUP"}],  "Tenant": "cs","ServerAddresses": [ "http://localhost:8848/" ],"UserName": "","Password": "","AccessKey": "","SecretKey": "","EndPoint": ""}
}

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

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

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

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

public void ConfigureServices(IServiceCollection services)
{services.Configure<Options1>(Configuration.GetSection("AppSettings:Options1"));services.Configure<Options2>(Configuration.GetSection("AppSettings:Options2"));services.AddControllers();
}

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

[ApiController]
[Route("api/[controller]")]
public class ConfigController : ControllerBase
{private readonly ILogger<ConfigController> _logger;private readonly IConfiguration _configuration;private readonly Options1 _settings1;private readonly Options2 _settings2;public ConfigController(ILogger<ConfigController> logger,IConfiguration configuration,IOptionsMonitor<Options1> settings1,IOptionsMonitor<Options2> settings2){_logger = logger;_configuration = configuration;_settings1 = settings1.CurrentValue;_settings2 = settings2.CurrentValue;}[HttpGet]public string Get(){_logger.LogInformation($"=====Options1======{Newtonsoft.Json.JsonConvert.SerializeObject(_settings1)}======");_logger.LogInformation($"=====Options2======{Newtonsoft.Json.JsonConvert.SerializeObject(_settings2)}======");_logger.LogInformation($"=====Raw With ConnectionStr======{_configuration.GetConnectionString("Default")}======");_logger.LogInformation($"=====Raw With Other======{_configuration["other"]}======");return "ok";}
}

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

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

集成服务

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

首先要安装 nuget 包

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

然后是服务的相关配置。

 "nacos": {"EndPoint": "","ServerAddresses": [ "http://localhost:8848" ],"DefaultTimeOut": 15000,"Namespace": "cs","ListenInterval": 1000,"ServiceName": "NetCoreNamingDemo","GroupName": "DEFAULT_GROUP","ClusterName": "DEFAULT","Ip": "","PreferredNetworks": "192.168","Port": 9877,"Weight": 100,"RegisterEnabled": true,"InstanceEnabled": true,"Ephemeral": true,"Secure": false,"AccessKey": "","SecretKey": "","UserName": "","Password": "","ConfigUseRpc": true,"NamingUseRpc": true,"NamingLoadCacheAtStart": "","Metadata": {"aa": "bb","cc": "dd"}}

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

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

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

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

public void ConfigureServices(IServiceCollection services)
{services.AddNacosAspNet(Configuration);services.AddControllers();
}

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

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

// 找出一个健康的实例
var instance = await _svc.SelectOneHealthyInstance("NetCoreNamingDemo", "DEFAULT_GROUP");
var host = $"{instance.Ip}:{instance.Port}";// 根据 secure 来判断服务要不要用 https,
// 这里是约定,参考了 spring cloud 那边,不是强制的,也可以用其他标识
var baseUrl = instance.Metadata.TryGetValue("secure", out _)? $"https://{host}": $"http://{host}";if (string.IsNullOrWhiteSpace(baseUrl)) return "empty";var url = $"{baseUrl}";var client = _factory.CreateClient();var resp = await client.GetAsync(url);
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

相关阅读

  • https://github.com/alibaba/nacos/releases/tag/2.0.0

  • 聊一聊和Nacos 2.0.0对接那些事

  • ASP.NET Core集成Nacos配置中心之适配多格式配置

  • 在.NET Core中用最原生的方式读取Nacos的配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

听说你刚转了Java?准备转回.NET吧!

牛年跳槽季如火如荼&#xff0c;敏锐点的小伙伴儿应该都留意到了&#xff0c;BAT新年都在招聘.NET。2020年11月份发布.NET5统一了七大应用方向&#xff0c;.NET6的2个预览版已经把Blazor升级、跨平台UI方案MAUI、CLR性能优化等都放出来了&#xff0c;.NET前景充满想象&#xff…

一个人开始废掉的3种迹象

1作家李尚龙说&#xff1a;“在大城市里&#xff0c;搞废一个人的方式特别简单。给你一个安静狭小的空间&#xff0c;给你一根网线&#xff0c;最好再加一个外卖电话。好了&#xff0c;你开始废了。”之前的我并不相信人会这么轻易地堕落&#xff0c;直到身边出现了一个真实的例…

WPF 动态更换图片路径

wpf中动态修改图片路径&#xff0c;其实很简单&#xff0c;有个小伙伴有疑问&#xff0c;绑定了source,为什么不能显示图片呢。。。通过绑定&#xff0c;修改图片路径&#xff0c;动态显示图片&#xff0c;效果如下&#xff1a;图片支持本地路径和网络路径&#xff0c;下面就来…

听说你在学习算法?清华教授为你准备了一份独家秘籍!

也许您渴望进入国内外IT名企&#xff0c;却屡屡在算法类面试中折戟&#xff0c;苦恼不知如何破解困境&#xff1b;也许您是一位IT工程师&#xff0c;却因为算法能力不足而错过无数次的升职加薪&#xff0c;困扰不知如何突破瓶颈&#xff1b;也许您是一位大学生/中学生&#xff…

用VirtualWifi软件实现无线网卡同时连接多个AP。

2019独角兽企业重金招聘Python工程师标准>>> 用VirtualWifi软件实现无线网卡同时连接多个AP。 随着信息技术的发展&#xff0c;越来越多的人开始使用便捷的无线路由器&#xff08;AP&#xff09;组建家庭局域网。当你发现你周围有多个AP可以连接的时候&#xff0c;是…

机器学习萌新必学的Top10算法

导读&#xff1a;在机器学习领域里&#xff0c;不存在一种万能的算法可以完美解决所有问题&#xff0c;尤其是像预测建模的监督学习里。所以&#xff0c;针对你要解决的问题&#xff0c;最好是尝试多种不同的算法。并借一个测试集来评估不同算法之间的表现&#xff0c;最后选出…

分支结构程序案例c语言,C语言学习之三——分支结构程序

运算符优先级&#xff1a;如下所示&#xff1a;image.png关系运算符和表达式关系运算符定义&#xff1a;在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。因此使用关系运算符进行比较(注&#xff1a;比较后的返回值为boolean值&#xff0c;即0或1(真为1&#xf…

诺基亚首款Windows Phone智能手机将在年内推出

诺基亚高级官员星期日称&#xff0c;第一款采用微软Windows Phone操作系统的诺基亚智能手机的目标发布日期将在几天之内确定下来。诺基亚的目标是在将这种手机推向市场。诺基亚负责智能设备的执行副总裁乔哈洛&#xff08;Jo Harlow&#xff09;称&#xff0c;诺基亚和微软的技…

IOT必备之MQTT结构分析,不进来看看?【后附源码】

全网唯一物联网MQTT协议报文结构分析以及基于C#代码的报文组装实现介绍MQTT是一种基于TCP/IP协议的应用层协议&#xff0c;它规定了不同应用之间进行数据交换时的传送格式。既然是协议&#xff0c;理论上可以被任何开发语言实现它&#xff0c;以运行在任何平台&#xff0c;这个…

要成为年薪五十万的数据分析师,除了技术还需要什么?

超过59%企业&#xff0c;将提高数据分析岗位数量----一流的数据分析师&#xff0c;年薪轻松突破50万想必同学们看到这个数据并不惊讶&#xff0c;如今在中国&#xff0c;各行各业对数据分析岗位的需求日益提高&#xff1a;在线社交媒体&#xff0c;希望通过数据时刻洞察用户关注…

c语言电脑蓝屏代码,电脑蓝屏代码0x0000001a的解决方法

遇到蓝屏&#xff0c;第一时间记录停机码&#xff0c;如有导致蓝屏的文件名&#xff0c;那么排查的范围就会缩小。下面小编就为大家介绍电脑蓝屏代码0x0000001a的解决方法介绍&#xff0c;希望能对大家有所帮助&#xff01;方法/步骤1、先看这张截图的停机码所在位置。STOP后面…

关于序列建模,是时候抛弃RNN和LSTM了

作者表示&#xff1a;我们已经陷入 RNN、LSTM 和它们变体的坑中很多年&#xff0c;是时候抛弃它们了&#xff01;在 2014 年&#xff0c;RNN 和 LSTM 起死回生。我们都读过 Colah 的博客《Understanding LSTM Networks》和 Karpathy 的对 RNN 的颂歌《The Unreasonable Effecti…

如何运用并行编程Parallel提升任务执行效率

本文来自小易&#xff0c;【DoTNET技术圈】公众号已获得转载授权。《.NET并发变成实战》读后感&#xff1a;并行编程Parallel手打目录&#xff1a;一、前言二、任务并行库&#xff08;TPL&#xff09;的介绍三、Parallel.Invoke的使用四、Parallel.For的使用五、Parallel.ForEa…

通过 GitHub Actions 自动创建 Github Release

通过 GitHub Actions 自动创建 Github ReleaseIntro在 GitHub 上维护了几个小的开源项目&#xff0c;每次在发布新版本的时候会创建一个 release&#xff0c;这样可以比较方便的找到对应的版本的代码&#xff0c;不需要再人肉的从 git log 中找到指定的 commit&#xff0c;而且…

利用win7的applocker功能来有组织的阻止相关软件运行

我有4年没用360相关的软件了&#xff0c;没有360的弹窗用电脑就是舒服。但是我的电脑有时候会有别人来用&#xff0c;我的同学或者我的父母。但是他们经常会自作主张地在我的电脑上装上360卫士&#xff0c;还有360浏览器。每次都是装了我再删&#xff0c;反反复复也不是办法。后…

人工智能会让工作环境变得更公平,还是更压抑?

人工智改变的不仅仅是工作内容……人工智能&#xff08;AI&#xff09;正在踏足商业领域。正如我们本周的特别报道所诠释到的那样&#xff0c;所有类型的公司都在利用人工智能来预测需求&#xff0c;雇佣员工和对付客户。2017年&#xff0c;企业在与人工智能相关的并购交易中支…

离开时请告诉自己生意就是生意

离开时请告诉自己生意就是生意 离职或者被离职&#xff0c;是职场中很常见的事情&#xff0c;每天这个星球上不知道要发生多少次&#xff0c;不管你经历过与否、体会到其中的滋味与否&#xff0c;他都会一直存在着&#xff01;当这一切发生时&#xff0c;不管你是获利者还是受害…

如何假装成一名好程序员?

最近我对一位资深程序员就工作生活问题进行了深度采访&#xff0c;采访内容如下&#xff1a;Q&#xff1a;请问你工作多久了&#xff1f;A&#xff1a;5年了Q&#xff1a;你觉得&#xff0c;程序员这份工作对你有什么影响吗&#xff1f;A&#xff1a;有Q&#xff1a;那你的生活…

c语言 gbk字模点阵数组,GBK点阵显示字库的制作和使用

GBK编码共收录汉字21003个、符号883个&#xff0c;并提供1894个造字码位&#xff0c;简、繁体字融于一库。以两个字节表示一个汉字&#xff0c;编码范围是0x8140~0xfefe&#xff0c;兼容GB2318&#xff0c;并覆盖了unicode中的所有汉字。Win7记事本默认以GBK保存汉字。开发环境…

云服务器下行_腾讯云轻量应用服务器简单测评

这台机器的配置是1核心1G内存3M带宽,一直在吃灰&#xff0c;到现在才想起来应该测评一下腾讯云活动推荐​cloud.tencent.com测评机器概况从图中可以看到这台机器CPU采用 AMD EPYC 7K62 48-Core Processor 主频2.60GhzI/O大致129.3MB/S 用来建站是没问题的。3Mbps上行带宽跑满,下…