zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    在独立的文件里定义WPF资源
    Irrlicht 3D Engine 笔记系列 之 教程6- 2D Graphics
    Java实现二叉树的创建、递归/非递归遍历
    NDK在windows下的开发环境搭建及开发过程
    硬件路由转发原理浅析
    ubuntu下vim中内容拷贝到浏览器
    python调用Java代码,完毕JBPM工作流application
    C++组合通信
    linux杂谈(十八):DNSserver的配置(一)
    Codeforces 550D. Regular Bridge 构造
  • 原文地址:https://www.cnblogs.com/subendong/p/14344342.html
Copyright © 2011-2022 走看看