Golang使用http協(xié)議實(shí)現(xiàn)心跳檢測(cè)程序過(guò)程詳解
本文介紹如何使用Golang實(shí)現(xiàn)心跳程序。
需求說(shuō)明
實(shí)現(xiàn)心跳程序,其他應(yīng)用可以簡(jiǎn)單集成。客戶(hù)端程序通過(guò)HTTP協(xié)議進(jìn)行檢測(cè),返回當(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í)處理請(qǐng)求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可以通過(guò)上文的知識(shí),在編譯時(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è)請(qǐng)求地址:/heartbeat。
Postman測(cè)試
定義一個(gè)最簡(jiǎn)單的應(yīng)用,在main方法中調(diào)用心跳功能,為了避免影響業(yè)務(wù),讓其在獨(dú)立的協(xié)程中運(yùn)行。
func main() {
go RunHeartbeatService(":9090")
// 阻塞主程序,模擬應(yīng)用一直在運(yùn)行
select {}
}
現(xiàn)在可以通過(guò)postman定時(shí)請(qǐng)求心跳地址,驗(yàn)證程序是否一直正常運(yùn)行。
localhost:9090/heartbeat
{"status":"running","build":"Not available","uptime":"3 minutes 47 seconds 148 milliseconds 967 microseconds"}
Go客戶(hù)端測(cè)試
下面我們寫(xiě)Get方法,使用Go語(yǔ)言實(shí)現(xiàn)http客戶(hù)端進(jìn)行測(cè)試:
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單元測(cè)試
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)
}
測(cè)試結(jié)果:
=== RUN TestGet
{running Not available 6 minutes 2 seconds 625 milliseconds 381 microseconds}
--- PASS: TestGet (0.01s)
PASS
當(dāng)然還可以使用httptest進(jìn)行模擬測(cè)試,本月有機(jī)會(huì)學(xué)習(xí)分享。參考代碼:
https://github.com/enbritely/heartbeat-golang
到此這篇關(guān)于Golang編譯選項(xiàng)ldflags實(shí)例應(yīng)用詳解的文章就介紹到這了,更多相關(guān)Golang ldflags內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Goland激活碼破解永久版及安裝詳細(xì)教程(親測(cè)可以)
這篇文章主要介紹了Goland激活碼破解永久版及安裝詳細(xì)教程(親測(cè)可以),本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Golang并發(fā)繞不開(kāi)的重要組件之Goroutine詳解
Goroutine、Channel、Context、Sync都是Golang并發(fā)編程中的幾個(gè)重要組件,這篇文中主要為大家介紹了Goroutine的相關(guān)知識(shí),需要的可以參考一下2023-06-06
GO?CountMinSketch計(jì)數(shù)器(布隆過(guò)濾器思想的近似計(jì)數(shù)器)
這篇文章主要介紹了GO?CountMinSketch計(jì)數(shù)器(布隆過(guò)濾器思想的近似計(jì)數(shù)器),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09
golang連接kafka消費(fèi)進(jìn)ES操作
這篇文章主要介紹了golang連接kafka消費(fèi)進(jìn)ES操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12

