• asp.net core 如何在Docker停止时,代码注销Consul中的服务


    Dockerfile中使用ENTRYPOINT,而不是CMD,至于这俩命令有啥区别,百度下吧。

    ENTRYPOINT ["dotnet", "LS.Saas.BaseInfo.HttpApi.Host.dll"]

    Startup.cs中的Configure方法注入:IApplicationLifetime lifeTime,它的ApplicationStopping就可以捕获到停止状态,不管是控制台停止,还是docker停止。

    //注销服务
    lifeTime.ApplicationStopping.Register(() => {
      client.Agent.ServiceDeregister(serviceId).GetAwaiter().GetResult();
    });

    1.docker stop [容器ID],起作用

    2.docker rm -f [容器ID],是不起作用的

    完整代码:

    /// <summary>
    /// 服务注册
    /// </summary>
    public static void ConsulRegister(IHostApplicationLifetime lifeTime)
    {
        var serviceId = $"{ConsulServiceIP}_{DateTime.Now.Ticks}";
    
        //注册服务
        ConsulClient client = new ConsulClient(
            (ConsulClientConfiguration c) =>
            {
                c.Address = new Uri(Configuration["Consul:Address"]); //Consul服务中心地址
                c.Datacenter = Configuration["Consul:DataCenter"]; //指定数据中心,如果未提供,则默认为代理的数据中心。
            }
        );
        string checkUrl = Configuration["Consul:CheckUrl"];
        client.Agent.ServiceRegister(new AgentServiceRegistration()
        {
            ID = serviceId, //服务编号,不可重复
            Name = Configuration["Consul:ServiceName"], //服务名称
            Port = ConsulServicePort, //本程序的端口号
            Address = ConsulServiceIP, //本程序的IP地址
            Check = new AgentServiceCheck()
            {
                DeregisterCriticalServiceAfter = TimeSpan.FromMilliseconds(1), //服务停止后多久注销
                Interval = TimeSpan.FromSeconds(5), //服务健康检查间隔
                Timeout = TimeSpan.FromSeconds(5), //检查超时的时间
                HTTP = $"http://{ConsulServiceIP}:{ConsulServicePort}{checkUrl}" //检查的地址
            }
        });
    
        //注销服务
        lifeTime.ApplicationStopping.Register(() => {
            client.Agent.ServiceDeregister(serviceId).GetAwaiter().GetResult();
        });
    }

    设置entrypoint,这是docker下dotnetcore能收到退出信号的必要条件。

    参考网址:https://q.cnblogs.com/q/113552/

  • 相关阅读:
    gulp-px2rem-plugin 将px 转化为 rem
    jquery.lazyload.js 的 使用
    IDEA集成MyBatis Generator 插件
    远程连接数据库 出现 Client does not support authentication protocol requested by server的解决方法
    webpack 编译Es6 es7
    webpack 自动打包
    TypeError: CleanWebpackPlugin is not a constructor
    el-table 表格循环多张图片
    Android Studio 引入Lambda表达式
    去掉SrollView、GrdiView、ListView、ViewPager等滑动到边缘的光晕效果
  • 原文地址:https://www.cnblogs.com/subendong/p/14344342.html
Copyright © 2020-2023  润新知