欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Go語(yǔ)言實(shí)現(xiàn)心跳機(jī)制

 更新時(shí)間:2024年01月31日 15:11:47   作者:banjming  
心跳最典型的應(yīng)用場(chǎng)景是是探測(cè)服務(wù)是否存活,這篇文章主要來(lái)和大家介紹一下如何使用Go語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的心跳程序,感興趣的可以了解下

Go 實(shí)現(xiàn)心跳

心跳最典型的應(yīng)用場(chǎng)景是是探測(cè)服務(wù)是否存活,比如在 Zookeeper 中,會(huì)使用心跳探測(cè)服務(wù)是否存貨,如果服務(wù)已經(jīng)死亡,會(huì)將服務(wù)從注冊(cè)表中刪除,避免服務(wù)請(qǐng)求路由到一個(gè)已經(jīng)宕機(jī)的服務(wù)中。

Go 中實(shí)現(xiàn)心跳機(jī)制可以通過(guò) time.NewTimeTicker(), 配合 channel 使用,就可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的心跳程序:

import (
	"code.byted.org/gopkg/logs"
	"context"
	"fmt"
	"testing"
	"time"
)

func sendHeartbeat(heartbeatChan chan<- time.Time) {
	ticker := time.NewTicker(time.Second)
	defer ticker.Stop()
	for {
		select {
		case t := <-ticker.C:
			heartbeatChan <- t
		}
	}
}

func TestHeartbeat(t *testing.T) {

	heartbeatChan := make(chan time.Time)
	go doWork([]int{1, 2, 3, 5, 5}, heartbeatChan)
	for t := range heartbeatChan {
		// 上報(bào)心跳包的邏輯,可以在這里實(shí)現(xiàn)
		fmt.Println("Received heartbeat at", t)
	}
    fmt.Println("heartbeat finished")
}

func doWork(nums []int, heartbeatChan chan time.Time) {
	go sendHeartbeat(heartbeatChan)
	defer func() {
		close(heartbeatChan)
	}()
	for num := range nums {
        time.Sleep(1 * time.Second)
		fmt.Println(num)
	}
}

執(zhí)行結(jié)果如下:

=== RUN   TestHeartbeat
0
Received heartbeat at 2024-01-31 11:30:46.3363 +0800 CST m=+1.002830252
Received heartbeat at 2024-01-31 11:30:47.335975 +0800 CST m=+2.002513164
1
Received heartbeat at 2024-01-31 11:30:48.336252 +0800 CST m=+3.002795914
2
Received heartbeat at 2024-01-31 11:30:49.33622 +0800 CST m=+4.002768883
3
Received heartbeat at 2024-01-31 11:30:50.336222 +0800 CST m=+5.002775378
4
heartbeat finished
--- PASS: TestHeartbeat (5.00s)
PASS

心跳程序

客戶(hù)端發(fā)送心跳請(qǐng)求, 并通過(guò)重試機(jī)制。判斷重試X次失敗認(rèn)為服務(wù)離線(xiàn) 服務(wù)端響應(yīng)心跳請(qǐng)求,通過(guò)超時(shí)機(jī)制。超時(shí)X秒未收到心跳則判斷客戶(hù)端離線(xiàn)

package main

import (
	"fmt"
	"net"
	"time"
)

func main() {
	// 啟動(dòng)服務(wù)端
	go startServer()

	// 啟動(dòng)客戶(hù)端
	go startClient()

	// 保持 main goroutine 活躍,避免程序退出
	select {}
}

func startServer() {
	ln, err := net.Listen("tcp", ":8080")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer ln.Close()

	for {
		conn, err := ln.Accept()
		if err != nil {
			fmt.Println(err)
			continue
		}
		go handleConnection(conn)
	}
}

func handleConnection(conn net.Conn) {
	// 使用 bufio 包中的 ReadWriter 類(lèi)型,方便讀寫(xiě)字符串
	rw := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn))

	// 啟動(dòng)一個(gè) goroutine,定時(shí)發(fā)送心跳消息
	go func() {
		for {
			time.Sleep(time.Second)
			if _, err := rw.WriteString("heartbeat\n"); err != nil {
				fmt.Println(err)
				return
			}
			if err := rw.Flush(); err != nil {
				fmt.Println(err)
				return
			}
		}
	}()

	// 循環(huán)讀取客戶(hù)端發(fā)送的消息
	for {
		line, err := rw.ReadString('\n')
		if err != nil {
			fmt.Println(err)
			return
		}
		fmt.Println("received:", line)
	}
}

