最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用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

心跳程序

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

package main

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

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

	// 啟動(dòng)客戶端
	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)讀取客戶端發(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)文章

  • 這些關(guān)于Go中interface{}的注意事項(xiàng)你都了解嗎

    這些關(guān)于Go中interface{}的注意事項(xiàng)你都了解嗎

    這篇文章主要為大家詳細(xì)介紹了學(xué)習(xí)Go語(yǔ)言時(shí)需要了解的interface{}注意事項(xiàng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-03-03
  • go實(shí)現(xiàn)redigo的簡(jiǎn)單操作

    go實(shí)現(xiàn)redigo的簡(jiǎn)單操作

    golang操作redis主要有兩個(gè)庫(kù),go-redis和redigo,今天我們就一起來(lái)介紹一下redigo的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2018-07-07
  • 深度剖析golang中的sync包

    深度剖析golang中的sync包

    go語(yǔ)言的sync包提供了多種并發(fā)控制工具,如Mutex、RWMutex、WaitGroup、Once、Cond和Map等,用于保護(hù)共享資源和協(xié)調(diào)多個(gè)goroutine的執(zhí)行,這些工具的原理和使用方法在文中都有詳細(xì)介紹,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • GoLand 中設(shè)置默認(rèn)項(xiàng)目文件夾的實(shí)現(xiàn)

    GoLand 中設(shè)置默認(rèn)項(xiàng)目文件夾的實(shí)現(xiàn)

    本文主要介紹了GoLand 中設(shè)置默認(rèn)項(xiàng)目文件夾的實(shí)現(xiàn),默認(rèn)項(xiàng)目文件夾會(huì)在你打開(kāi)或新建項(xiàng)目時(shí)自動(dòng)預(yù)選,避免每次都需要手動(dòng)導(dǎo)航到目標(biāo)目錄,感興趣的可以了解一下
    2025-03-03
  • pytorch中的transforms.ToTensor和transforms.Normalize的實(shí)現(xiàn)

    pytorch中的transforms.ToTensor和transforms.Normalize的實(shí)現(xiàn)

    本文主要介紹了pytorch中的transforms.ToTensor和transforms.Normalize的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Golang Http請(qǐng)求返回結(jié)果處理

    Golang Http請(qǐng)求返回結(jié)果處理

    本文主要介紹了Golang Http請(qǐng)求返回結(jié)果處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Go中標(biāo)準(zhǔn)庫(kù)fmt包的使用小結(jié)

    Go中標(biāo)準(zhǔn)庫(kù)fmt包的使用小結(jié)

    fmt包是Go語(yǔ)言處理輸入輸出的核心庫(kù),提供Print/Scan系列函數(shù)及多樣格式化動(dòng)詞(如%v、%d、%s等),支持字符串格式化、掃描、自定義輸出格式及錯(cuò)誤處理,廣泛用于數(shù)據(jù)格式化與輸出控制,下面就來(lái)詳細(xì)的介紹一下
    2025-09-09
  • go 協(xié)程返回值處理操作

    go 協(xié)程返回值處理操作

    這篇文章主要介紹了go 協(xié)程返回值處理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Golang并發(fā)繞不開(kāi)的重要組件之Goroutine詳解

    Golang并發(fā)繞不開(kāi)的重要組件之Goroutine詳解

    Goroutine、Channel、Context、Sync都是Golang并發(fā)編程中的幾個(gè)重要組件,這篇文中主要為大家介紹了Goroutine的相關(guān)知識(shí),需要的可以參考一下
    2023-06-06
  • Go語(yǔ)言中reflect.DeepEqual函數(shù)的具體使用

    Go語(yǔ)言中reflect.DeepEqual函數(shù)的具體使用

    本文主要介紹了Go語(yǔ)言中reflect.DeepEqual函數(shù)的具體使用,reflect.DeepEqual()函數(shù)是用來(lái)比較兩個(gè)值是否相等的方法,下面就來(lái)介紹一下,感興趣的可以了解一下
    2024-08-08

最新評(píng)論

尼木县| 镇原县| 社会| 邢台县| 苏尼特右旗| 大足县| 扶沟县| 海原县| 中卫市| 资中县| 奇台县| 高雄县| 郓城县| 平罗县| 孟津县| 黄石市| 胶州市| 玉山县| 古丈县| 马尔康县| 清水县| 申扎县| 宝丰县| 山丹县| 龙山县| 临安市| 瑞安市| 阿瓦提县| 梅州市| 博爱县| 承德县| 宁夏| 焦作市| 隆尧县| 长宁县| 醴陵市| 霍林郭勒市| 阜南县| 元氏县| 上犹县| 潼关县|