讀 "優雅關閉的 Go Web 伺服器"
[讀 "優雅關閉的 Go Web 伺服器" ](https://github.com/stayfoo/stayfoo-hub/blob/master/docs/golang/read-article/1、read-優雅關閉的GoWeb伺服器.md)
GitHub 倉庫:https://github.com/stayfoo/stayfoo-hub
文章《優雅的關閉 `Go Web` 伺服器》( [Go語言中文網](https://mp.weixin.qq.com/s/rA_oh472ZhfcAsAkWyyXFA) )寫到:可以通過開啟一個單獨的 `goroutine` 攔截關閉訊號,這樣,當伺服器真正關閉之前,可以做一些任務,做完任務再發出執行完畢的關閉號。
一些任務比如:清理某些資源;完成資料庫事務;一些其他長時間的操作;退出服務的那一刻,剛好收到一個響應,為了保證所有請求完成,就可以在這裡,在最大超時時間內去處理這個響應;dump程式當前狀態;記錄日誌的動作。
啟動應用,`Ctrl + C` 中斷程式,中斷訊號被攔截,do something.....
```bash
go run main.go -listen-addr=5001
http: 2019/08/31 11:34:30 Server is ready to handle requests at :5001
^Chttp: 2019/08/31 11:34:32 Server is shutting down...
do something start ..... 2019-08-31 11:34:32.594668 +0800 CST m=+2.337451148
do something end ..... 2019-08-31 11:34:37.598248 +0800 CST m=+7.340881516
http: 2019/08/31 11:34:37 Server stopped
```
對文中程式碼做了改造,程式碼如下:
```go
var listenAddr string
func init() {
//接收埠號,預設埠號:5000
flag.StringVar(&listenAddr, "listen-addr", ":5000", "server listen address")
}
func main() {
flag.Parse() //外部引數解析
listenAddr = fmt.Sprintf(":%s",listenAddr)
logger := log.New(os.Stdout, "http: ", log.LstdFlags)
//建立 server:
server := newWebServer(logger)
done := make(chan struct{}, 1)
quit := make(chan os.Signal, 1)
//os.Interrupt: syscall.SIGINT
signal.Notify(quit, os.Interrupt)
//啟動另一個 goroutine ,監聽將要關閉訊號:
go shutdown(server, logger, quit, done)
//啟動 server:
logger.Println("Server is ready to handle requests at",listenAddr)
err := server.ListenAndServe()
if err != nil && err != http.ErrServerClosed {
logger.Fatalf("Could not listen on %s: %v \n", listenAddr, err)
}
//等待已經關閉的訊號:
相關文章
- 讀 "優雅關閉的 Go Web 伺服器"GoWeb伺服器
- 如何優雅的關閉Go Channel「譯」Go
- Tomcat 優雅關閉之路Tomcat
- 優雅關閉執行緒池的方案執行緒
- 優雅關閉maven-default-http-blocker?MavenHTTPBloC
- 如何優雅得關閉協程呢
- Java優雅關閉執行緒池Java執行緒
- golang程式優雅關閉與重啟Golang
- 如何優雅的關閉Java執行緒池Java執行緒
- Go優雅重啟Web server示例-講解版GoWebServer
- 【剖析 | SOFARPC 框架】系列之 SOFARPC 優雅關閉剖析RPC框架
- 如何優雅的搞垮伺服器,再優雅的救活伺服器
- 【Go】優雅的讀取 http 請求或響應的資料GoHTTP
- 【Go】優雅的讀取http請求或響應的資料GoHTTP
- SpringBoot如何優雅關閉(SpringBoot2.3&Spring Boot2.2)Spring Boot
- Go的優雅終止姿勢Go
- 【Go】優雅的讀取http請求或響應的資料-續GoHTTP
- 【Go】優雅的讀取 http 請求或響應的資料-續GoHTTP
- 我們們從頭到尾說一次優雅關閉
- 優雅的使用 Brew 切換 Go 版本Go
- NLP新秀 : BERT的優雅解讀
- 利用 trap 在 docker 容器優雅關閉前執行環境清理Docker
- [譯]Go如何優雅的處理異常Go
- Go程式設計技巧–Goroutine的優雅控制Go程式設計
- C#如何優雅的多表讀取C#
- Spring Boot使用@Async實現非同步呼叫:ThreadPoolTaskScheduler執行緒池的優雅關閉Spring Boot非同步thread執行緒
- 如何優雅引入神策Web JS SDKWebJS
- Go 關閉chanel & chanel的range迴圈Go
- go 如何優雅的判斷變數是否為 nilGo變數
- 超越 Nginx!號稱下一代 Web 伺服器,用起來夠優雅!NginxWeb伺服器
- Linux伺服器---關閉selinuxLinux伺服器
- SOFAJRaft原始碼閱讀-ShutdownHook如何優雅的停機Raft原始碼Hook
- 【Python標準庫:fileinput】優雅的讀取檔案Python
- go : channel , queue , 程式管理 , 關閉channel ?Go
- [ gev ] Go 語言優雅處理 TCP “粘包”GoTCP
- 使用go優雅地撰寫單元測試Go
- 如何診斷伺服器關閉的原因伺服器
- 優雅的PromiseKitPromise