Golang 对Zookeeper的CRUD

var ServicesZk []string // 全局,保存可用的服务器Ip地址列表
func GetServer() (string, error) {
rand.Seed(time.Now().UnixNano())
sl := len(ServicesZk)
if sl == 0 {
return "", errors.New("错误:没有可用的服务IP")
}
return ServicesZk[rand.Intn(sl)], nil
}
func RegisterSvc() (error) {
log.Printf("Zk - 注册服务 -->\n")
CN, , err := zk.Connect([]string{"192.168.100.101:2181"}, time.Second) if err != nil { log.Printf("链接异常->%v\n", err) return err } // 注册 成功 后,关闭链接 // defer CN.Close() serverName := "/login_services" // 服务名【永久节点】 isExist, , _ := CN.Exists(serverName)
if !isExist {
CreateRes, Cerr := CN.Create(serverName, []byte(serverName), 0, []zk.ACL{{zk.PermAll, "world", "anyone"}})
if Cerr != nil {
log.Printf("创建出错了->%+v\n", Cerr)
return Cerr
}
log.Printf("创建结果->%+v\n", CreateRes)
}
// 服务IP【临时节点】
rand.Seed(time.Now().UnixNano())
ip := "10.0.0." + strconv.Itoa(rand.Intn(255))
ephRes, eErr := CN.Create(serverName+"/"+ip+":8080", nil, zk.FlagEphemeral, []zk.ACL{{zk.PermAll, "world", "anyone"}})
if eErr != nil {
log.Printf("eph 错误->%v\n", eErr)
return eErr
}
log.Printf("eph -> %+v\n", ephRes) return nil
}
func WatchSvc() (error) {
log.Printf("ZK Watch 工作了…")
CN, _, err := zk.Connect([]string{"192.168.100.101:2181"}, time.Minute)
if err != nil {
log.Printf("链接异常->%v\n", err)
return err
}
serverName := "/login_services"
// 监听事件 -- 每次发生事件之后就会有相应的通知过来
go func() {
for true {
children, stat, ev, err := CN.ChildrenW(serverName)
if err != nil {
log.Printf("Zk 出错 ChildrenW -->%v\n", err)
time.Sleep(time.Second * 3)
}
ServicesZk = children
s := <-ev log.Printf("事件发生-->%+v --> %+v\n", s, stat)
}
}()
return nil
}