golang 代码测试:
使用:
"gozookeeper/internal"
package internal
import (
"fmt"
"github.com/samuel/go-zookeeper/zk"
"time"
)
type ZkUtil struct {
conn *zk.Conn
}
func (zkUtil *ZkUtil) Init(services []string) {
zkUtil.conn = zkUtil.getZkConn(services)
}
func (zkUtil *ZkUtil) getZkConn(services []string) (conn *zk.Conn) {
conn, _, err := zk.Connect(services, time.Second*5)
if err != nil {
panic(err)
}
return conn
}
func (zkUtil *ZkUtil) Close() {
zkUtil.conn.Close()
}
func (zkUtil *ZkUtil) ZkCreate(path string, data string, flags int32) (string, error) {
// flags 有四种取值
// 0 :永久,除非手动删除
// zk.FlagEphemeral 1 短暂,session断开则改节点也被删除
// zk.FlagSequence 2 会自动在节点后面添加序号
// 3:Ephemeral 和 Sequence 即,短暂且自动添加序号
// 访问控制模式
var acls = zk.WorldACL(zk.PermAdmin)
return zkUtil.conn.Create(path, []byte(data), flags, acls)
}
func (zkUtil *ZkUtil) ZkGet(path string) ([]byte, *zk.Stat, error) {
return zkUtil.conn.Get(path)
}
func (zkUtil *ZkUtil) ZkExists(path string) (bool, *zk.Stat, error) {
return zkUtil.conn.Exists(path)
}
func (zkUtil *ZkUtil) ZkUpdate(path string, newData string) (*zk.Stat, error) {
_, s, err := zkUtil.ZkGet(path)
if err != nil {
return nil, err
}
return zkUtil.conn.Set(path, []byte(newData), s.Version)
}
func (zkUtil *ZkUtil) ZkDelete(path string) error {
_, s, err := zkUtil.ZkGet(path)
if err != nil {
return err
}
return zkUtil.conn.Delete(path, s.Version)
}
func ZkStateStringFormat(s *zk.Stat) string {
return fmt.Sprintf("Czxid:%d\nMzxid: %d\nCtime: %d\nMtime: %d\nVersion: %d\nCversion: %d\nAversion: %d\nEphemeralOwner: %d\nDataLength: %d\nNumChildren: %d\nPzxid: %d\n",
s.Czxid, s.Mzxid, s.Ctime, s.Mtime, s.Version, s.Cversion, s.Aversion, s.EphemeralOwner, s.DataLength, s.NumChildren, s.Pzxid)
}
Test:
package main
import (
"fmt"
"gozookeeper/internal"
)
func main() {
fmt.Println("Start...")
Test()
fmt.Println("Stop...")
}
func Test() {
var hosts = []string{"192.168.170.137:2181"}
zkUtil := internal.ZkUtil{}
zkUtil.Init(hosts)
defer zkUtil.Close()
path := "/zk_test_go"
data := "hello"
p, create_err := zkUtil.ZkCreate(path, data, 0)
if create_err != nil {
fmt.Println(create_err)
return
}
fmt.Println("created:", p)
// get
v, s, err := zkUtil.ZkGet(path)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("value of path[%s]=[%s].\n", path, v)
fmt.Printf("state:\n")
fmt.Printf("%s\n", internal.ZkStateStringFormat(s))
// exist
exist, s, err := zkUtil.ZkExists(path)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("path[%s] exist[%t]\n", path, exist)
fmt.Printf("state:\n")
fmt.Printf("%s\n", internal.ZkStateStringFormat(s))
// update
new_data := "zk_test_new_value"
s, err = zkUtil.ZkUpdate(path, new_data)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("update state:\n")
fmt.Printf("%s\n", internal.ZkStateStringFormat(s))
// get
v, s, err = zkUtil.ZkGet(path)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("new value of path[%s]=[%s].\n", path, v)
fmt.Printf("state:\n")
fmt.Printf("%s\n", internal.ZkStateStringFormat(s))
// delete
err = zkUtil.ZkDelete(path)
if err != nil {
fmt.Println(err)
return
}
// check exist
exist, s, err = zkUtil.ZkExists(path)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("after delete, path[%s] exist[%t]\n", path, exist)
fmt.Printf("state:\n")
fmt.Printf("%s\n", internal.ZkStateStringFormat(s))
}
result:
Start...
2020/04/02 22:33:50 Connected to 192.168.170.137:2181
2020/04/02 22:33:50 authenticated: id=103929352250458113, timeout=5000
2020/04/02 22:33:50 re-submitting `0` credentials after reconnect
created: /zk_test_go
value of path[/zk_test_go]=[hello].
state:
Czxid:55
Mzxid: 55
Ctime: 1585838030738
Mtime: 1585838030738
Version: 0
Cversion: 0
Aversion: 0
EphemeralOwner: 0
DataLength: 5
NumChildren: 0
Pzxid: 55
path[/zk_test_go] exist[true]
state:
Czxid:55
Mzxid: 55
Ctime: 1585838030738
Mtime: 1585838030738
Version: 0
Cversion: 0
Aversion: 0
EphemeralOwner: 0
DataLength: 5
NumChildren: 0
Pzxid: 55
update state:
Czxid:55
Mzxid: 56
Ctime: 1585838030738
Mtime: 1585838030744
Version: 1
Cversion: 0
Aversion: 0
EphemeralOwner: 0
DataLength: 17
NumChildren: 0
Pzxid: 55
new value of path[/zk_test_go]=[zk_test_new_value].
state:
Czxid:55
Mzxid: 56
Ctime: 1585838030738
Mtime: 1585838030744
Version: 1
Cversion: 0
Aversion: 0
EphemeralOwner: 0
DataLength: 17
NumChildren: 0
Pzxid: 55
after delete, path[/zk_test_go] exist[false]
state:
Czxid:0
Mzxid: 0
Ctime: 0
Mtime: 0
Version: 0
Cversion: 0
Aversion: 0
EphemeralOwner: 0
DataLength: 0
NumChildren: 0
Pzxid: 0
WatchTest:
func WatchTest() {
var hosts = []string{"192.168.170.137:2181"}
option := zk.WithEventCallback(callback)
conn, _, err := zk.Connect(hosts, time.Second*5, option)
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
var path1 = "/zk_test_go1"
var data1 = []byte("zk_test_go1_data1")
exist, s, _, err := conn.ExistsW(path1)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("path[%s] exist[%t]\n", path1, exist)
fmt.Printf("state:\n")
fmt.Printf("%s\n", internal.ZkStateStringFormat(s))
// try create
var acls = zk.WorldACL(zk.PermAll)
p, err_create := conn.Create(path1, data1, zk.FlagEphemeral, acls)
if err_create != nil {
fmt.Println(err_create)
return
}
fmt.Printf("created path[%s]\n", p)
time.Sleep(time.Second * 2)
exist, s, _, err = conn.ExistsW(path1)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("path[%s] exist[%t] after create\n", path1, exist)
fmt.Printf("state:\n")
fmt.Printf("%s\n", internal.ZkStateStringFormat(s))
// delete
conn.Delete(path1, s.Version)
exist, s, _, err = conn.ExistsW(path1)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("path[%s] exist[%t] after delete\n", path1, exist)
fmt.Printf("state:\n")
fmt.Printf("%s\n", internal.ZkStateStringFormat(s))
}
result:
Start...
>>>>>>>>>>>>>>>>>>>
path:
type: EventSession
state: StateConnecting
<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>
path:
type: EventSession
state: StateConnected
<<<<<<<<<<<<<<<<<<<
2020/04/02 23:36:07 Connected to 192.168.170.137:2181
>>>>>>>>>>>>>>>>>>>
path:
type: EventSession
state: StateHasSession
<<<<<<<<<<<<<<<<<<<
2020/04/02 23:36:07 authenticated: id=103929352250458114, timeout=5000
2020/04/02 23:36:07 re-submitting `0` credentials after reconnect
path[/zk_test_go1] exist[false]
state:
Czxid:0
Mzxid: 0
Ctime: 0
Mtime: 0
Version: 0
Cversion: 0
Aversion: 0
EphemeralOwner: 0
DataLength: 0
NumChildren: 0
Pzxid: 0
>>>>>>>>>>>>>>>>>>>
path: /zk_test_go1
type: EventNodeCreated
state: unknown state
<<<<<<<<<<<<<<<<<<<
created path[/zk_test_go1]
path[/zk_test_go1] exist[true] after create
state:
Czxid:60
Mzxid: 60
Ctime: 1585841767450
Mtime: 1585841767450
Version: 0
Cversion: 0
Aversion: 0
EphemeralOwner: 103929352250458114
DataLength: 17
NumChildren: 0
Pzxid: 60
>>>>>>>>>>>>>>>>>>>
path: /zk_test_go1
type: EventNodeDeleted
state: unknown state
<<<<<<<<<<<<<<<<<<<
path[/zk_test_go1] exist[false] after delete
state:
Czxid:0
Mzxid: 0
Ctime: 0
Mtime: 0
Version: 0
Cversion: 0
Aversion: 0
EphemeralOwner: 0
DataLength: 0
NumChildren: 0
Pzxid: 0
2020/04/02 23:36:09 recv loop terminated: err=EOF
2020/04/02 23:36:09 send loop terminated: err=<nil>
Stop...
>>>>>>>>>>>>>>>>>>>