func startClient() {
	conn, err := net.Dial("tcp", "localhost:8080")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer conn.Close()

	//
}

到此這篇關(guān)于使用Go語(yǔ)言實(shí)現(xiàn)心跳機(jī)制的文章就介紹到這了,更多相關(guān)Go心跳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang中按照結(jié)構(gòu)體的某個(gè)字段排序?qū)嵗a

    golang中按照結(jié)構(gòu)體的某個(gè)字段排序?qū)嵗a

    在任何編程語(yǔ)言中,關(guān)乎到數(shù)據(jù)的排序都會(huì)有對(duì)應(yīng)的策略,下面這篇文章主要給大家介紹了關(guān)于golang中按照結(jié)構(gòu)體的某個(gè)字段排序的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Go高級(jí)特性探究之協(xié)程池詳解

    Go高級(jí)特性探究之協(xié)程池詳解

    在并發(fā)編程中,協(xié)程是?Go?語(yǔ)言的核心特性之一,本文將介紹如何使用?Go?協(xié)程池構(gòu)造一個(gè)協(xié)程池,并解決函數(shù)傳參問(wèn)題、優(yōu)雅關(guān)閉協(xié)程池和保證協(xié)程安全的問(wèn)題,感興趣的可以了解一下
    2023-06-06
  • golang gc的內(nèi)部?jī)?yōu)化詳細(xì)介紹

    golang gc的內(nèi)部?jī)?yōu)化詳細(xì)介紹

    Go編譯器在垃圾回收(GC)的掃描標(biāo)記階段,對(duì)存儲(chǔ)無(wú)指針鍵值對(duì)的map進(jìn)行了優(yōu)化,即在GC掃描時(shí)不深入掃描map內(nèi)部數(shù)據(jù),只檢查map本身是否需要回收,這一優(yōu)化顯著提升了GC掃描的速度,從而減少了GC對(duì)程序性能的影響
    2024-10-10
  • Golang連接Redis數(shù)據(jù)庫(kù)的方法

    Golang連接Redis數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了Golang連接Redis數(shù)據(jù)庫(kù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • golang程序進(jìn)度條實(shí)現(xiàn)示例詳解

    golang程序進(jìn)度條實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了golang程序?qū)崿F(xiàn)進(jìn)度條示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • GO語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的目錄復(fù)制功能

    GO語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的目錄復(fù)制功能

    這篇文章主要介紹了GO語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的目錄復(fù)制功能,通過(guò)新建及復(fù)制內(nèi)容等操作最終實(shí)現(xiàn)復(fù)制目錄的功能效果,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • golang中字符串和數(shù)字轉(zhuǎn)換方法

    golang中字符串和數(shù)字轉(zhuǎn)換方法

    在Golang中,可以使用strconv包中的Itoa()和Atoi()函數(shù)進(jìn)行字符串與數(shù)字之間的轉(zhuǎn)換,Itoa()用于將數(shù)字轉(zhuǎn)換為字符串,Atoi()則用于將字符串轉(zhuǎn)換回?cái)?shù)字,本文介紹golang中字符串和數(shù)字轉(zhuǎn)換方法,感興趣的朋友一起看看吧
    2024-09-09
  • beego獲取ajax數(shù)據(jù)的實(shí)例

    beego獲取ajax數(shù)據(jù)的實(shí)例

    下面小編就為大家分享一篇beego獲取ajax數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Go?使用xorm操作mysql詳情

    Go?使用xorm操作mysql詳情

    這篇文章主要介紹了Go?使用xorm操作mysql詳情,golang?orm?庫(kù)?xorm?的使用和項(xiàng)目結(jié)構(gòu)。更多詳細(xì)neural,需要的小伙伴可以參考下面文章內(nèi)容
    2022-01-01
  • 詳解Golang中鏈表的創(chuàng)建和讀取

    詳解Golang中鏈表的創(chuàng)建和讀取

    這篇文章主要為大家詳細(xì)介紹了Golang中鏈表的創(chuàng)建和讀取的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起了解下
    2023-12-12

最新評(píng)論