您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Golang怎么使用http協議實現心跳檢測程序”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Golang怎么使用http協議實現心跳檢測程序”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
實現心跳程序,其他應用可以簡單集成。客戶端程序通過HTTP協議進行檢測,返回當前程序狀態、版本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,然后定義結構體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結構體的值。durafmt是時間周期格式化工具,比內置的更直觀易用。
當然最重要的是HTTP服務,Golang只需要一句代碼http.ListenAndServe(address, nil)
就搞定:
func RunHeartbeatService(address string) { http.HandleFunc("/heartbeat", handler) log.Println(http.ListenAndServe(address, nil)) }
該函數定義http服務,同時暴露一個請求地址:/heartbeat
。
定義一個最簡單的應用,在main方法中調用心跳功能,為了避免影響業務,讓其在獨立的協程中運行。
func main() { go RunHeartbeatService(":9090") // 阻塞主程序,模擬應用一直在運行 select {} }
現在可以通過postman定時請求心跳地址,驗證程序是否一直正常運行。
localhost:9090/heartbeat
{"status":"running","build":"Not available","uptime":"3 minutes 47 seconds 148 milliseconds 967 microseconds"}
下面我們寫Get方法,使用Go語言實現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 } // 解析響應并返回結果 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) }
測試結果:
=== RUN TestGet
{running Not available 6 minutes 2 seconds 625 milliseconds 381 microseconds}
--- PASS: TestGet (0.01s)
PASS
讀到這里,這篇“Golang怎么使用http協議實現心跳檢測程序”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。