Golang使用http协议实现心跳检测程序过程详解

 更新时间:2023年03月15日 10:30:23   作者:梦想画家  
这篇文章主要介绍了Golang使用http协议实现心跳检测程序过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

本文介绍如何使用Golang实现心跳程序。

需求说明

实现心跳程序,其他应用可以简单集成。客户端程序通过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

当然还可以使用httptest进行模拟测试,本月有机会学习分享。参考代码:

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

到此这篇关于Golang编译选项ldflags实例应用详解的文章就介绍到这了,更多相关Golang ldflags内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

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

    golang中如何保证精度的方法

    本文主要介绍了golang中如何保证精度的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • golang游戏等资源压缩包创建和操作方法

    golang游戏等资源压缩包创建和操作方法

    这篇文章主要介绍了golang游戏等资源压缩包创建和操作,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • golang panic 函数用法示例详解

    golang panic 函数用法示例详解

    在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在defer函数中捕获panic,恢复程序流程,建议优先返回error,仅在严重错误或不可恢复场景下使用panic,并在关键位置recover,感兴趣的朋友一起看看吧
    2025-03-03
  • 在Go中复制文件最流行的3种方法

    在Go中复制文件最流行的3种方法

    今天小编就为大家分享一篇关于在Go中复制文件最流行的3种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • Go语言删除文本文件中的指定行操作代码

    Go语言删除文本文件中的指定行操作代码

    假设现在有一个文本文件,我们需要删除文件中乱码的行。我们可以使用go的os库来处理文件,遍历整个文件然后将除过乱码的行写入一个新文件,以此来实现我们的需求,这篇文章主要介绍了Go语言删除文本文件中的指定行,需要的朋友可以参考下
    2023-12-12
  • Goland激活码破解永久版及安装详细教程(亲测可以)

    Goland激活码破解永久版及安装详细教程(亲测可以)

    这篇文章主要介绍了Goland激活码破解永久版及安装详细教程(亲测可以),本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Golang并发绕不开的重要组件之Goroutine详解

    Golang并发绕不开的重要组件之Goroutine详解

    Goroutine、Channel、Context、Sync都是Golang并发编程中的几个重要组件,这篇文中主要为大家介绍了Goroutine的相关知识,需要的可以参考一下
    2023-06-06
  • GO CountMinSketch计数器(布隆过滤器思想的近似计数器)

    GO CountMinSketch计数器(布隆过滤器思想的近似计数器)

    这篇文章主要介绍了GO CountMinSketch计数器(布隆过滤器思想的近似计数器),文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09
  • 浅谈Go用于同步和并发控制的几种常见锁

    浅谈Go用于同步和并发控制的几种常见锁

    本文主要介绍了浅谈Go用于同步和并发控制的几种常见锁,包括互斥锁、读写锁和一次性锁等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • golang连接kafka消费进ES操作

    golang连接kafka消费进ES操作

    这篇文章主要介绍了golang连接kafka消费进ES操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论