Golang使用http協(xié)議實現(xiàn)心跳檢測程序過程詳解
本文介紹如何使用Golang實現(xiàn)心跳程序。
需求說明
實現(xiàn)心跳程序,其他應用可以簡單集成??蛻舳顺绦蛲ㄟ^HTTP協(xié)議進行檢測,返回當前程序狀態(tài)、版本ID以及已運行時間。
程序?qū)崿F(xiàn)
package main import ( "encoding/json" "github.com/hako/durafmt" "log" "net/http" "time" ) const NotAvailableMessage = "Not available" var CommitHash string var StartTime time.Time type HeartbeatMessage struct { Status string `json:"status"` Build string `json:"build"` Uptime string `json:"uptime"` } func init() { StartTime = time.Now() } func handler(rw http.ResponseWriter, r *http.Request) { hash := CommitHash if hash == "" { hash = NotAvailableMessage } df, _ := durafmt.ParseString(time.Since(StartTime).String()) uptime := df.String() err := json.NewEncoder(rw).Encode(HeartbeatMessage{"running", hash, uptime}) if err != nil { log.Fatalf("Failed to write heartbeat message. Reason: %s", err.Error()) } } func RunHeartbeatService(address string) { http.HandleFunc("/heartbeat", handler) log.Println(http.ListenAndServe(address, nil)) }
首先定義了兩個變量,CommitHash、StartTime,然后定義結(jié)構(gòu)體HeartbeatMessage封裝返回值。
接著在init方法中給StartTime變量賦初始值。下面時處理請求handler方法:
func handler(rw http.ResponseWriter, r *http.Request) { hash := CommitHash if hash == "" { hash = NotAvailableMessage } df, _ := durafmt.ParseString(time.Since(StartTime).String()) uptime := df.String() err := json.NewEncoder(rw).Encode(HeartbeatMessage{"running", hash, uptime}) if err != nil { log.Fatalf("Failed to write heartbeat message. Reason: %s", err.Error()) } }
這個把CommitHash給hash,CommitHash可以通過上文的知識,在編譯時賦值。然后計算應用已運行的時間并返回HeartbeatMessage結(jié)構(gòu)體的值。durafmt是時間周期格式化工具,比內(nèi)置的更直觀易用。
當然最重要的是HTTP服務,Golang只需要一句代碼http.ListenAndServe(address, nil)
就搞定:
func RunHeartbeatService(address string) { http.HandleFunc("/heartbeat", handler) log.Println(http.ListenAndServe(address, nil)) }
該函數(shù)定義http服務,同時暴露一個請求地址:/heartbeat
。
Postman測試
定義一個最簡單的應用,在main方法中調(diào)用心跳功能,為了避免影響業(yè)務,讓其在獨立的協(xié)程中運行。
func main() { go RunHeartbeatService(":9090") // 阻塞主程序,模擬應用一直在運行 select {} }
現(xiàn)在可以通過postman定時請求心跳地址,驗證程序是否一直正常運行。
localhost:9090/heartbeat
{"status":"running","build":"Not available","uptime":"3 minutes 47 seconds 148 milliseconds 967 microseconds"}
Go客戶端測試
下面我們寫Get方法,使用Go語言實現(xiàn)http客戶端進行測試:
func Get(address string) (HeartbeatMessage, error) { // 定義http client client := &http.Client{} req, err := http.NewRequest("GET", address, nil) resp, err := client.Do(req) if err != nil { return HeartbeatMessage{}, err } // 解析響應并返回結(jié)果 b, err := io.ReadAll(resp.Body) defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return HeartbeatMessage{}, errors.New(fmt.Sprintf("Wrong status code: %d", resp.StatusCode)) } message := HeartbeatMessage{} err = json.Unmarshal(b, &message) if err != nil { log.Println("Error occured unmarshalling the response") } return message, nil }
Go單元測試
package main import ( "fmt" "testing" ) func TestGet(t *testing.T) { hs, err := Get("http://localhost:9090/heartbeat") if err != nil { fmt.Println(err) } fmt.Println(hs) }
測試結(jié)果:
=== RUN TestGet
{running Not available 6 minutes 2 seconds 625 milliseconds 381 microseconds}
--- PASS: TestGet (0.01s)
PASS
當然還可以使用httptest進行模擬測試,本月有機會學習分享。參考代碼:
https://github.com/enbritely/heartbeat-golang
到此這篇關(guān)于Golang編譯選項ldflags實例應用詳解的文章就介紹到這了,更多相關(guān)Golang ldflags內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go?實戰(zhàn)單隊列到優(yōu)先級隊列實現(xiàn)圖文示例
這篇文章主要為大家介紹了Go?實戰(zhàn)單隊列到優(yōu)先級隊列圖文示例實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07Go語言高效I/O并發(fā)處理雙緩沖和Exchanger模式實例探索
這篇文章主要介紹了Go語言高效I/O并發(fā)處理雙緩沖和Exchanger模式實例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01Go函數(shù)使用(函數(shù)定義、函數(shù)聲明、函數(shù)調(diào)用等)
本文主要介紹了Go函數(shù)使用,包括函數(shù)定義、函數(shù)聲明、函數(shù)調(diào)用、可變參數(shù)函數(shù)、匿名函數(shù)、遞歸函數(shù)、高階函數(shù)等,感興趣的可以了解一下2023-11-11Golang 數(shù)據(jù)庫操作(sqlx)和不定字段結(jié)果查詢
本文主要介紹了Golang 數(shù)據(jù)庫操作(sqlx)和不定字段結(jié)果查詢,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09