聊一聊如何在.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的配置
總結
以上是生活随笔為你收集整理的聊一聊如何在.NET Core中使用Nacos 2.0的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NET问答:如何理解 IEnumerab
- 下一篇: 听说你刚转了Java?准备转回.NET吧