Go語言HTTP服務生命周期

2020-10-22 MonkeyWie

在 go 語言裡啟動一個 http 服務非常簡單,只需要一行代碼http.ListenAndServe()就可以搞定,這個方法會一直阻塞著直到進程關閉,如果這個時候來了些特殊的需求比如:

  • 監聽服務啟動
  • 手動關閉服務
  • 監聽服務關閉

在 go 中應該怎麼實現呢?下面來一一舉例。

監聽服務啟動

方法一(推薦)

Listen步驟拆分出來,先監聽埠,再綁定到server上,代碼示例:

l, _ := net.Listen("tcp", ":8080")// 服務啟動成功,進行初始化doInit()// 綁定到server上http.Serve(l, nil)

方法二

通過一個協程去輪詢監聽服務啟動狀態,代碼示例:

go func() { for { if _, err := net.Dial("tcp", "127.0.0.1:8080"); err == nil { // 服務啟動成功,進行初始化 doInit() //退出協程 break } // 每隔一秒檢查一次服務是否啟動成功 time.Sleep(time.Second) }}()http.ListenAndServe(":8080", nil)

手動關閉服務

優雅關閉(推薦)

http包中並沒有暴露服務的關閉方法,通過http.ListenAndServe()方法啟動的 http 服務默認幫我們創建了一個*http.Server對象,源碼如下:

func ListenAndServe(addr string, handler Handler) error { server := &Server{Addr: addr, Handler: handler} return server.ListenAndServe()}

實際上在*http.Server中是有提供Shutdown方法的,所以我們只需要手動構造一個*http.Server對象,就可以進行優雅關閉了,代碼示例:

srv := &http.Server{Addr: ":8080"}go func(){ // 10秒之後關閉服務 time.Sleep(time.Second * 10) srv.Shutdown(context.TODO())}()// 啟動服務srv.ListenAndServe()

強制關閉

強制關閉和上面步驟是一樣的,只是調用的方法換成了srv.Close(),這會導致所有的請求立即中斷,所以需要特別注意。

監聽服務關閉

當我們手動將服務關閉之後,srv.ListenAndServe()方法就會立即返回,這裡需要注意的是該方法會返回一個error,當然這個error是一個特殊的 error http.ErrServerClosed,幫助我們區分是否為正常的服務關閉,所以需要對它特殊處理下,代碼示例:

if err := server.ListenAndServe(); err != nil { // 服務關閉,進行處理 doShutdown() if err != http.ErrServerClosed{ // 異常宕機,列印錯誤信息 log.Fatal(err) }}

參考資料

  • 本文首發於我的博客:,歡迎收藏!不定期分享JAVAGolang前端dockerk8s等乾貨知識。

相關焦點

  • 如何用 Go 快速編寫出 HTTP REST API 服務?
    在本教程中,明白如何用Go語言寫出一個HTTP REST API服務。作者 | Aurelie Vache譯者 | 槐序,責編 | 郭芮以下為譯文:學習一門新語言並不容易,但是如果有具體的例子和手把手指導教程,就很容易上手了。因此,我決定編寫一系列分步指導教程。
  • GO語言入門
    GO 命令源碼文件1)命令源碼文件定義:命令源碼文件是程序的運行入口,如果一個源碼文件聲明屬於main包,並且包含一個無參數聲明的main函數,那麼它就是命令源碼文件2)命令源碼文件接收參數的包:GO語言標準庫中有一個代碼包flag專門用於接收和解析程序參數A. flag.StringVar()flag.StringVar
  • 老王學習go語言——3.Go語言基礎 -第一個go程序
    , r *http.Request) { fmt.Fprintf(w, &34;, r.URL.Path[1:])}func main() { http.HandleFunc(&34;, defaultHandler) http.ListenAndServe(&34;, nil)}
  • 詳解服務體驗生命周期,助你提升用戶體驗
    本文講解了服務體驗生命周期的使用方法以及各個階段,幫助你更好地設計客戶體驗!一、開篇隨著服務設計意識和能力的提升,越來越多的人開始談論「服務體驗」。我們在「設計服務體驗」,我們在「交付服務體驗」,我們在「體驗服務」。但是,什麼構成了服務體驗?這個「生命周期」是怎麼回事?實際上所有的服務體驗都遵循一個相同的生命周期。
  • [Go 語言教程] Go 語言簡介
    Go 語言教程1 Go 語言介紹Go 即Golang,是Google公司2009年11月正式對外公開的一門程式語言。Go是靜態強類型語言,是區別於解析型語言的編譯型語言。解析型語言——原始碼是先翻譯為中間代碼,然後由解析器對代碼進行解釋執行。編譯型語言——原始碼編譯生成機器語言,然後由機器直接執行機器碼即可執行。
  • Go語言的魅力
    給周末無事,想充電的朋友分享一下我最近迷戀上了Go語言的理由[偷笑],起初讓我了解它,是它那幾位殿堂級的創始人,後來去年B站原始碼洩露,幾乎整站全是go語言架構,讓我映像深刻,而近年國內很多巨頭阿里,頭條,小米,360,美團,螞蟻,騰訊等的開源項目可見,go就是一門未來具有絕對魅力的語言,我很多朋友公司裡,無歷史包袱的新項目都在優先考慮golang架構。
  • IT挑戰高薪必備Go語言常識-Go WEB框架
    Go語言是一門快速成長的語言,專為構建簡單、快速且可靠的軟體而設計,尤其是用Go語言開發WEB服務端軟體,開發效率和程序運行性能都很優秀,真正做到了兼顧開發和運行效率。Go語言提供的net/http庫對於HTTP協議實現的非常好,基於此再構造框架會更容易,因此生態中出現了很多框架。
  • Go語言憑什麼進到2017年程式語言排行榜的前十
    EEE Spectrum雜誌發布了一年一度的程式語言排行榜,這也是他們發布的第四屆程式語言 Top 榜,而Go語言在2017年的程式語言排行榜中躍居第九,如下:Go自2009年面世以來,已經9年了,現在已經有很多公司開始使用Go語言開發自己的服務,甚至完全轉向Go開發。很多的大公司也在用,如Adobe,BBC,IBM,英特爾等等。
  • Go語言Echo Web框架1-簡單HelloWorld
    1.go的運行環境,如何設置,此處省略,有興趣的同學可以到go的官網或者go語言中文網,看相關的文檔配置運行環境。目前echo已經到版本4了,建議go的環境1.10以上。2.安裝echo包,使用go get方式,有興趣的同學可以使用dep或者go module:go get github.com/labstack/echo/v4下載的依賴包在GOPATH路徑下對應的文件下。對GOPATH不是很了解的同學,多看看go語言官網的文檔。
  • 當前學習哪門程式語言會有更長的職業生命周期
    「常青樹」,所以從這個角度來看,掌握C語言的程式設計師可以有更長的職業生命周期。,以便於來應對各種應用場景,所以僅僅掌握一門程式語言的程式設計師往往並不多,而且真正影響程式設計師職業生命周期的因素很多,程式語言只是其中的一個因素而已。
  • IT新人學透go語言,最新github值得關注的8個go項目
    Go 語言語法與 C 相近,但功能上有:內存安全,GC(垃圾回收),結構形態及 CSP-style 並發計算。 Go被稱為兼顧了C語言的運算速度和python的易讀性,已經成為業內廣泛使用的語言之一。在線體驗4. go-fundamental-programming地址: http s:// github.com/unknwon/go-fundamental-programmingstar: 7.3kfork: 1.9k
  • Go語言愛好者周刊:第 58 期—關於 context
    具體來說,Istio 是一個開源服務網格平臺,它確保微服務在處理故障時以指定的方式相互連接。這是小版本升級。3、Kubernetes v1.19.0 正式發布[4]終於,我們迎來了 Kubernetes 1.19 版本,這是 2020 年的第二個版本,也是迄今為止最長的發布周期,總共持續 20 周。它由 33 項增強功能組成。
  • 鬥魚開源 Go 微服務框架 Jupiter
    兩者相得益彰,幫助開發者快速落地、並具備服務治理能力的微服務架構。我們致力於將 Go 微服務框架標準化,統一錯誤碼、日誌、監控、註冊、流控的 Schema。做到微服務的各個模塊可觀測、可治理,管理微服務研發側的全套生命周期。以下是 Jupiter 的架構圖。
  • Python見效快,Go周期長,學那個更有錢景?語言生態的圈地運動
    16年後,2007年穀歌三位計算機語言學家開始開發go語言。一個是29歲的python一個是13歲的go,在當今網際網路和基於計算機集群的軟體和虛擬產品領域稱雄世界,那麼,跟誰混才更有「錢」景呢?今天我們聊一聊,go和python的發展前景問題。我們現在學習python,會不會有些過時?
  • Go-INI - 超讚的Go語言INI文件操作庫
    然而,日漸受到關注的 Go 語言,其官方庫並沒有對 INI 文件操作的庫,而進行 INI 文件的解析也並不是幾行就能完成的簡單工作。Go-INI,就為 Go 語言添加了對 INI 文件進行讀取、解析和寫入等操作,使得 Go 項目也能充分利用 INI 文件的便利性。
  • 老王學習go語言——2.1 Go Kit和Go Micro
    transport,是進行服務轉換的,可以在單一服務中同時支持多種訪問方式比如http,aRPC,transport也是為了在業務邏輯和響應方式上進行解耦和統一處理。而EndPoint很像MVC中的Controller,在這裡調用實際的Service,Service就很好理解了。
  • 背靠Google 的 Go 語言,就不會失敗?
    谷歌員工無法理解一種出色的語言,但我們希望用它們來構建優秀的軟體。因此,我們提供的語言必須易於理解和使用。——谷歌最著名的軟體工程師之一Rob Pike作者 | Alexei Matyushkin譯者 | 安翔責編 | 屠敏出品 | CSDN我曾多次嘗試使用 Go 語言。
  • Servlet生命周期
    1、《Servlet簡單實現開發部署過程》2、《Servlet部署描述符》3、《通過了解Servlet和Http之間的關係,了解web中http通信使用》4、《通過了解Servlet和Http之間的關係,了解web中http通信使用(二)》
  • Go 項目實戰:Golang HTTP 驗證碼
    Go的HTTP驗證碼思路Go 語言的 HTTP 伺服器默認不支持 Session,因此驗證碼值需要換個思路存儲,以下是不使用 Session 的邏輯將該值寫入圖片並將圖片返回給客戶端客戶端提交驗證碼 ID(第1步獲得)和驗證碼值給伺服器驗證伺服器獲取驗證碼 ID,從內存或緩存中取出驗證碼值與客戶端提交的驗證碼值比對示例安裝驗證碼依賴go
  • 60分鐘快速了解Go語言
    import ("fmt" // Go語言標準庫中的包"io/ioutil" // 包含一些輸入輸出函數m "math" // 數學標準庫,在此文件中別名為m"net/http" /