亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

golang的httpserver優雅重啟方法詳解

2020-04-01 18:58:03
字體:
來源:轉載
供稿:網友

前言

去年在做golang/279667.html">golang/300445.html">golangserver的時候,內部比較頭疼的就是在線服務發布的時候,大量用戶的請求在發布時候會被重連,在那時候也想了n多的方法,最后還是落在一個github上的項目,facebook的一個golang項目grace,那時候簡單研究測試了一下可以就直接在內部使用了起來,這段時間突然想起來,又想仔細研究一下這個項目了。

從原理上來說是這樣一個過程:

    1)發布新的bin文件去覆蓋老的bin文件

    2)發送一個信號量,告訴正在運行的進程,進行重啟

    3)正在運行的進程收到信號后,會以子進程的方式啟動新的bin文件

    4)新進程接受新請求,并處理

    5)老進程不再接受請求,但是要等正在處理的請求處理完成,所有在處理的請求處理完之后,便自動退出

    6)新進程在老進程退出之后,由init進程收養,但是會繼續服務。

所以一步一步來看,關鍵是從第2步開始之后怎么做,所以我們先來看看第2步的實現,這個應該說很簡單,發送信號量到一個進程,使用kill命令即可,在facebook這個項目中發送的信號量有3個:SIGINT,SIGTERM,SIGUSR2,前面兩個信號收到后程序會直接退出,后面一個信號SIGUSR2才會執行所謂的優雅重啟。

第3步,正在運行的進程收到SIGUSR2信號后,會以子進程的方式啟動新的bin文件。先直接上代碼看:https://github.com/facebookgo/grace/blob/master/gracehttp/http.go

