国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Golang 實(shí)現(xiàn)http協(xié)議的心跳檢測(cè)程序

這篇具有很好參考價(jià)值的文章主要介紹了Golang 實(shí)現(xiàn)http協(xié)議的心跳檢測(cè)程序。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

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

需求說(shuō)明

實(shí)現(xiàn)心跳程序,其他應(yīng)用可以簡(jiǎn)單集成??蛻舳顺绦蛲ㄟ^(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客戶端測(cè)試

下面我們寫Get方法,使用Go語(yǔ)言實(shí)現(xiàn)http客戶端進(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文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-408136.html

到了這里,關(guān)于Golang 實(shí)現(xiàn)http協(xié)議的心跳檢測(cè)程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 前端加springboot實(shí)現(xiàn)Web Socket連接通訊以及測(cè)試流程(包括后端實(shí)現(xiàn)心跳檢測(cè))

    前端加springboot實(shí)現(xiàn)Web Socket連接通訊以及測(cè)試流程(包括后端實(shí)現(xiàn)心跳檢測(cè))

    寫這個(gè)項(xiàng)目主要是有有個(gè)項(xiàng)目需要后端有數(shù)據(jù)實(shí)話返回前端,一開始采用前端輪詢的方式,后面覺(jué)得及時(shí)性上有些不行,然后改為使用websocket ,具體實(shí)現(xiàn)demo以及測(cè)試流程發(fā)出來(lái)提供交流學(xué)習(xí), WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議。WebSocket通信協(xié)議于2011年被

    2024年02月11日
    瀏覽(27)
  • C++ Qt TCP的心跳檢測(cè)機(jī)制,斷線重連技術(shù),應(yīng)用層代碼重新實(shí)現(xiàn)

    C++ Qt TCP的心跳檢測(cè)機(jī)制,斷線重連技術(shù),應(yīng)用層代碼重新實(shí)現(xiàn)

    目錄 前言: 一、Qt直接啟動(dòng)本身的KeepAlive 二、在應(yīng)用層自己實(shí)現(xiàn)一個(gè)心跳檢測(cè) ?三、自定義心跳代碼實(shí)現(xiàn): 完整客戶端服務(wù)端工程下載: 共用的結(jié)構(gòu)體相關(guān)頭文件: ? ? ? ? 客戶端部分核心代碼: ? ? ? ? 服務(wù)端部分核心代碼: 運(yùn)行結(jié)果展示: 前兩篇關(guān)于qt tcp 相關(guān)的,

    2024年02月05日
    瀏覽(23)
  • HTTP協(xié)議介紹

    HTTP協(xié)議介紹

    HTTP協(xié)議是應(yīng)用層協(xié)議,它叫超文本傳輸協(xié)議。應(yīng)用層協(xié)議一般是我們自己自定義的,HTTP協(xié)議是計(jì)算機(jī)大佬們定義的一套現(xiàn)成的協(xié)議,因?yàn)樗约癏TTPS使用的場(chǎng)景非常多,現(xiàn)在已經(jīng)成為一套協(xié)議標(biāo)準(zhǔn),我們可以學(xué)習(xí)這套標(biāo)準(zhǔn)直接拿來(lái)使用。 當(dāng)我們?cè)谑褂脼g覽器上網(wǎng)時(shí),比如查

    2023年04月24日
    瀏覽(21)
  • HTTP 協(xié)議詳解(圖文介紹)

    當(dāng)今web程序的開發(fā)技術(shù)真是百家爭(zhēng)鳴,ASP.NET, PHP, JSP,Perl, AJAX 等等。 無(wú)論Web技術(shù)在未來(lái)如何發(fā)展,理解Web程序之間通信的基本協(xié)議相當(dāng)重要, 因?yàn)樗屛覀兝斫饬薟eb應(yīng)用程序的內(nèi)部工作. 本文將對(duì)HTTP協(xié)議進(jìn)行詳細(xì)的實(shí)例講解,內(nèi)容較多,希望大家耐心看。也希望對(duì)大家的開

    2024年02月08日
    瀏覽(32)
  • HTTP協(xié)議各版本介紹

    HTTP協(xié)議是一種用于傳輸Web頁(yè)面和其他資源的協(xié)議。 下面詳細(xì)介紹一下HTTP的各個(gè)版本: 這是最早的HTTP版本,于1991年發(fā)布。它非常簡(jiǎn)單,只能傳輸HTML格式的文本,并且不支持其他類型的資源、請(qǐng)求頭和狀態(tài)碼。 于1996年發(fā)布。HTTP/1.0引入了請(qǐng)求頭和響應(yīng)頭的概念,支持多種格

    2024年02月15日
    瀏覽(15)
  • HTTP超文本傳輸協(xié)議介紹

    HTTP超文本傳輸協(xié)議介紹

    轉(zhuǎn)自:微點(diǎn)閱讀??https://www.weidianyuedu.com HTTP 的全稱是?Hyper?Text Transfer Protocol,中文名叫做超文本傳輸協(xié)議,HTTP協(xié)議是用于從網(wǎng)絡(luò)傳輸超文本數(shù)據(jù)到本地瀏覽器的傳送協(xié)議,它能保證傳送高效而準(zhǔn)確地傳送超文本文檔。 HTTP、HTTPS HTTP 的全稱是 Hyper Text Transfer Protocol,中文名叫

    2024年01月16日
    瀏覽(25)
  • BGP協(xié)議-鄰居PMTU檢測(cè)介紹

    BGP協(xié)議是運(yùn)行在TCP之上的,所以TCP的參數(shù)設(shè)置會(huì)影響B(tài)GP的性能。在路由數(shù)目比較少的情況下TCP的參數(shù)調(diào)整可能對(duì)BGP性能影響不大,但是當(dāng)路由數(shù)目比較巨大的時(shí)候調(diào)整TCP參數(shù)可以起到優(yōu)化性能的作用。下面我們開始分析具體的優(yōu)化方法。 首先我們來(lái)了解一下BGP協(xié)議包發(fā)送的方

    2024年02月05日
    瀏覽(25)
  • 12 正則表達(dá)式 | HTTP協(xié)議相關(guān)介紹

    12 正則表達(dá)式 | HTTP協(xié)議相關(guān)介紹

    在 Python 中需要通過(guò)正則表達(dá)式對(duì)字符串進(jìn)行匹配的時(shí)候,可以使用一個(gè)模塊,名字為 re。 示例: 輸出的結(jié)果: 說(shuō)明:re.match() 能夠匹配出以== xxx 開頭==的字符串 字符 功能 . 匹配任意 1 個(gè)字符(除了n) [ ] 匹配[ ]中列舉的字符 d 匹配數(shù)字,即 0-9 dicimal D 匹配非數(shù)字,即不

    2024年02月12日
    瀏覽(23)
  • 計(jì)算機(jī)網(wǎng)絡(luò) - 應(yīng)用層http協(xié)議 - http報(bào)文格式介紹(1)

    計(jì)算機(jī)網(wǎng)絡(luò) - 應(yīng)用層http協(xié)議 - http報(bào)文格式介紹(1)

    本篇認(rèn)識(shí)和理解應(yīng)用層中的http協(xié)議,了解抓包工具并進(jìn)行使用,認(rèn)識(shí)請(qǐng)求報(bào)文與響應(yīng)報(bào)文,了解報(bào)文中基本鍵值對(duì)意思例如:Set-Cookie, 狀態(tài)碼等,如有錯(cuò)誤,請(qǐng)?jiān)谠u(píng)論區(qū)指正,讓我們一起交流,共同進(jìn)步! 本文開始 ① 根據(jù)輸入的url,在域名系統(tǒng)DNS中進(jìn)行解析獲取對(duì)應(yīng)的服務(wù)

    2024年02月12日
    瀏覽(94)
  • Golang 程序漏洞檢測(cè)利器 govulncheck(一):安裝和使用方法

    govulncheck 是一個(gè)命令行工具,可以幫助 Golang 開發(fā)者快速找到項(xiàng)目代碼和依賴的模塊中的安全漏洞。該工具可以分析源代碼和二進(jìn)制文件,識(shí)別代碼中對(duì)這些漏洞的任何直接或間接調(diào)用。 默認(rèn)情況下,govulncheck 通過(guò) Go 漏洞數(shù)據(jù)庫(kù) https://vuln.go.dev 提供的接口查詢相關(guān)的模塊是否

    2024年02月10日
    瀏覽(13)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包