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

方予
方予
发布时间:2026-10-15| 5人浏览过
原创

本文介绍了在 Golang 中利用 HTTP 协议构建简单且实用的心跳检测服务,涵盖返回程序状态、版本号及已运行时间的完整实现方案。

需求说明

为了确保后端应用的稳定性与健康度,通常需要提供一个简单的 API 供监控系统或外部程序调用。该心跳程序的核心目标包括:

  • 接入简单:其他业务系统可以低耦合地集成此服务。
  • 功能明确:客户端通过 HTTP GET 请求即可获取当前程序的运行状态(Status)、软件版本 ID(Build)以及系统累计运行时间(Uptime)。

程序核心实现

第1步:定义数据结构与全局变量

首先,定义用于封装响应数据的结构体 HeartbeatMessage,以及存放 Git 提交哈希和进程启动时间的全局变量。通过 Go 的 ldflags 编译选项可以在程序启动前注入 CommitHash,以显示真实的发布版本。

package main

import (
	"encoding/json"
	"github.com/hako/durafmt"
	"log"
	"net/http"
	"time"
)

const NotAvailableMessage = "Not available"
var CommitHash string // 通常通过 -ldflags 编译注入
var StartTime time.Time

type HeartbeatMessage struct {
	Status string `json:"status"`
	Build  string `json:"build"`
	Uptime string `json:"uptime"`
}

第2步:初始化启动时间

利用 Go 的 init() 函数在包加载时自动记录进程的初始启动时间,这是计算运行时长的基准点。

func init() {
	StartTime = time.Now()
}

第3步:编写心跳请求处理逻辑

处理 HTTP 请求的核心在于组装数据。这里我们使用了第三方库 github.com/hako/durafmt,它能将枯燥的时间差转换为如“3 minutes 47 seconds”这类更直观的人类可读格式。

如果编译时未传入 Git 哈希值,则默认返回“Not available”提示。

func handler(rw http.ResponseWriter, r *http.Request) {
	hash := CommitHash
	if hash == "" {
		hash = NotAvailableMessage
	}

	// 计算并格式化运行时间
	df, _ := durafmt.ParseString(time.Since(StartTime).String())
	uptime := df.String()

	// 构造响应消息并写入 JSON
	err := json.NewEncoder(rw).Encode(HeartbeatMessage{"running", hash, uptime})
	if err != nil {
		log.Fatalf("Failed to write heartbeat message. Reason: %s", err.Error())
	}
}

第4步:启动 HTTP 监听服务

Golang 的 net/http 标准库提供了极其简洁的 Web 服务开启方式。注册路由后,监听指定的端口即可对外提供服务。

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

上述代码将暴露一个请求地址:/heartbeat,专用于接收探测请求。

集成与服务启动

为了让心跳服务不阻塞主业务线程,通常将其置于独立的协程(goroutine)中运行。以下是一个最简化的入口程序模拟:

func main() {
	// 异步启动心跳服务,监听本地 9090 端口
	go RunHeartbeatService(":9090")

	// 阻塞主程序,模拟应用长期运行的状态
	select {}
}

检测结果验证

方式一:使用 Postman 等工具测试

启动程序后,可以通过 Postman 发送 GET 请求至 http://localhost:9090/heartbeat。预期的成功响应如下所示,包含了状态、构建信息以及人类友好的运行时长:

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

方式二:Go 客户端单元测试

在实际开发中,推荐使用 Go 代码进行自动化测试。以下展示了如何作为一个客户端去发起 HTTP 请求并解析返回结果:

func Get(address string) (HeartbeatMessage, error) {
	client := &http.Client{}
	req, err := http.NewRequest("GET", address, nil)
	if err != nil {
		return HeartbeatMessage{}, err
	}
	resp, err := client.Do(req)
	defer resp.Body.Close()
	
	if err != nil {
		return HeartbeatMessage{}, err
	}

	if resp.StatusCode != http.StatusOK {
		return HeartbeatMessage{}, errors.New(fmt.Sprintf("Wrong status code: %d", resp.StatusCode))
	}

	b, err := io.ReadAll(resp.Body)
	message := HeartbeatMessage{}
	err = json.Unmarshal(b, &message)
	if err != nil {
		log.Println("Error occured unmarshalling the response")
	}
	return message, nil
}

配合 testing 包的单元测试,可以直接验证接口的连通性与返回数据的正确性:

func TestGet(t *testing.T) {
	hs, err := Get("http://localhost:9090/heartbeat")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(hs)
}

若输出符合预期(例如显示 “{running Not available X minutes...}”),则证明心跳检测通道畅通无阻。

简要总结

以上就是使用 Golang 通过 HTTP 协议实现轻量级心跳检测服务的详细内容。借助于 net/http 标准库和直观的格式化手段,可以快速为任何服务搭建起具备自我状态汇报能力的监控探头,更多关于 Go 网络编程的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。