小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
今天我们来带着大家实现用Zookeeper实现选举的案例,帮助大家更好的学习Zookeeper。
一、安装所需第三方库
使用Go来对Zookeeper进行操作需要使用go get github.com/samuel/go-zookeeper/zk。根据GitHub上有关它的描述它是一个Zookeeper客户端~
当然现在它的最新仓库地址是https://github.com/go-zookeeper/zk
你也可以下载这个仓库的第三方库。
二、定义配置信息和选举管理信息的结构体
type ZookeeperConfig struct {
Servers []string
RootPath string
MasterPath string
}
type ElectionManager struct {
ZKClinet *zk.Conn
ZkConfig *ZookeeperConfig
IsMaster chan bool
}
配置信息就是包含zookeeper集群服务器地址,根路径以及它的Master节点路径。
选举管理信息包括zookeeper的连接信息、zookeeper的配置信息、以及传递选举信息的管道。
三、程序主逻辑
func main() {
zkconfig := &ZookeeperConfig{
Servers: []string{"node01:2181", "node02:2181", "node03:2181"},
RootPath: "/test04",
MasterPath: "/master",
}
isMasterChan := make(chan bool)
electionManager := NewElectionManager(zkconfig, isMasterChan)
go electionManager.Run()
var isMaster bool
for {
select {
case isMaster = <-isMasterChan:
if isMaster {
fmt.Println("实现具体的业务逻辑")
}
}
}
}
这个zkconfig是填入咱们要使用的zookeeper集群配置信息,isMasterChan建立用于返回选取结果的信道,然后创建选举管理器,正如我们平时的选举有选举委员会一样,zookeeper的选举也需要选举管理器。然后开辟协程来进行选举:go electionManager.Run(),除了每次启动集群时会选举主节点之外,还需要监视主节点,如果主节点出问题了,需要立刻选举出一个新的主节点。下面的isMaster是判断是否是主节点,是通过信道的返回值来判断的。然后下面的for循环,就是不断从管道中读取选举结果,是否成功,如果成功表示集群可以正常运作了,就可以实现具体的业务逻辑了,如果没选举成功就只能一直等待了。