您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“Golang怎么使用http協(xié)議實現(xiàn)心跳檢測程序”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Golang怎么使用http協(xié)議實現(xiàn)心跳檢測程序”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
實現(xiàn)心跳程序,其他應(yīng)用可以簡單集成。客戶端程序通過HTTP協(xié)議進行檢測,返回當(dāng)前程序狀態(tài)、版本ID以及已運行時間。
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可以通過上文的知識,在編譯時賦值。然后計算應(yīng)用已運行的時間并返回HeartbeatMessage結(jié)構(gòu)體的值。durafmt是時間周期格式化工具,比內(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ù),同時暴露一個請求地址:/heartbeat
。
定義一個最簡單的應(yīng)用,在main方法中調(diào)用心跳功能,為了避免影響業(yè)務(wù),讓其在獨立的協(xié)程中運行。
func main() { go RunHeartbeatService(":9090") // 阻塞主程序,模擬應(yīng)用一直在運行 select {} }
現(xiàn)在可以通過postman定時請求心跳地址,驗證程序是否一直正常運行。
localhost:9090/heartbeat
{"status":"running","build":"Not available","uptime":"3 minutes 47 seconds 148 milliseconds 967 microseconds"}
下面我們寫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 } // 解析響應(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 }
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
讀到這里,這篇“Golang怎么使用http協(xié)議實現(xiàn)心跳檢測程序”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。