在C# WebApi 中使用 Nacos02: 配置管理、服务管理实战

一、配置管理

1.添加一个新的命名空间

这里我都填写为publicdemo

2.C#代码配置启动

appsetting.json加上:

(nacos默认是8848端口)

  "NacosConfig": {
   "ServerAddresses": [ "http://localhost:8848" ], // Nacos 服务器地址
    "Namespace": "publicdemo" // 命名空间
  }

startup.cs加上(方式一和方式二任选):

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    // 加载 Nacos 配置,启用 Nacos 服务发现
    //方式一: 需要先在appsetting.json中配置好
    services.AddNacosV2Config(Configuration, null, "NacosConfig");
    services.AddNacosV2Naming(Configuration, null, "NacosConfig");

    //方式二:直接将配置写在这里
    //services.AddNacosV2Config(x =>
    //{
    //    x.ServerAddresses = new System.Collections.Generic.List<string> { "http://localhost:8848/" };
    //    x.EndPoint = "";
    //    x.Namespace = "publicdemo";
    //});

    //services.AddNacosV2Naming(x =>
    //{
    //    x.ServerAddresses = new System.Collections.Generic.List<string> { "http://localhost:8848/" };
    //    x.EndPoint = "";
    //    x.Namespace = "publicdemo";
    //});
}

3.C#WebApi接口实现配置增加/查询/删除

这里设置我们的dataId、group、value!

namespace WebApplication1.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class Demo
    {
        private readonly INacosConfigService _ns;
        public Demo(INacosConfigService ns)
        {
            _ns = ns;
        }


        [HttpPost]
        [Route(nameof(PublishConfig))]
        public  async Task<string> PublishConfig(INacosConfigService svc)
        {
            var dataId = "demo-dateid";
            var group = "demo-group";
            var val = "test-value-" + DateTimeOffset.Now.ToString();

            await Task.Delay(500);
            var flag = await svc.PublishConfig(dataId, group, val);
            return $"发布配置结果,{flag}";
        }

        [HttpPost]
        [Route(nameof(GetConfig))]
        public  async Task<string> GetConfig(INacosConfigService svc)
        {
            var dataId = "demo-dateid";
            var group = "demo-group";

            await Task.Delay(500);
            var config = await svc.GetConfig(dataId, group, 5000L);
            return $"获取配置结果,{config}";
        }

        [HttpPost]
        [Route(nameof(RemoveConfig))]
        public  async Task<string> RemoveConfig(INacosConfigService svc)
        {
            var dataId = "demo-dateid";
            var group = "demo-group";

            await Task.Delay(500);
            var flag = await svc.RemoveConfig(dataId, group);
            return $"删除配置结果,{flag}";
        }

        /// <summary>
        /// 测试
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [Route(nameof(GetInfoListAsync))]
        public async Task GetInfoListAsync()
        {
            await PublishConfig(_ns);
            await GetConfig(_ns);
            await RemoveConfig(_ns);
        }
    }
}

4.结果检验

选择正确的命名空间 

找到我们的DataId,点击详情 

 5.操作总结

若需要还原为旧的配置,可在【历史版本】-【回滚】中操作 

6.补充说明

1.用WebAPI增删改后,不重启情况下,可以利用WebAPI或UI界面查到最新数据
2.用UI界面增删改后,不重启情况下,可以利用WebAPI或UI界面查到最新数据

二、服务管理

1.服务的注册、查询、注销

    [ApiController]
    [Route("[controller]")]
    public class Demo
    {
        private readonly INacosConfigService _ns;
        public Demo(INacosConfigService ns)
        {
            _ns = ns;
        }


        [HttpPost]
        [Route(nameof(RegisterInstance))]
        public async Task<string> 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("demo-svc1", "DEFAULT_GROUP", instace);
            return $"注册实例成功";
        }

        [HttpPost]
        [Route(nameof(GetAllInstances))]
        public async Task<string> GetAllInstances(INacosNamingService svc)
        {
            await Task.Delay(500);

            // 获取全部实例有很多重载,选适合自己的即可。最后一个参数表明要不要订阅这个服务
            // SelectInstances, SelectOneHealthyInstance 是另外的方法可以获取服务信息。
            var list = await svc.GetAllInstances("demo-svc1", "DEFAULT_GROUP", false);
            return $"获取实例成功,{Newtonsoft.Json.JsonConvert.SerializeObject(list)}";
        }

        [HttpPost]
        [Route(nameof(DeregisterInstance))]
        public async Task<string> DeregisterInstance(INacosNamingService svc)
        {
            await Task.Delay(500);

            // 注销实例有很多重载,选适合自己的即可。
            await svc.DeregisterInstance("demo-svc1", "DEFAULT_GROUP", "127.0.0.1", 9999);
            return $"注销实例成功";
        }
    }

2.UI查询结果

3.功能效果

        如果 WebAPI 宕机了,Nacos 会根据健康检查机制检测到该服务实例不可用,并将其从注册列表中移除。

4.自动注册

        自动注册避免每次启动都需人工调用接口,提升服务管理效率,保证高可用性与灵活扩展,降低运维成本。

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        services.AddNacosV2Config(Configuration, null, "NacosConfig");
        services.AddNacosV2Naming(Configuration, null, "NacosConfig");
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        NacosAutoRegister(app);//增加这个方法

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }

    // 在应用启动时自动注册实例
    private void NacosAutoRegister(IApplicationBuilder app)
    {
        var svc = app.ApplicationServices.GetRequiredService<INacosNamingService>();//获取服务

        var port = 9999;
        var instance = new 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 Dictionary<string, string>
            {
                { "m1", "v1" },
                { "m2", "v2" }
            }
        };

        // 服务调用,自动注册实例
        svc.RegisterInstance("demo-svc1", "DEFAULT_GROUP", instance).Wait();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值