Golang怎么使用http协议实现心跳检测程序

其他教程   发布日期:2023年08月29日   浏览次数:415

本文小编为大家详细介绍“Golang怎么使用http协议实现心跳检测程序”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang怎么使用http协议实现心跳检测程序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

需求说明

实现心跳程序,其他应用可以简单集成。客户端程序通过HTTP协议进行检测,返回当前程序状态、版本ID以及已运行时间。

程序实现

  1. package main
  2. import (
  3. "encoding/json"
  4. "github.com/hako/durafmt"
  5. "log"
  6. "net/http"
  7. "time"
  8. )
  9. const NotAvailableMessage = "Not available"
  10. var CommitHash string
  11. var StartTime time.Time
  12. type HeartbeatMessage struct {
  13. Status string `json:"status"`
  14. Build string `json:"build"`
  15. Uptime string `json:"uptime"`
  16. }
  17. func init() {
  18. StartTime = time.Now()
  19. }
  20. func handler(rw http.ResponseWriter, r *http.Request) {
  21. hash := CommitHash
  22. if hash == "" {
  23. hash = NotAvailableMessage
  24. }
  25. df, _ := durafmt.ParseString(time.Since(StartTime).String())
  26. uptime := df.String()
  27. err := json.NewEncoder(rw).Encode(HeartbeatMessage{"running", hash, uptime})
  28. if err != nil {
  29. log.Fatalf("Failed to write heartbeat message. Reason: %s", err.Error())
  30. }
  31. }
  32. func RunHeartbeatService(address string) {
  33. http.HandleFunc("/heartbeat", handler)
  34. log.Println(http.ListenAndServe(address, nil))
  35. }

首先定义了两个变量,CommitHash、StartTime,然后定义结构体HeartbeatMessage封装返回值。

接着在init方法中给StartTime变量赋初始值。下面时处理请求handler方法:

  1. func handler(rw http.ResponseWriter, r *http.Request) {
  2. hash := CommitHash
  3. if hash == "" {
  4. hash = NotAvailableMessage
  5. }
  6. df, _ := durafmt.ParseString(time.Since(StartTime).String())
  7. uptime := df.String()
  8. err := json.NewEncoder(rw).Encode(HeartbeatMessage{"running", hash, uptime})
  9. if err != nil {
  10. log.Fatalf("Failed to write heartbeat message. Reason: %s", err.Error())
  11. }
  12. }

这个把CommitHash给hash,CommitHash可以通过上文的知识,在编译时赋值。然后计算应用已运行的时间并返回HeartbeatMessage结构体的值。durafmt是时间周期格式化工具,比内置的更直观易用。

当然最重要的是HTTP服务,Golang只需要一句代码

  1. http.ListenAndServe(address, nil)
就搞定:
  1. func RunHeartbeatService(address string) {
  2. http.HandleFunc("/heartbeat", handler)
  3. log.Println(http.ListenAndServe(address, nil))
  4. }

该函数定义http服务,同时暴露一个请求地址:

  1. /heartbeat

Postman测试

定义一个最简单的应用,在main方法中调用心跳功能,为了避免影响业务,让其在独立的协程中运行。

  1. func main() {
  2. go RunHeartbeatService(":9090")
  3. // 阻塞主程序,模拟应用一直在运行
  4. select {}
  5. }

现在可以通过postman定时请求心跳地址,验证程序是否一直正常运行。

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

Go客户端测试

下面我们写Get方法,使用Go语言实现http客户端进行测试:

  1. func Get(address string) (HeartbeatMessage, error) {
  2. // 定义http client
  3. client := &http.Client{}
  4. req, err := http.NewRequest("GET", address, nil)
  5. resp, err := client.Do(req)
  6. if err != nil {
  7. return HeartbeatMessage{}, err
  8. }
  9. // 解析响应并返回结果
  10. b, err := io.ReadAll(resp.Body)
  11. defer resp.Body.Close()
  12. if resp.StatusCode != http.StatusOK {
  13. return HeartbeatMessage{}, errors.New(fmt.Sprintf("Wrong status code: %d", resp.StatusCode))
  14. }
  15. message := HeartbeatMessage{}
  16. err = json.Unmarshal(b, &message)
  17. if err != nil {
  18. log.Println("Error occured unmarshalling the response")
  19. }
  20. return message, nil
  21. }

Go单元测试

  1. package main
  2. import (
  3. "fmt"
  4. "testing"
  5. )
  6. func TestGet(t *testing.T) {
  7. hs, err := Get("http://localhost:9090/heartbeat")
  8. if err != nil {
  9. fmt.Println(err)
  10. }
  11. fmt.Println(hs)
  12. }

测试结果:

=== RUN TestGet
{running Not available 6 minutes 2 seconds 625 milliseconds 381 microseconds}
--- PASS: TestGet (0.01s)
PASS

以上就是Golang怎么使用http协议实现心跳检测程序的详细内容,更多关于Golang怎么使用http协议实现心跳检测程序的资料请关注九品源码其它相关文章!