Golang使用http協(xié)議實(shí)現(xiàn)心跳檢測程序過程詳解
本文介紹如何使用Golang實(shí)現(xiàn)心跳程序。
需求說明
實(shí)現(xiàn)心跳程序,其他應(yīng)用可以簡單集成??蛻舳顺绦蛲ㄟ^HTTP協(xié)議進(jìn)行檢測,返回當(dāng)前程序狀態(tài)、版本ID以及已運(yùn)行時(shí)間。
程序?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)) }
首先定義了兩個(gè)變量,CommitHash、StartTime,然后定義結(jié)構(gòu)體HeartbeatMessage封裝返回值。
接著在init方法中給StartTime變量賦初始值。下面時(shí)處理請求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()) } }
這個(gè)把CommitHash給hash,CommitHash可以通過上文的知識,在編譯時(shí)賦值。然后計(jì)算應(yīng)用已運(yùn)行的時(shí)間并返回HeartbeatMessage結(jié)構(gòu)體的值。durafmt是時(shí)間周期格式化工具,比內(nèi)置的更直觀易用。
當(dāng)然最重要的是HTTP服務(wù),Golang只需要一句代碼http.ListenAndServe(address, nil)
就搞定:
func RunHeartbeatService(address string) { http.HandleFunc("/heartbeat", handler) log.Println(http.ListenAndServe(address, nil)) }
該函數(shù)定義http服務(wù),同時(shí)暴露一個(gè)請求地址:/heartbeat
。
Postman測試
定義一個(gè)最簡單的應(yīng)用,在main方法中調(diào)用心跳功能,為了避免影響業(yè)務(wù),讓其在獨(dú)立的協(xié)程中運(yùn)行。
func main() { go RunHeartbeatService(":9090") // 阻塞主程序,模擬應(yīng)用一直在運(yùn)行 select {} }
現(xiàn)在可以通過postman定時(shí)請求心跳地址,驗(yàn)證程序是否一直正常運(yùn)行。
localhost:9090/heartbeat
{"status":"running","build":"Not available","uptime":"3 minutes 47 seconds 148 milliseconds 967 microseconds"}
Go客戶端測試
下面我們寫Get方法,使用Go語言實(shí)現(xiàn)http客戶端進(jìn)行測試:
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 } // 解析響應(yīng)并返回結(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
當(dāng)然還可以使用httptest進(jìn)行模擬測試,本月有機(jī)會學(xué)習(xí)分享。參考代碼:
https://github.com/enbritely/heartbeat-golang
到此這篇關(guān)于Golang編譯選項(xiàng)ldflags實(shí)例應(yīng)用詳解的文章就介紹到這了,更多相關(guān)Golang ldflags內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go?實(shí)戰(zhàn)單隊(duì)列到優(yōu)先級隊(duì)列實(shí)現(xiàn)圖文示例
這篇文章主要為大家介紹了Go?實(shí)戰(zhàn)單隊(duì)列到優(yōu)先級隊(duì)列圖文示例實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Go語言高效I/O并發(fā)處理雙緩沖和Exchanger模式實(shí)例探索
這篇文章主要介紹了Go語言高效I/O并發(fā)處理雙緩沖和Exchanger模式實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Go函數(shù)使用(函數(shù)定義、函數(shù)聲明、函數(shù)調(diào)用等)
本文主要介紹了Go函數(shù)使用,包括函數(shù)定義、函數(shù)聲明、函數(shù)調(diào)用、可變參數(shù)函數(shù)、匿名函數(shù)、遞歸函數(shù)、高階函數(shù)等,感興趣的可以了解一下2023-11-11深入理解Go Gin框架中間件的實(shí)現(xiàn)原理
在Go Gin框架中,中間件是一種在請求處理過程中插入的功能模塊,它可以用于處理請求的前置和后置邏輯,例如認(rèn)證、日志記錄、錯(cuò)誤處理等,本文將給大家介紹一下Go Gin框架中間件的實(shí)現(xiàn)原理,需要的朋友可以參考下2023-09-09Golang 數(shù)據(jù)庫操作(sqlx)和不定字段結(jié)果查詢
本文主要介紹了Golang 數(shù)據(jù)庫操作(sqlx)和不定字段結(jié)果查詢,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09