Zookeeper 三 代码测试

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...
>>>>>>>>>>>>>>>>>>>

 

好的,下面是一个简单的 ZooKeeper 心跳代码示例,使用 Java 实现: ```java import org.apache.zookeeper.*; import org.apache.zookeeper.data.Stat; import java.io.IOException; import java.util.concurrent.CountDownLatch; public class Heartbeat { private static final int SESSION_TIMEOUT = 5000; private static final String ZOOKEEPER_ADDRESS = "localhost:2181"; private static final String Z_NODE = "/heartbeats"; private ZooKeeper zooKeeper; private CountDownLatch latch; public Heartbeat() throws IOException, InterruptedException, KeeperException { latch = new CountDownLatch(1); zooKeeper = new ZooKeeper(ZOOKEEPER_ADDRESS, SESSION_TIMEOUT, new Watcher() { @Override public void process(WatchedEvent event) { if (event.getState() == Event.KeeperState.SyncConnected) { System.out.println("Connected to ZooKeeper"); latch.countDown(); } } }); latch.await(); createHeartbeatNode(); } private void createHeartbeatNode() throws KeeperException, InterruptedException { Stat stat = zooKeeper.exists(Z_NODE, false); if (stat == null) { zooKeeper.create(Z_NODE, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } sendHeartbeat(); } private void sendHeartbeat() throws KeeperException, InterruptedException { String zNode = zooKeeper.create(Z_NODE + "/heartbeat", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); System.out.println("Sent heartbeat to " + zNode); } public static void main(String[] args) throws IOException, InterruptedException, KeeperException { Heartbeat heartbeat = new Heartbeat(); while (true) { Thread.sleep(5000); heartbeat.sendHeartbeat(); } } } ``` 在上面的代码中,我们使用 ZooKeeper 的 Java API 进行心跳检测。我们首先连接到 ZooKeeper,然后创建一个 `/heartbeats` 节点,然后每隔 5 秒钟发送一个心跳到 `/heartbeats/heartbeat` 路径下。 在 `createHeartbeatNode()` 方法中,我们首先检查 `/heartbeats` 节点是否存在,如果不存在,则创建它。在 `sendHeartbeat()` 方法中,我们创建一个带有自增序列的临时节点 `/heartbeats/heartbeat`,每次发送心跳时都会创建一个新的节点。 请注意,这只是一个简单的示例代码,实际上,您可能需要更复杂的逻辑来处理心跳和节点失效等情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值