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)
}
本文介绍ZooKeeper在服务注册监听和集中配置中心的应用,以及zkutils工具模块中KeepWatcher类如何实现对节点变化的无限循环监听。通过示例代码展示了如何监听子节点列表和节点数据的变化。

8400

被折叠的 条评论
为什么被折叠?



