go實踐十一 熱重啟服務

2021-09-25 08:58:06 字數 3049 閱讀 3208

熱重啟(zero downtime),指新老程序無縫切換,在替換過程中可保持對 client 的服務。

)/************************** 測試熱重啟 ***************************/

//設定監聽的物件(新建或已存在的socket描述符)

if *graceful else

if err != nil

go func()()

//監聽訊號

handlesignal()

log.println("signal end")

}//處理訊號

func handlesignal()

server.shutdown(ctx)

log.println("graceful reload")

return

} }}//熱重啟

func reload() error

//獲取socket描述符

f,err := tl.file()

if err != nil

//設定傳遞給子程序的引數(包含 socket描述符)

args := string

cmd := exec.command(os.args[0],args...)

cmd.stdout = os.stdout //標準輸出

cmd.stderr = os.stderr //錯誤輸出

cmd.extrafiles = *os.file //檔案描述符

//新建並執行子程序

return cmd.start()}/*

我們在父程序執行 cmd.extrafiles = *os.file 來傳遞 socket 描述符給子程序,子程序通過執行 f := os.newfile(3, "") 來獲取該描述符。值得注意的是,子程序的 0 、1 和 2 分別預留給標準輸入、標準輸出和錯誤輸出,所以父程序傳遞的 socket 描述符在子程序的順序是從 3 開始。

*/

[root@localhost hotupdate]# go mod init hotupdate

go: creating new go.mod: module hotupdate

[root@localhost hotupdate]# go build

[root@localhost hotupdate]# ll

total 7440

-rw-------. 1 root root 26 jul 18 10:32 go.mod

-rwxr-xr-x. 1 root root 7606372 jul 18 10:34 hotupdate

-rw-r--r--. 1 root root 3108 jul 18 10:34 main.go

[root@localhost hotupdate]# ./hotupdate -message echo

2019/07/18 10:35:49 listening on a new file descriptor

[root@localhost ~]# curl 

echo

[root@localhost hotupdate]# netstat -tunlp | grep 3000

tcp6 0 0 :::3000 :::* listen 2198/./hotupdate

[root@localhost hotupdate]# kill -usr2 2198

2019/07/18 10:54:01 signal receive: user defined signal 2 

2019/07/18 10:54:01 reload

2019/07/18 10:54:01 graceful reload

2019/07/18 10:54:01 signal end

[root@localhost hotupdate]# netstat -tunlp | grep 3000

tcp6 0 0 :::3000 :::* listen 2639/./hotupdate

[root@localhost hotupdate]# kill -int 2639

2019/07/18 11:11:16 signal receive: interrupt 

2019/07/18 11:11:16 shutdown

2019/07/18 11:11:16 graceful shutdown

2019/07/18 11:11:16 signal end

參考:

參考:graceful:

systemd實踐 依據情況自動重啟服務

systemd服務異常自動重啟很好用,但有的時候希望某些服務只在特定情況下進行重啟,其他時候不要自動重啟 比如oom,需要人工介入 本文拋磚引玉,旨在能夠讓讀者對systemd的重啟機制有一定了解。unit description mytest service type execstart root...

Systemd實踐 依據情況自動重啟服務

systemd服務異常自動重啟很好用,但有的時候希望某些服務只在特定情況下進行重啟,其他時候不要自動重啟 比如oom,需要人工介入 本文拋磚引玉,旨在能夠讓讀者對systemd的重啟機制有一定了解。unit description mytest service type execstart root...

go服務docker實踐 縮小映象占用

go服務docker實踐 縮小映象占用 1 說在前面 本文環境建立在已安裝docker服務基礎上,請先準備好docker環境 2 docker映象要求 我們首先思考一下雲原生對應用執行時的不同需求 啟動速度更快 對於傳統單體應用,啟動速度與執行效率相比不是乙個關鍵的指標。原因是,這些應用重啟和發布頻...