91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang怎么使用http協議實現心跳檢測程序

發布時間:2023-03-15 11:38:01 來源:億速云 閱讀:291 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“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

Postman測試

定義一個最簡單的應用,在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"}

Go客戶端測試

下面我們寫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
}

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)
}

測試結果:

=== RUN   TestGet
{running Not available 6 minutes 2 seconds 625 milliseconds 381 microseconds}
--- PASS: TestGet (0.01s)
PASS

讀到這里,這篇“Golang怎么使用http協議實現心跳檢測程序”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜兰市| 赫章县| 太原市| 长沙县| 黔西| 拉孜县| 内丘县| 高平市| 海盐县| 大厂| 蓝山县| 嫩江县| 晴隆县| 朝阳县| 曲松县| 古交市| 安陆市| 大竹县| 曲周县| 汕尾市| 定边县| 永宁县| 杭锦旗| 淮滨县| 文登市| 电白县| 娄底市| 安宁市| 张家界市| 思南县| 蓬溪县| 尼勒克县| 沿河| 自治县| 嘉峪关市| 南溪县| 巩义市| 双江| 临颍县| 宁陵县| 东城区|