Golang怎么使用http协议实现心跳检测程序
本文小编为大家详细介绍“Golang怎么使用http协议实现心跳检测程序”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang怎么使用http协议实现心跳检测程序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
需求说明
实现心跳程序,其他应用可以简单集成。客户端程序通过HTTP协议进行检测,返回当前程序状态、版本ID以及已运行时间。
程序实现
package mainimport ("encoding/json""github.com/hako/durafmt""log""net/http""time")const NotAvailableMessage = "Not available"var CommitHash stringvar StartTime time.Timetype 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 := CommitHashif 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 := CommitHashif 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 clientclient := &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 mainimport ("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
读到这里,这篇“Golang怎么使用http协议实现心跳检测程序”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341