在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();
    }
}
相关推荐
Brandon汐3 分钟前
Linux中的系统延时任务和定时任务与时间同步服务和构建时间同步服务器
linux·运维
又逢乱世4 分钟前
Ubuntu 安装 MySQL8
linux·运维·mysql·ubuntu
Yang三少喜欢撸铁16 分钟前
通过Docker部署Prometheus + Grafana搭建监控平台【超详细版】
linux·服务器·docker·容器·grafana·prometheus
一道秘制的小菜30 分钟前
Linux第20节 --- inode和文件系统
linux·运维·服务器·c++·文件
BIN-XYB40 分钟前
Ubuntu搭建Conda+Python开发环境
linux·运维·ubuntu
哲讯智能科技1 小时前
无锡哲讯科技:引领企业数字化转型的SAP实施专家
大数据·运维·人工智能
H1346948901 小时前
网站备份解析,网站备份的操作步骤有哪些
服务器·数据库
herinspace10 小时前
管家婆易指开单如何设置零售开单
运维·服务器·数据库·软件工程·sass·零售
小镇敲码人10 小时前
【网络层】之IP协议
服务器·网络·tcp/ip
闻道且行之10 小时前
Paddle Serving|部署一个自己的OCR识别服务器
服务器·ocr·paddle