func (a *app) signalHandler(wg *sync.WaitGroup) { ch := make(chan os.Signal, 10) signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM, syscall.SIGUSR2) for {  sig := <-ch  switch sig {  case syscall.SIGINT, syscall.SIGTERM:    // this ensures a subsequent INT/TERM will trigger standard go behaviour of   // terminating. 執行標準的go終止行為,程序就結束了   signal.Stop(ch)   a.term(wg)   return  case syscall.SIGUSR2: // 這里開始執行優雅重啟   err := a.preStartProcess()    // 這個函數在源代碼中沒有具體實現功能,只是預留了一個鉤子函數,用戶可以注冊自己的函數,可以在重啟之前做些自定義的事情。一般情況下也沒有什么可以做的,除非有些特殊的服務環境或是狀態保存之類的,至少目前,我們的server還沒有遇到   if err != nil {    a.errors <- err   }   // we only return here if there's an error, otherwise the new process   // will send us a TERM when it's ready to trigger the actual shutdown.   if _, err := a.net.StartProcess(); err != nil { // 這里開始正式所謂的優雅重啟       a.errors <- err   }  } }}

a.net.StartProcess的過程我們來看看基本過程:

func (n *Net) StartProcess() (int, error) { listeners, err := n.activeListeners() // 獲取目前在監聽的端口,這塊也是重點,下面重點介紹 if err != nil {  return 0, err }  // Extract the fds from the listeners. 從監聽端口中把文件描述符取出來 files := make([]*os.File, len(listeners)) for i, l := range listeners {  files[i], err = l.(filer).File()  if err != nil {   return 0, err  }  defer files[i].Close() }  // Use the original binary location. This works with symlinks such that if // the file it points to has been changed we will use the updated symlink. // 獲取可執行bin文件的路勁,也可以是鏈接路勁,會使用最新的鏈接路徑作為啟動文件路勁的 argv0, err := exec.LookPath(os.Args[0]) if err != nil {  return 0, err }  // Pass on the environment and replace the old count key with the new one. // 獲取 LISTEN_FDS 換進變量值  var env []string for _, v := range os.Environ() {  if !strings.HasPrefix(v, envCountKeyPrefix) {   env = append(env, v)  } } env = append(env, fmt.Sprintf("%s%d", envCountKeyPrefix, len(listeners)))  allFiles := append([]*os.File{os.Stdin, os.Stdout, os.Stderr}, files...) // 這里調用一個golang底層的進程啟動函數,來指定,上面獲取的參數來啟動進程 process, err := os.StartProcess(argv0, os.Args, &os.ProcAttr{  Dir: originalWD,  Env: env,  Files: allFiles, }) if err != nil {  return 0, err } // 返回新進程id。 return process.Pid, nil }

以上是啟動新進程,并且接管監聽端口的過程, 一般情況下端口是不可以重復監聽的,所以這里就要需要使用比較特別的辦法,從上面的代碼來看就是讀取監聽端口的文件描述符,并且把監聽端口的文件描述符傳遞給子進程,子進程里從這個文件描述符實現對端口的監聽

另外還有一個比較特別的地方就是老的接口怎么關閉的問題,關閉必須要把已經收到的請求處理完成之后再關閉。為此facebook的同學另外開了一個項目httpdown,繼承了原始的httpserver,但是多了對各種鏈接狀態的維護和處理,這部分后面在分析。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
神马久久桃色视频| 欧美成人合集magnet| 欧美精品做受xxx性少妇| 成人网在线免费看| 97国产精品视频| 国产视频精品免费播放| 91精品久久久久久久久久| 国产视频精品自拍| 国产精品ⅴa在线观看h| 日韩av中文在线| 日本老师69xxx| 欧美大荫蒂xxx| 麻豆国产va免费精品高清在线| 亚洲人成电影网站色…| 欧美理论电影在线播放| 色综合视频一区中文字幕| 欧美日韩亚洲成人| 亚洲片在线观看| 91免费国产网站| 2019日本中文字幕| 日韩欧美亚洲国产一区| 国产精品电影久久久久电影网| 久久精品夜夜夜夜夜久久| 97在线观看免费| 热草久综合在线| 麻豆国产精品va在线观看不卡| 中文字幕日韩欧美精品在线观看| 欧美最顶级丰满的aⅴ艳星| 亚洲欧洲一区二区三区在线观看| 亚洲欧美激情精品一区二区| 成人免费观看a| 日韩精品免费一线在线观看| 欧美在线观看视频| 国产精品久久久久久久久粉嫩av| 欧美精品激情在线| 成人国产精品免费视频| www.午夜精品| 欧美日韩国产麻豆| 青青久久aⅴ北条麻妃| 欧美在线观看一区二区三区| 97成人精品视频在线观看| 国产热re99久久6国产精品| 91中文字幕在线观看| 国产成人精品一区二区三区| 97在线观看视频国产| 欧美高清无遮挡| 亚洲欧美日韩中文在线| 91精品在线播放| 91精品国产精品| 欧美激情一区二区三区在线视频观看| 欧美夫妻性生活视频| 国产69精品久久久久99| 国产精品男人的天堂| 欧洲成人在线观看| 国产精品午夜国产小视频| 亚洲免费成人av电影| 国产欧美日韩专区发布| 日韩亚洲在线观看| 成人av在线天堂| 久久精品免费电影| 欧美超级乱淫片喷水| 欧美大肥婆大肥bbbbb| 亚洲国产精品悠悠久久琪琪| 久久久亚洲国产| 色久欧美在线视频观看| 日本高清久久天堂| 亚洲小视频在线| 最近更新的2019中文字幕| 久久久av亚洲男天堂| 中文字幕av一区中文字幕天堂| 精品国产乱码久久久久酒店| 国产日韩视频在线观看| 日本道色综合久久影院| 精品亚洲夜色av98在线观看| 亚洲欧洲一区二区三区在线观看| 欧美激情一级欧美精品| 日韩在线免费高清视频| 久久久久久中文| 夜夜嗨av一区二区三区免费区| 亚洲香蕉成人av网站在线观看| 国产精品久久久久久久久久久新郎| 91社影院在线观看| 精品性高朝久久久久久久| 91久久国产精品91久久性色| 韩国欧美亚洲国产| 日韩亚洲精品电影| 日韩极品精品视频免费观看| 成人a视频在线观看| 91精品国产综合久久香蕉最新版| 久久国产加勒比精品无码| 一区二区亚洲欧洲国产日韩| 欧美日韩综合视频网址| 国产日韩在线一区| 精品国产精品三级精品av网址| 国产精品入口日韩视频大尺度| 啪一啪鲁一鲁2019在线视频| 日韩欧美在线第一页| 亚洲精品国偷自产在线99热| 18一19gay欧美视频网站| 亚洲美女免费精品视频在线观看| 国产精品亚洲欧美导航| 亚洲精品短视频| 精品亚洲夜色av98在线观看| 色哟哟网站入口亚洲精品| 国产精品视频男人的天堂| 亚洲大胆美女视频| 日韩第一页在线| 黄网站色欧美视频| 992tv成人免费影院| 欧美第一淫aaasss性| 国产精品爽黄69| 亚洲欧美另类自拍| 亚洲精品国产精品国自产观看浪潮| 欧美视频在线视频| 亚洲精品福利在线观看| 91精品国产91久久| 亚洲天堂网站在线观看视频| 色综合久久久久久中文网| 成人伊人精品色xxxx视频| 久久这里只有精品99| 黄色精品在线看| 青青草99啪国产免费| 久久91精品国产91久久久| 欧美激情区在线播放| 欧美精品成人在线| 色偷偷9999www| 久久精品亚洲国产| 欧美另类69精品久久久久9999| 国色天香2019中文字幕在线观看| 国产精品高潮呻吟久久av野狼| 亚洲女人天堂成人av在线| 亚洲乱码国产乱码精品精天堂| 国产精品一区二区女厕厕| 欧美床上激情在线观看| 日韩一级黄色av| 国产精品中文字幕在线| 一区二区三区精品99久久| 一区二区三区 在线观看视| 国内精久久久久久久久久人| 1769国内精品视频在线播放| 韩国欧美亚洲国产| 97视频国产在线| 国产在线一区二区三区| 国产精品主播视频| 欧美成人合集magnet| 92看片淫黄大片欧美看国产片| 精品毛片网大全| 亚洲成年网站在线观看| 亚洲精品小视频在线观看| 久久躁日日躁aaaaxxxx| 精品女厕一区二区三区| 欧美成人精品激情在线观看| 亚洲国产精品yw在线观看| 亚洲精品www久久久久久广东| 国产精品视频26uuu| 久久天天躁狠狠躁夜夜躁2014| 美女视频久久黄| 欧美日韩国产综合新一区| 日本三级韩国三级久久| 不用播放器成人网| 国产亚洲欧美aaaa| 成人情趣片在线观看免费| 日韩av在线网站| 中文字幕日韩欧美在线|