我的超细!细说Zookeeper选举的一个案例(二)

403 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一、创建选举管理器

func NewElectionManager(zkConfig *ZookeeperConfig, isMaster chan bool) *ElectionManager {
   electionManager := &ElectionManager{
      nil,
      zkConfig,
      isMaster,
   }
​
   electionManager.initConnection()
​
   return electionManager
}

创建选举管理器比较简单,就是输入一些配置信息,来初始化连接,然后将初始化后的选举管理器传递出去。

二、初始化Zookeeper连接

在创建选举管理器中用到了初始化Zookeeper连接的方法,实现如下:

func (electionManager *ElectionManager) initConnection() error {
   if !electionManager.isConnected() {
      conn, connChan, err := zk.Connect(electionManager.ZKConfig.Servers, time.Second*5)
      if err != nil {
         return err
      }
      for {
         isConnected := false
         select {
         case connEvcent := <-connChan:
            if connEvcent.State == zk.StateConnected {
               isConnected = true
               fmt.Println("zk连接成功")
            }
         case _ = <-time.After(time.Second * 3):
            return errors.New("zk连接超时!")
         }
         if isConnected {
            break
         }
      }
      electionManager.ZKClientConn = conn
   }
   return nil
}

先是判断是否已经连接Zookeeper,如果连接有问题,或者没有连接的情况下就进行连接zookeeper。

下面来介绍这个zk.Connect,这个Connect 用于建立到 Zookeeper 服务器池的新连接。第一个参数是服务器集群地址,第二个参数是在失去与服务器的连接后当前会话仍被视为有效的时间量。 在会话超时之前,可以重新建立到不同服务器的连接并保持相同的会话。 这样可以维护和监控任何临时节点。

然后就是进入循环,不断去connChan中取东西,当connChan是zk.StateConnected时,表示连接成功,就给isConnected赋值为true,如果3秒都未成功,则报错连接超时。当连接成功时跳出这个for循环,electionManager.ZKClientConn = conn表示将获得的连接给选举管理器的连接。

欢迎大家前往下一部分~