国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

香港云服务器
服務器之家 - 腳本之家 - Golang - golang的httpserver優雅重啟方法詳解

golang的httpserver優雅重啟方法詳解

2020-05-14 10:15helight Golang

這篇文章主要給大家介紹了關于golang的httpserver優雅重啟的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。

前言

去年在做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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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的過程我們來看看基本過程:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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,但是多了對各種鏈接狀態的維護和處理,這部分后面在分析。

總結

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

原文鏈接:http://helight.info/2018-01-24/golang的httpserver優雅重啟/

延伸 · 閱讀

精彩推薦
  • GolangGolang中Bit數組的實現方式

    Golang中Bit數組的實現方式

    這篇文章主要介紹了Golang中Bit數組的實現方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨尊11682021-06-09
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • Golanggolang json.Marshal 特殊html字符被轉義的解決方法

    golang json.Marshal 特殊html字符被轉義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
  • Golanggolang的httpserver優雅重啟方法詳解

    golang的httpserver優雅重啟方法詳解

    這篇文章主要給大家介紹了關于golang的httpserver優雅重啟的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    helight2992020-05-14
  • Golanggo日志系統logrus顯示文件和行號的操作

    go日志系統logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • Golanggolang如何使用struct的tag屬性的詳細介紹

    golang如何使用struct的tag屬性的詳細介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細介紹,從例子說起,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看...

    Go語言中文網11352020-05-21
  • GolangGolang通脈之數據類型詳情

    Golang通脈之數據類型詳情

    這篇文章主要介紹了Golang通脈之數據類型,在編程語言中標識符就是定義的具有某種意義的詞,比如變量名、常量名、函數名等等,Go語言中標識符允許由...

    4272021-11-24
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
369
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: yellow在线视频免费观看 | 欧美精品一区二区三区四区五区 | 啪啪导航| 91精品国产一区二区三区免费 | 日本不卡一区二区三区在线观看 | 国产黄色免费 | 免费观看全黄做爰大片国产 | 网友自拍第一页 | 国产一级视频在线观看 | 国内精品久久久久久久97牛牛 | 日韩一区二区不卡 | 国产一区二区资源 | 国产露脸系列magnet | 亚洲午夜视频 | 久久国产精品视频 | av免费在线观看网站 | 澳门黄色网 | 国产欧美综合一区二区三区 | 欧美日韩成人一区二区 | 免费色在线 | 国产精品高潮呻吟久久av野狼 | 精品视频网站 | 欧美一区二区免费在线观看 | 激情伊人 | 久久亚洲精品中文字幕 | 欧美专区在线 | 日韩美女毛片 | 精品亚洲永久免费精品 | 在线观看中文字幕 | 欧美精品在线一区二区三区 | 亚洲一区二区三区四区的 | 天天澡天天狠天天天做 | 久久影视精品 | 成年人免费在线播放视频 | 成人福利网 | 欧美激情二区 | 日本一区二区三区在线视频 | 国产精品区二区三区日本 | 免费一级毛片 | 日韩欧美一区二区三区免费观看 | 99精品欧美一区二区三区 |