1、添加api项目并注册到服务中心
nacos服务端需要自己下载安装,请参照官方文档
地址:什么是 Nacos
下载完成后,按照文档提示启动Nacos,在浏览器查看控制台:Nacos本地链接
1.1、根据需要安装nuget
dotnet add package nacos-sdk-csharp
dotnet add package nacos-sdk-csharp.AspNetCore
dotnet add package nacos-sdk-csharp.Extensions.Configuration
dotnet add package nacos-sdk-csharp.YamlParser
dotnet add package nacos-sdk-csharp.IniParser
1.2、在program.cs中添加服务
//builder
using Nacos.AspNetCore.V2;
var builder = WebApplication.CreateBuilder(args);
{
// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddMvc(option => { option.EnableEndpointRouting = false; });
// nacos server v1.x or v2.x
builder.Services.AddNacosAspNet(builder.Configuration);
}
//app
var app = builder.Build();
{
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseMvcWithDefaultRoute();
app.Run();
}
1.3、在appsettings.json中添加nacos节点
"nacos": {
"EndPoint": "",
"ServerAddresses": [ "http://localhost:8848" ],
"DefaultTimeOut": 15000,
"Namespace": "public",
"ListenInterval": 1000,
"ServiceName": "BaseApi", // your service name
"GroupName": "DEFAULT_GROUP",
"ClusterName": "DEFAULT",
"Ip": "",
"PreferredNetworks": "", // select an IP that matches the prefix as the service registration IP
"Port": 0,
"Weight": 100,
"RegisterEnabled": true,
"InstanceEnabled": true,
"Ephemeral": true,
"Secure": false,
"AccessKey": "",
"SecretKey": "",
"UserName": "",
"Password": "",
"ConfigUseRpc": true,
"NamingUseRpc": false,
"NamingLoadCacheAtStart": "",
"LBStrategy": "WeightRandom", //WeightRandom WeightRoundRobin
"Metadata": {
"aa": "bb",
"cc": "dd"
}
1.4、添加你的api控制器
using Microsoft.AspNetCore.Mvc;
namespace BaseApi
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly Nacos.V2.INacosNamingService _svc;
public ValuesController(Nacos.V2.INacosNamingService svc)
{
_svc = svc;
}
[HttpGet]
public string Get()
{
return "Ok~" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff");
}
/// <summary>
/// 从nacos中获取服务并选一个调用
/// </summary>
/// <returns></returns>
[HttpGet("test")]
public async Task<string> Test()
{
// 这里需要知道被调用方的服务名
var instance = await _svc.SelectOneHealthyInstance("BaseApi", "DEFAULT_GROUP");
var host = $"{instance.Ip}:{instance.Port}";
var baseUrl = instance.Metadata.TryGetValue("secure", out _)
? $"https://{host}"
: $"http://{host}";
if (string.IsNullOrWhiteSpace(baseUrl))
{
return "empty";
}
var url = $"{baseUrl}/api/values";
using var client = new HttpClient();
var result = await client.GetAsync(url);
return await result.Content.ReadAsStringAsync();
}
}
}
1.5、启动你的Net6服务,可以启动多个(本地的话用不同的端口)
1.6、打开Nacos服务端,查看服务注册的服务
nacos服务地址:Nacos本地链接
可以看到已注册到服务中心
1.7、测试服务调用
2、配置管理和手动注册服务
2.1、配置管理
2.1.1、添加配置服务
//用于管理Nacos的配置的信息
builder.Services.AddNacosV2Config(x =>
{
x.ServerAddresses = new System.Collections.Generic.List<string> { "http://localhost:8848/" };
x.EndPoint = "";
x.Namespace = "public";
x.UserName = "nacos";
x.Password = "nacos";
// this sample will add the filter to encrypt the config with AES.
x.ConfigFilterAssemblies = new System.Collections.Generic.List<string> { "BaseApi" };
// swich to use http or rpc
x.ConfigUseRpc = false;
});
2.1.2添加配置管理控制器
using Microsoft.AspNetCore.Mvc;
using Nacos.V2;
namespace UpService
{
/// <summary>
/// 操作配置信息
/// </summary>
[ApiController]
[Route("api/[controller]")]
public class ConfigController : ControllerBase
{
private readonly IConfiguration _configuration;
private readonly INacosConfigService _svc;
public ConfigController(IConfiguration configuration, INacosConfigService svc)
{
_configuration = configuration;
_svc = svc;
}
[HttpGet("get")]
public async Task<string> Get(string dataId= "default-dev.yaml")
{
var res = await _svc.GetConfig(dataId, "DEFAULT_GROUP", 3000).ConfigureAwait(false);
return res ?? "empty config";
}
[HttpGet("set")]
public async Task<bool> Put(string dataId = "default-dev.yaml")
{
var res = await _svc.PublishConfig(dataId, "DEFAULT_GROUP", "test:demo-0001").ConfigureAwait(false);
return res;
}
[HttpGet("listener")]
public async Task<string> Listen(string dataId = "default-dev.yaml")
{
await _svc.AddListener(dataId, "DEFAULT_GROUP", _configListen).ConfigureAwait(false);
return "ok";
}
[HttpGet("unlistener")]
public async Task<string> UnListen(string dataId = "default-dev.yaml")
{
await _svc.RemoveListener(dataId, "DEFAULT_GROUP", _configListen).ConfigureAwait(false);
return "ok";
}
private static readonly CusConfigListen _configListen = new ();
public class CusConfigListen : Nacos.V2.IListener
{
public void ReceiveConfigInfo(string configInfo)
{
System.Console.WriteLine("config updating " + configInfo);
}
}
}
}
2.2手动注册服务管理服务
2.2.1、添加手动注册服务管理服务
//用于添加临时服务
builder.Services.AddNacosV2Naming(x =>
{
x.ServerAddresses = new System.Collections.Generic.List<string> { "http://localhost:8848/" };
x.EndPoint = "";
x.Namespace = "public";
// swich to use http or rpc
x.NamingUseRpc = false;
});
2.2.2、添加手动注册服务控制器
using Microsoft.AspNetCore.Mvc;
using Nacos.V2.Utils;
namespace UpService
{
/// <summary>
/// 手动操作服务实例-增删监听
/// </summary>
public class NamingController : Controller
{
private readonly Nacos.V2.INacosNamingService _client;
public NamingController(Nacos.V2.INacosNamingService client)
{
_client = client;
}
// GET n/g
[HttpGet("GetAllInstances")]
public async Task<string> GetAllInstances()
{
var list = await _client.GetAllInstances("MyService1", false).ConfigureAwait(false);
var res = list.ToJsonString();
return res ?? "GetAllInstances";
}
// GET n/r
[HttpGet("RegisterInstance")]
public async Task<string> RegisterInstance()
{
// await _client.RegisterInstance("mysvc", "127.0.0.1", 9635);
var instance = new Nacos.V2.Naming.Dtos.Instance
{
Ip = "127.0.0.1",
Ephemeral = true,
Port = 5088,
ServiceName = "mysvc2"
};
await _client.RegisterInstance("MyService1", instance).ConfigureAwait(false);
return "RegisterInstance ok";
}
// GET n/r2
[HttpGet("RegisterInstance2")]
public async Task<string> RegisterInstance2()
{
// await _client.RegisterInstance("mysvc", "127.0.0.1", 9635);
var instance = new Nacos.V2.Naming.Dtos.Instance
{
Ip = "127.0.0.1",
Ephemeral = true,
Port = 5089,
ServiceName = "MyService1"
};
await _client.RegisterInstance("MyService1", instance).ConfigureAwait(false);
return "RegisterInstance ok";
}
// GET n/dr
[HttpGet("DeregisterInstance")]
public async Task<string> DeregisterInstance()
{
// await _client.RegisterInstance("mysvc", "127.0.0.1", 9635);
var instance = new Nacos.V2.Naming.Dtos.Instance
{
Ip = "127.0.0.1",
Ephemeral = true,
Port = 9562,
ServiceName = "mysvc2"
};
await _client.DeregisterInstance("mysvc2", instance).ConfigureAwait(false);
return "DeregisterInstance ok";
}
// GET n/si
[HttpGet("SelectInstances")]
public async Task<string> SelectInstances()
{
var list = await _client.SelectInstances("mysvc2", true, false).ConfigureAwait(false);
var res = list.ToJsonString();
return res ?? "SelectInstances ok";
}
// GET n/gs
[HttpGet("GetServicesOfServer")]
public async Task<string> GetServicesOfServer()
{
var list = await _client.GetServicesOfServer(1, 10).ConfigureAwait(false);
var res = list.ToJsonString();
return res ?? "GetServicesOfServer";
}
// GET n/sub
[HttpGet("Subscribe")]
public async Task<string> Subscribe()
{
await _client.Subscribe("mysvc2", listener).ConfigureAwait(false);
return "Subscribe";
}
// GET n/unsub
[HttpGet("Unsubscribe")]
public async Task<string> Unsubscribe()
{
await _client.Unsubscribe("mysvc2", listener).ConfigureAwait(false);
return "UnSubscribe";
}
// NOTE: MUST keep Subscribe and Unsubscribe to use one instance of the listener!!!
// DO NOT create new instance for each opreation!!!
private static readonly CusListener listener = new ();
public class CusListener : Nacos.V2.IEventListener
{
public Task OnEvent(Nacos.V2.IEvent @event)
{
if (@event is Nacos.V2.Naming.Event.InstancesChangeEvent e)
{
System.Console.WriteLine("CusListener");
System.Console.WriteLine("ServiceName" + e.ServiceName);
System.Console.WriteLine("GroupName" + e.GroupName);
System.Console.WriteLine("Clusters" + e.Clusters);
System.Console.WriteLine("Hosts" + e.Hosts.ToJsonString());
}
return Task.CompletedTask;
}
}
}
}
官方地址:Nacos快速开始
更多信息请关注公众号: