Golang 实现http协议的心跳检测程序

这篇具有很好参考价值的文章主要介绍了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文章来源地址https://www.toymoban.com/news/detail-408136.html

到了这里,关于Golang 实现http协议的心跳检测程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端加springboot实现Web Socket连接通讯以及测试流程(包括后端实现心跳检测)

    写这个项目主要是有有个项目需要后端有数据实话返回前端,一开始采用前端轮询的方式,后面觉得及时性上有些不行,然后改为使用websocket ,具体实现demo以及测试流程发出来提供交流学习, WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被

    2024年02月11日
    浏览(44)
  • C++ Qt TCP的心跳检测机制,断线重连技术,应用层代码重新实现

    目录 前言: 一、Qt直接启动本身的KeepAlive 二、在应用层自己实现一个心跳检测  三、自定义心跳代码实现: 完整客户端服务端工程下载: 共用的结构体相关头文件:         客户端部分核心代码:         服务端部分核心代码: 运行结果展示: 前两篇关于qt tcp 相关的,

    2024年02月05日
    浏览(44)
  • HTTP 协议详解(图文介绍)

    当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等。 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了Web应用程序的内部工作. 本文将对HTTP协议进行详细的实例讲解,内容较多,希望大家耐心看。也希望对大家的开

    2024年02月08日
    浏览(44)
  • HTTP协议各版本介绍

    HTTP协议是一种用于传输Web页面和其他资源的协议。 下面详细介绍一下HTTP的各个版本: 这是最早的HTTP版本,于1991年发布。它非常简单,只能传输HTML格式的文本,并且不支持其他类型的资源、请求头和状态码。 于1996年发布。HTTP/1.0引入了请求头和响应头的概念,支持多种格

    2024年02月15日
    浏览(31)
  • HTTP协议介绍

    HTTP协议是应用层协议,它叫超文本传输协议。应用层协议一般是我们自己自定义的,HTTP协议是计算机大佬们定义的一套现成的协议,因为它以及HTTPS使用的场景非常多,现在已经成为一套协议标准,我们可以学习这套标准直接拿来使用。 当我们在使用浏览器上网时,比如查

    2023年04月24日
    浏览(46)
  • HTTP超文本传输协议介绍

    转自:微点阅读  https://www.weidianyuedu.com HTTP 的全称是 Hyper Text Transfer Protocol,中文名叫做超文本传输协议,HTTP协议是用于从网络传输超文本数据到本地浏览器的传送协议,它能保证传送高效而准确地传送超文本文档。 HTTP、HTTPS HTTP 的全称是 Hyper Text Transfer Protocol,中文名叫

    2024年01月16日
    浏览(54)
  • BGP协议-邻居PMTU检测介绍

    BGP协议是运行在TCP之上的,所以TCP的参数设置会影响BGP的性能。在路由数目比较少的情况下TCP的参数调整可能对BGP性能影响不大,但是当路由数目比较巨大的时候调整TCP参数可以起到优化性能的作用。下面我们开始分析具体的优化方法。 首先我们来了解一下BGP协议包发送的方

    2024年02月05日
    浏览(44)
  • 12 正则表达式 | HTTP协议相关介绍

    在 Python 中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为 re。 示例: 输出的结果: 说明:re.match() 能够匹配出以== xxx 开头==的字符串 字符 功能 . 匹配任意 1 个字符(除了n) [ ] 匹配[ ]中列举的字符 d 匹配数字,即 0-9 dicimal D 匹配非数字,即不

    2024年02月12日
    浏览(42)
  • 计算机网络 - 应用层http协议 - http报文格式介绍(1)

    本篇认识和理解应用层中的http协议,了解抓包工具并进行使用,认识请求报文与响应报文,了解报文中基本键值对意思例如:Set-Cookie, 状态码等,如有错误,请在评论区指正,让我们一起交流,共同进步! 本文开始 ① 根据输入的url,在域名系统DNS中进行解析获取对应的服务

    2024年02月12日
    浏览(58)
  • Golang 程序漏洞检测利器 govulncheck(二):漏洞数据库详解

    上一篇文章详细介绍了 Golang 程序漏洞扫描工具 govulncheck 的使用方法,govulncheck 强大功能的背后,离不开 Go 漏洞数据库(Go vulnerability database)的支持,接下来详细讲解下 Go 漏洞数据库相关的知识。 在当今数字化的世界中,软件安全是至关重要的。随着 Golang 在开发领域的日

    2024年02月10日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包