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

        /// <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快速开始

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

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要实现Nacos的热部署,可以通过在Feign客户端的配置类上添加`@RefreshScope`注解来实现。这样当Nacos配置发生变化时,Feign客户端会自动刷新配置并重新加载。在热部署过程,可以通过在Feign客户端的配置添加日志打印语句来查看相关信息。 一个示例配置类如下所示: ``` import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @RefreshScope public class FeignClientConfig { @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } // 其他配置... } ``` 在这个示例,我们通过`@RefreshScope`注解来实现配置的热部署。同时,通过`Logger.Level`来设置Feign客户端的日志级别为FULL,这样可以打印出详细的请求和响应日志信息。 当Nacos配置发生变化时,Feign客户端会自动刷新配置,并根据新的配置信息重新加载。在控制台或日志文件,您将能够看到Feign客户端打印出的详细的请求和响应日志信息,以便于调试和排查问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Nacos配置、Feign、Gateway](https://blog.csdn.net/qq_46002941/article/details/123674294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SpringCloud基础2——nacos配置、Feign、Gateway](https://blog.csdn.net/qq_40991313/article/details/126772669)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值