首页 > 其他分享 >web项目平滑重启

web项目平滑重启

时间:2022-08-18 16:58:40浏览次数:86  
标签:web code 平滑 echo time prog 重启

参考:

https://blog.csdn.net/qq_36517296/article/details/123993095(gin项目平滑重启)

https://studygolang.com/articles/32123(go项目平滑重启)

什么是平滑重启

进程在不关闭其所监听端口的情况下进行重启,并且重启的整个过程保证所有请求都能被正确处理。

主要步骤:

  1. 原进程(父进程)先fork一个子进程,同时让fork出来的子进程继承父进程所监听的socket
  2. 子进程完成初始化后,开始接收socket的请求。
  3. 父进程停止接收新的请求,并将当下的请求处理完,等待连接空闲后,平滑退出。

一般有三种方案:

  1. 生产环境会通过四层(lb)->七层(gateway)->服务,那么可以通过流量调度的方式实现平滑重启
  2. k8s管理
  3. 程序自身完成平滑重启(本章介绍)

show me the code

func main(){
        // -------------------------  平滑重启  -----------------------
    g := router.Load() // 这里的g 代表 *gin.Engine
    s := &http.Server{
        Addr:        ":" + viper.GetString("gin.port"),
        Handler:     g,
        ReadTimeout: 10 * time.Second,
        //WriteTimeout: 10 * time.Second,
        //MaxHeaderBytes: 1 << 20
    }

    go func() {
        // service connections
        if err := s.ListenAndServe(); err != nil && err != http.ErrServerClosed {
            //log.Fatalf(err, "listen: %s\n", err)
            log.Fatal(err)
        }
    }()
    listenSignal(s) // two 处理优雅重启
}

func listenSignal(httpSrv *http.Server) {
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)

    select {
    case sig := <-sigs:
        log.Println("收到信号notify sigs", sig)
        zlog.F().Info("收到信号notify sigs", sig)
        ctx, cancel := context.WithTimeout(context.Background(), time.Second*2) // 2s没有处理完,则强制关闭
        defer cancel()
        err := httpSrv.Shutdown(ctx)
        if err != nil {
            log.Println(err)
            zlog.F().Error(err)
        }
        log.Println("关闭,http shutdown")
        zlog.F().Info("关闭,http shutdown")
    }
}

 

startWeb.sh

#!/bin/sh
# chkconfig: 2345 87 88
# Description: huidu-go-ulive-app service

. /etc/init.d/functions


APP_HOME=/data/yekong_api
prog=yekong_api
start_scripts_name="yekong_api"
process="./yekong_api"

function startSer() {
    chmod +x ${start_scripts_name}
    cd ${APP_HOME} && nohup ./${start_scripts_name} > output.log 2>&1 &
    if [ $? -eq 0 ];then
        action "Starting $prog Server" /bin/true
    else
        action "Starting $prog Server" /bin/false
    fi
}

function stopSer() {

    PID=$(ps aux | grep -w ${process} | grep -v grep | awk '{print $2}')
    if [ "${PID}" ];then
      time=2
      time_interval=0.5
      TIME_NUM=$(echo "${time} ${time_interval}" | awk '{print $1 / $2}')
      echo "次数 $TIME_NUM"
      kill -2 ${PID}
      i=0
      while(( $i<=$TIME_NUM ))
      do
          PID=$(ps aux | grep -w ${process} | grep -v grep | awk '{print $2}')
          if [ "$PID" ];then
              [ $i == ${TIME_NUM} ] && kill -9 $PID || sleep ${time_interval}
              echo "pid为: $PID"
          else
              echo "平滑退出,break"
              break
          fi
        let "i++"
      done
    fi

    [ $? -eq 0 ] && action "Stop $prog Server" /bin/true || action "Stop $prog Server" /bin/false
}

function status() {
    PID=$(ps aux | grep -w ${process} | grep -v grep | awk '{print $2}')
    if [ "$PID" ];then
        if kill -0 $PID > /dev/null 2> /dev/null ; then
            return 0
        else
            return 2 # program is dead but pid file exists
        fi
    else
        return 3 # program is not running
    fi
}



case "$1" in
  start)
     status
     code=$?
     if [ $code -eq 0 ]; then
         echo "$prog server is already running"
     else
         startSer
         code=$?
     fi
     exit $code
     ;;
  stop)
     stopSer
     ;;
  restart)
     stopSer
     startSer
     ;;
  status)
    status
     if [ $? -eq 0 ];then
         echo -e "$prog server \033[32mRunning\033[0m (PID:$PID)..."
     else
         echo -e "$prog server \033[31m Not running\033[0m..."
     fi
     ;;
  *)
     echo "Usage: service $prog {start|stop|restart|status}"
     exit 1
esac

exit 0

 

标签:web,code,平滑,echo,time,prog,重启
From: https://www.cnblogs.com/tkzc2013/p/16599270.html

相关文章

  • JavaWeb 开发入门
    原文:JavaWeb学习总结(一)——JavaWeb开发入门一、基本概念1.1、Web开发的相关知识Web,在英语中Web即表示网页的意思,它用于表示Internet主机上供外界访问的资源......
  • 'WebDriver' object has no attribute 'find_element_by_class_name' 解决办法
    在APP自动化测试过程中,在Pycharm中重新下载了selenium和appium-python-client后,导致已运行通过的代码运行失败,提示:'WebDriver'objecthasnoattribute'find_element_by_......
  • weblogic11g打补丁,应用出现乱码
    解决办法:1、找到域下的这个路径:autodeploy\manager\WEB-INF里的web.xml文件,先备份好,再添加以下语句:  <context-param><param-name>weblogic.httpd.inputCharset./*......
  • uniapp 解决使用web-view嵌套H5页面以后返回失效的问题
    <template><view><web-view:src="src"></web-view></view></template><script>varwv;//计划创建的webviewexportdefault{data(){return{......
  • 怎么进行Javaweb应用的快速开发
    (1)Javaweb的开发流程:前端设计:敲定业务功能模块,完成前端网页设计。数据库设计(数据库设计是难点)保证前端可以自动运行,独立化工程。数据接口如何对接:json,对象allinone!......
  • idea 中创建 web 项目(搭配 Tomcat 使用)
    下面展示如何在IDEA中创建一个web项目,并用Tomcat服务器来启动该项目。1. 创建一个web项目创建一个空项目:File→New →Project →EmptyProject →Next......
  • 大文件上传控件webupload插件
    ​这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上注......
  • javaweb Listen
    packagecom.cj.servlet;importjavax.servlet.ServletContextEvent;importjavax.servlet.ServletContextListener;importjavax.servlet.annotation.WebListener;......
  • docker --restart 重启策略
    docker--restart重启策略--restart=no,默认策略,在容器退出时不重启容器--restart=on-failure,在容器非正常退出时(退出状态非0),才会重启容器--restart=on-failure:3,在容......
  • 代码审计(Java)——WebGoat_SqlInjection
    一、SqlInjection_introduction1.这里level1-8就不说了,都是介绍+简单的sql语句,直接上level9这里可以看到,是给出了选择框的一道题,OWASP真不错,生怕你不会哈哈~......