栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

        /// 
        /// 从nacos中获取服务并选一个调用
        /// 
        /// 
        [HttpGet("test")]
        public async Task 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 { "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 { "baseApi" };

        // swich to use http or rpc
        x.ConfigUseRpc = false;
    });

        2.1.2添加配置管理控制器

using Microsoft.AspNetCore.Mvc;
using Nacos.V2;

namespace UpService
{

    /// 
    /// 操作配置信息
    /// 
    [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 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 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 Listen(string dataId = "default-dev.yaml")
        {
            await _svc.AddListener(dataId, "DEFAULT_GROUP", _configListen).ConfigureAwait(false);
            return "ok";
        }

        [HttpGet("unlistener")]
        public async Task 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 { "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
{

    /// 
    /// 手动操作服务实例-增删监听
    /// 
    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 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 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 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 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 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 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 Subscribe()
        {
            await _client.Subscribe("mysvc2", listener).ConfigureAwait(false);
            return "Subscribe";
        }

        // GET n/unsub
        [HttpGet("Unsubscribe")]
        public async Task 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快速开始

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/703653.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号