Go語言:zkutils模塊實現對zookeeper節點的無限循環監聽

zookeeper(zk)有兩個重要的應用場景,一是用於服務的註冊與監聽,服務消費方需要保持對服務節點列表的持續監聽;二是用於集羣的集中配置中心,應用服務如果需要支持動態可配的話則需要保持對節點內容的持續監聽。

zkutils是面向go-zookeeper的工具模塊。KeepWatcher類實現了對節點的無限循環監聽,包括兩個方法:

1)當path下的節點發生變化時,監聽函數listener會被調用,傳入參數是子節點名稱數組和error。

WatchChildren(path string, listener func(children []string, err error)) 

 2)當path的存儲數據發生變化時,監聽函數listener會被調用,傳入參數是新的數據和error。

WatchData(path string, listener func(data []byte, err error))

 使用示例:

package main

import (
	"fmt"
	"github.com/pochard/zkutils"
	"github.com/samuel/go-zookeeper/zk"
	"net/http"
	"strings"
	"time"
)

func handler(w http.ResponseWriter, r *http.Request) {
}

func main() {
	var hosts = []string{"localhost:2181"}
	conn, _, _ := zk.Connect(hosts, time.Second*5)
	defer conn.Close()

	path := "/hades/services/main/cms"
	keepWatcher := zkutils.NewKeepWatcher(conn)
	go keepWatcher.WatchChildren(path, func(children []string, err error) {
		if err != nil {
			fmt.Println(err)
			return
		}
		fmt.Printf("%s\n", strings.Join(children, ","))
	})

	path = "/hades/configs/main/cms/config"
	go keepWatcher.WatchData(path, func(data []byte, err error) {
		if err != nil {
			fmt.Println(err)
			return
		}
		fmt.Printf("%s\n", string(data))
	})

	http.HandleFunc("/", handler)
	http.ListenAndServe(":8081", nil)
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章