Go语言搬砖 操作zookeeper

「这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战」。

前言

zookeeper是一个开源高可用分布式数据管理和协调框架,得益于数据一致性,zookeeper在配置中心,服务高可用切换等场景广泛应用,非常知名的有hadoop,hbase,kafka,dubbo等

目前Go的zk库比较流行就是go-zookeeper, 官网: github.com/go-zookeepe…

特点

  • 支持增删改查等常规功能
  • 支持账密认证
  • 支持watch机制
  • 支持分布锁

安装

zookeeper使用docker极速安装既可,可以参考博主往期文章: juejin.cn/post/684490…

docker run -p 2181:2181 --name some-zookeeper --restart always -d zookeeper:3.5
复制代码

zk的ui管理有web版本,还有桌面版,web版的话也是使用docker安装既可 web版官网: github.com/DeemOpen/zk…

docker run --rm -p 9090:9090 -e ZK_SERVER=zookeeper:2181 juris/zkui
复制代码

桌面版直接下载既可,支持windows,mac等,面板非常漂亮,官网地址: github.com/vran-dev/Pr…

image.png

使用

初始化

写个方法将连接实例化并让变量接收,方便接下来的操作

简化err处理,避免代码冗余,写了个errPro方法统一处理错误

import (
   "fmt"
   "github.com/go-zookeeper/zk"
   "time"
)

var (
   c *zk.Conn
   err error
)

func errPro(err error) {
   if err != nil {
      panic(err)
   }
}

func initZK() {
   c, _, err = zk.Connect([]string{"ip:2181"}, time.Second*10)
   errPro(err)
}
复制代码

增删改查

c.Create创建节点: 第一个参数节点名称,第二个参数表名节点的数据,第三个参数是决定该节点的存活时间(ttl),0表示永久,除非删除,第四个参数需要的权限

节点存活还有其他三个选项: zk.FlagEphemeral(临时节点,程序退出自动清除),zk.FlagSequence(自带后缀的永久节点),zk.FlagEphemeral|zk.FlagSequence(自带后缀的临时节点,程序退出自动清除)

func curd() {

   path := "/go"
   //查询根节点下所有 子节点
   children, stat, _, err := c.ChildrenW("/")
   errPro(err)
   fmt.Printf("%+v %+v\n", children, stat)

   //创建节点
   create, err := c.Create(path, []byte("master"), 0, zk.WorldACL(zk.PermAll))
   errPro(err)
   fmt.Printf("create: %s\n", create)

   //获取节点数据
   get, sate, err := c.Get(path)
   errPro(err)
   fmt.Printf("get: %+v\n", string(get))

   //修改节点数据
   set, err := c.Set(path, []byte("work"), sate.Version)
   errPro(err)
   fmt.Printf("set: %+v \n", set)

   //删除节点
   exists, s, _ := c.Exists(path)
   if exists {
      err = c.Delete(path, s.Version)
      errPro(err)
      fmt.Println("删除数据成功")
   }
}
复制代码

watch机制

这里创建的是一个全局watch,会不间断监控节点变化。还有局部watch,只监听一次。

全局watch需要在初始化客户端时以option方式传进去,局部watch只需要在需求时调用ExistsW方法监控节点既可

func watch() {
   //watch回调函数
   option := zk.WithEventCallback(callback)
   conn, _, err2 := zk.Connect([]string{"ip:2181"}, time.Second*10, option)
   errPro(err2)
   _, _, _, err = conn.ExistsW("/go")
   errPro(err)
}
//回调函数执行的内容
func callback(event zk.Event) {
   fmt.Printf("path: %v,type: %v,state: %v\n", event.Path,event.Type.String(),event.State.String())
}
复制代码

主函数

func main() {
   initZK()
   go watch()
   curd()
}
复制代码

运行结果图

image.png

小结

演示了go-zookeeper的基本使用,该库用起来简单方便,目前没有场景在生产使用,先学起来储备。

Guess you like

Origin juejin.im/post/7034681575396605988