当前位置:   article > 正文

.Net6中使用Nacos做服务和配置_net6 nacos

net6 nacos

1、添加api项目并注册到服务中心

        nacos服务端需要自己下载安装,请参照官方文档

        地址:什么是 Nacos

        下载完成后,按照文档提示启动Nacos,在浏览器查看控制台:Nacos本地链接

        1.1、根据需要安装nuget

  1. dotnet add package nacos-sdk-csharp
  2. dotnet add package nacos-sdk-csharp.AspNetCore
  3. dotnet add package nacos-sdk-csharp.Extensions.Configuration
  4. dotnet add package nacos-sdk-csharp.YamlParser
  5. dotnet add package nacos-sdk-csharp.IniParser

        1.2、在program.cs中添加服务

  1. //builder
  2. using Nacos.AspNetCore.V2;
  3. var builder = WebApplication.CreateBuilder(args);
  4. {
  5. // Add services to the container.
  6. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  7. builder.Services.AddEndpointsApiExplorer();
  8. builder.Services.AddSwaggerGen();
  9. builder.Services.AddMvc(option => { option.EnableEndpointRouting = false; });
  10. // nacos server v1.x or v2.x
  11. builder.Services.AddNacosAspNet(builder.Configuration);
  12. }
  13. //app
  14. var app = builder.Build();
  15. {
  16. // Configure the HTTP request pipeline.
  17. if (app.Environment.IsDevelopment())
  18. {
  19. app.UseSwagger();
  20. app.UseSwaggerUI();
  21. }
  22. app.UseMvcWithDefaultRoute();
  23. app.Run();
  24. }

        1.3、在appsettings.json中添加nacos节点

  1. "nacos": {
  2. "EndPoint": "",
  3. "ServerAddresses": [ "http://localhost:8848" ],
  4. "DefaultTimeOut": 15000,
  5. "Namespace": "public",
  6. "ListenInterval": 1000,
  7. "ServiceName": "BaseApi", // your service name
  8. "GroupName": "DEFAULT_GROUP",
  9. "ClusterName": "DEFAULT",
  10. "Ip": "",
  11. "PreferredNetworks": "", // select an IP that matches the prefix as the service registration IP
  12. "Port": 0,
  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": false,
  24. "NamingLoadCacheAtStart": "",
  25. "LBStrategy": "WeightRandom", //WeightRandom WeightRoundRobin
  26. "Metadata": {
  27. "aa": "bb",
  28. "cc": "dd"
  29. }

        1.4、添加你的api控制器

  1. using Microsoft.AspNetCore.Mvc;
  2. namespace BaseApi
  3. {
  4. [Route("api/[controller]")]
  5. [ApiController]
  6. public class ValuesController : ControllerBase
  7. {
  8. private readonly Nacos.V2.INacosNamingService _svc;
  9. public ValuesController(Nacos.V2.INacosNamingService svc)
  10. {
  11. _svc = svc;
  12. }
  13. [HttpGet]
  14. public string Get()
  15. {
  16. return "Ok~" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff");
  17. }
  18. /// <summary>
  19. /// 从nacos中获取服务并选一个调用
  20. /// </summary>
  21. /// <returns></returns>
  22. [HttpGet("test")]
  23. public async Task<string> Test()
  24. {
  25. // 这里需要知道被调用方的服务名
  26. var instance = await _svc.SelectOneHealthyInstance("BaseApi", "DEFAULT_GROUP");
  27. var host = $"{instance.Ip}:{instance.Port}";
  28. var baseUrl = instance.Metadata.TryGetValue("secure", out _)
  29. ? $"https://{host}"
  30. : $"http://{host}";
  31. if (string.IsNullOrWhiteSpace(baseUrl))
  32. {
  33. return "empty";
  34. }
  35. var url = $"{baseUrl}/api/values";
  36. using var client = new HttpClient();
  37. var result = await client.GetAsync(url);
  38. return await result.Content.ReadAsStringAsync();
  39. }
  40. }
  41. }

        1.5、启动你的Net6服务,可以启动多个(本地的话用不同的端口)

        1.6、打开Nacos服务端,查看服务注册的服务

                nacos服务地址:Nacos本地链接

        可以看到已注册到服务中心

        1.7、测试服务调用

 2、配置管理和手动注册服务

        2.1、配置管理

        2.1.1、添加配置服务

  1. //用于管理Nacos的配置的信息
  2. builder.Services.AddNacosV2Config(x =>
  3. {
  4. x.ServerAddresses = new System.Collections.Generic.List<string> { "http://localhost:8848/" };
  5. x.EndPoint = "";
  6. x.Namespace = "public";
  7. x.UserName = "nacos";
  8. x.Password = "nacos";
  9. // this sample will add the filter to encrypt the config with AES.
  10. x.ConfigFilterAssemblies = new System.Collections.Generic.List<string> { "BaseApi" };
  11. // swich to use http or rpc
  12. x.ConfigUseRpc = false;
  13. });

        2.1.2添加配置管理控制器

  1. using Microsoft.AspNetCore.Mvc;
  2. using Nacos.V2;
  3. namespace UpService
  4. {
  5. /// <summary>
  6. /// 操作配置信息
  7. /// </summary>
  8. [ApiController]
  9. [Route("api/[controller]")]
  10. public class ConfigController : ControllerBase
  11. {
  12. private readonly IConfiguration _configuration;
  13. private readonly INacosConfigService _svc;
  14. public ConfigController(IConfiguration configuration, INacosConfigService svc)
  15. {
  16. _configuration = configuration;
  17. _svc = svc;
  18. }
  19. [HttpGet("get")]
  20. public async Task<string> Get(string dataId= "default-dev.yaml")
  21. {
  22. var res = await _svc.GetConfig(dataId, "DEFAULT_GROUP", 3000).ConfigureAwait(false);
  23. return res ?? "empty config";
  24. }
  25. [HttpGet("set")]
  26. public async Task<bool> Put(string dataId = "default-dev.yaml")
  27. {
  28. var res = await _svc.PublishConfig(dataId, "DEFAULT_GROUP", "test:demo-0001").ConfigureAwait(false);
  29. return res;
  30. }
  31. [HttpGet("listener")]
  32. public async Task<string> Listen(string dataId = "default-dev.yaml")
  33. {
  34. await _svc.AddListener(dataId, "DEFAULT_GROUP", _configListen).ConfigureAwait(false);
  35. return "ok";
  36. }
  37. [HttpGet("unlistener")]
  38. public async Task<string> UnListen(string dataId = "default-dev.yaml")
  39. {
  40. await _svc.RemoveListener(dataId, "DEFAULT_GROUP", _configListen).ConfigureAwait(false);
  41. return "ok";
  42. }
  43. private static readonly CusConfigListen _configListen = new ();
  44. public class CusConfigListen : Nacos.V2.IListener
  45. {
  46. public void ReceiveConfigInfo(string configInfo)
  47. {
  48. System.Console.WriteLine("config updating " + configInfo);
  49. }
  50. }
  51. }
  52. }

        2.2手动注册服务管理服务

        2.2.1、添加手动注册服务管理服务

  1. //用于添加临时服务
  2. builder.Services.AddNacosV2Naming(x =>
  3. {
  4. x.ServerAddresses = new System.Collections.Generic.List<string> { "http://localhost:8848/" };
  5. x.EndPoint = "";
  6. x.Namespace = "public";
  7. // swich to use http or rpc
  8. x.NamingUseRpc = false;
  9. });

        2.2.2、添加手动注册服务控制器

  1. using Microsoft.AspNetCore.Mvc;
  2. using Nacos.V2.Utils;
  3. namespace UpService
  4. {
  5. /// <summary>
  6. /// 手动操作服务实例-增删监听
  7. /// </summary>
  8. public class NamingController : Controller
  9. {
  10. private readonly Nacos.V2.INacosNamingService _client;
  11. public NamingController(Nacos.V2.INacosNamingService client)
  12. {
  13. _client = client;
  14. }
  15. // GET n/g
  16. [HttpGet("GetAllInstances")]
  17. public async Task<string> GetAllInstances()
  18. {
  19. var list = await _client.GetAllInstances("MyService1", false).ConfigureAwait(false);
  20. var res = list.ToJsonString();
  21. return res ?? "GetAllInstances";
  22. }
  23. // GET n/r
  24. [HttpGet("RegisterInstance")]
  25. public async Task<string> RegisterInstance()
  26. {
  27. // await _client.RegisterInstance("mysvc", "127.0.0.1", 9635);
  28. var instance = new Nacos.V2.Naming.Dtos.Instance
  29. {
  30. Ip = "127.0.0.1",
  31. Ephemeral = true,
  32. Port = 5088,
  33. ServiceName = "mysvc2"
  34. };
  35. await _client.RegisterInstance("MyService1", instance).ConfigureAwait(false);
  36. return "RegisterInstance ok";
  37. }
  38. // GET n/r2
  39. [HttpGet("RegisterInstance2")]
  40. public async Task<string> RegisterInstance2()
  41. {
  42. // await _client.RegisterInstance("mysvc", "127.0.0.1", 9635);
  43. var instance = new Nacos.V2.Naming.Dtos.Instance
  44. {
  45. Ip = "127.0.0.1",
  46. Ephemeral = true,
  47. Port = 5089,
  48. ServiceName = "MyService1"
  49. };
  50. await _client.RegisterInstance("MyService1", instance).ConfigureAwait(false);
  51. return "RegisterInstance ok";
  52. }
  53. // GET n/dr
  54. [HttpGet("DeregisterInstance")]
  55. public async Task<string> DeregisterInstance()
  56. {
  57. // await _client.RegisterInstance("mysvc", "127.0.0.1", 9635);
  58. var instance = new Nacos.V2.Naming.Dtos.Instance
  59. {
  60. Ip = "127.0.0.1",
  61. Ephemeral = true,
  62. Port = 9562,
  63. ServiceName = "mysvc2"
  64. };
  65. await _client.DeregisterInstance("mysvc2", instance).ConfigureAwait(false);
  66. return "DeregisterInstance ok";
  67. }
  68. // GET n/si
  69. [HttpGet("SelectInstances")]
  70. public async Task<string> SelectInstances()
  71. {
  72. var list = await _client.SelectInstances("mysvc2", true, false).ConfigureAwait(false);
  73. var res = list.ToJsonString();
  74. return res ?? "SelectInstances ok";
  75. }
  76. // GET n/gs
  77. [HttpGet("GetServicesOfServer")]
  78. public async Task<string> GetServicesOfServer()
  79. {
  80. var list = await _client.GetServicesOfServer(1, 10).ConfigureAwait(false);
  81. var res = list.ToJsonString();
  82. return res ?? "GetServicesOfServer";
  83. }
  84. // GET n/sub
  85. [HttpGet("Subscribe")]
  86. public async Task<string> Subscribe()
  87. {
  88. await _client.Subscribe("mysvc2", listener).ConfigureAwait(false);
  89. return "Subscribe";
  90. }
  91. // GET n/unsub
  92. [HttpGet("Unsubscribe")]
  93. public async Task<string> Unsubscribe()
  94. {
  95. await _client.Unsubscribe("mysvc2", listener).ConfigureAwait(false);
  96. return "UnSubscribe";
  97. }
  98. // NOTE: MUST keep Subscribe and Unsubscribe to use one instance of the listener!!!
  99. // DO NOT create new instance for each opreation!!!
  100. private static readonly CusListener listener = new ();
  101. public class CusListener : Nacos.V2.IEventListener
  102. {
  103. public Task OnEvent(Nacos.V2.IEvent @event)
  104. {
  105. if (@event is Nacos.V2.Naming.Event.InstancesChangeEvent e)
  106. {
  107. System.Console.WriteLine("CusListener");
  108. System.Console.WriteLine("ServiceName" + e.ServiceName);
  109. System.Console.WriteLine("GroupName" + e.GroupName);
  110. System.Console.WriteLine("Clusters" + e.Clusters);
  111. System.Console.WriteLine("Hosts" + e.Hosts.ToJsonString());
  112. }
  113. return Task.CompletedTask;
  114. }
  115. }
  116. }
  117. }

官方地址:Nacos快速开始

更多信息请查看 博客 或者关注公众号:Z技术

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/876409
推荐阅读
相关标签
  

闽ICP备14008679号