最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang使用http協(xié)議實現(xiàn)心跳檢測程序過程詳解

 更新時間:2023年03月15日 10:30:23   作者:夢想畫家  
這篇文章主要介紹了Golang使用http協(xié)議實現(xiàn)心跳檢測程序過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧

本文介紹如何使用Golang實現(xiàn)心跳程序。

需求說明

實現(xiàn)心跳程序,其他應用可以簡單集成。客戶端程序通過HTTP協(xié)議進行檢測,返回當前程序狀態(tài)、版本ID以及已運行時間。

程序?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))
}

首先定義了兩個變量,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可以通過上文的知識,在編譯時賦值。然后計算應用已運行的時間并返回HeartbeatMessage結(jié)構(gòu)體的值。durafmt是時間周期格式化工具,比內(nèi)置的更直觀易用。

當然最重要的是HTTP服務,Golang只需要一句代碼http.ListenAndServe(address, nil)就搞定:

func RunHeartbeatService(address string) {
	http.HandleFunc("/heartbeat", handler)
	log.Println(http.ListenAndServe(address, nil))
}

該函數(shù)定義http服務,同時暴露一個請求地址:/heartbeat

Postman測試

定義一個最簡單的應用,在main方法中調(diào)用心跳功能,為了避免影響業(yè)務,讓其在獨立的協(xié)程中運行。

func main() {
	go RunHeartbeatService(":9090")
	// 阻塞主程序,模擬應用一直在運行
	select {}
}

現(xiàn)在可以通過postman定時請求心跳地址,驗證程序是否一直正常運行。

localhost:9090/heartbeat
{"status":"running","build":"Not available","uptime":"3 minutes 47 seconds 148 milliseconds 967 microseconds"}

Go客戶端測試

下面我們寫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
	}
	// 解析響應并返回結(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

當然還可以使用httptest進行模擬測試,本月有機會學習分享。參考代碼:

https://github.com/enbritely/heartbeat-golang

到此這篇關于Golang編譯選項ldflags實例應用詳解的文章就介紹到這了,更多相關Golang ldflags內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

  • golang中如何保證精度的方法

    golang中如何保證精度的方法

    本文主要介紹了golang中如何保證精度的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • golang游戲等資源壓縮包創(chuàng)建和操作方法

    golang游戲等資源壓縮包創(chuàng)建和操作方法

    這篇文章主要介紹了golang游戲等資源壓縮包創(chuàng)建和操作,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • golang panic 函數(shù)用法示例詳解

    golang panic 函數(shù)用法示例詳解

    在Go語言中,panic用于觸發(fā)不可恢復的錯誤,終止函數(shù)執(zhí)行并逐層向上觸發(fā)defer,最終若未被recover捕獲,程序會崩潰,recover用于在defer函數(shù)中捕獲panic,恢復程序流程,建議優(yōu)先返回error,僅在嚴重錯誤或不可恢復場景下使用panic,并在關鍵位置recover,感興趣的朋友一起看看吧
    2025-03-03
  • 在Go中復制文件最流行的3種方法

    在Go中復制文件最流行的3種方法

    今天小編就為大家分享一篇關于在Go中復制文件最流行的3種方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Go語言刪除文本文件中的指定行操作代碼

    Go語言刪除文本文件中的指定行操作代碼

    假設現(xiàn)在有一個文本文件,我們需要刪除文件中亂碼的行。我們可以使用go的os庫來處理文件,遍歷整個文件然后將除過亂碼的行寫入一個新文件,以此來實現(xiàn)我們的需求,這篇文章主要介紹了Go語言刪除文本文件中的指定行,需要的朋友可以參考下
    2023-12-12
  • Goland激活碼破解永久版及安裝詳細教程(親測可以)

    Goland激活碼破解永久版及安裝詳細教程(親測可以)

    這篇文章主要介紹了Goland激活碼破解永久版及安裝詳細教程(親測可以),本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Golang并發(fā)繞不開的重要組件之Goroutine詳解

    Golang并發(fā)繞不開的重要組件之Goroutine詳解

    Goroutine、Channel、Context、Sync都是Golang并發(fā)編程中的幾個重要組件,這篇文中主要為大家介紹了Goroutine的相關知識,需要的可以參考一下
    2023-06-06
  • GO?CountMinSketch計數(shù)器(布隆過濾器思想的近似計數(shù)器)

    GO?CountMinSketch計數(shù)器(布隆過濾器思想的近似計數(shù)器)

    這篇文章主要介紹了GO?CountMinSketch計數(shù)器(布隆過濾器思想的近似計數(shù)器),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-09-09
  • 淺談Go用于同步和并發(fā)控制的幾種常見鎖

    淺談Go用于同步和并發(fā)控制的幾種常見鎖

    本文主要介紹了淺談Go用于同步和并發(fā)控制的幾種常見鎖,包括互斥鎖、讀寫鎖和一次性鎖等,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • golang連接kafka消費進ES操作

    golang連接kafka消費進ES操作

    這篇文章主要介紹了golang連接kafka消費進ES操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

循化| 霍邱县| 延边| 祥云县| 沂南县| 石嘴山市| 大名县| 洪雅县| 任丘市| 汕尾市| 娱乐| 湖口县| 孙吴县| 新津县| 东莞市| 安乡县| 拜泉县| 阳谷县| 红原县| 开封市| 长岭县| 三门县| 休宁县| 和静县| 大同县| 天台县| 台南市| 罗城| 长沙县| 余干县| 遂昌县| 英超| 卢龙县| 永寿县| 海安县| 南投市| 瑞昌市| 杭锦后旗| 静海县| 曲水县| 岢岚县|