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

一、配置管理

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

这里我都填写为publicdemo

2.C#代码配置启动

appsetting.json加上:

(nacos默认是8848端口)

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

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

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!

cs 复制代码
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.服务的注册、查询、注销

cs 复制代码
    [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.自动注册

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

cs 复制代码
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();
    }
}
相关推荐
用户0328472220708 小时前
如何搭建本地yum源(上)
运维
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
小宇宙Zz3 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈3 天前
Unix 与 Linux 异同小叙
linux·服务器·unix
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造