在 golang 裏使用 ZooKeeper,如何使用

在 Go 語言中使用 ZooKeeper,可以藉助第三方庫go-zookeeper

下面介紹如何安裝和使用這個庫與 ZooKeeper 進行交互。

安裝 go-zookeeper

首先,需要安裝go-zookeeper庫。使用go get命令來安裝:

go get github.com/samuel/go-zookeeper/zk

使用 ZooKeeper 的基本示例

以下是一個簡單的示例,包括連接 ZooKeeper 服務器、創建節點、獲取節點數據以及刪除節點等基本操作。

package main

import (
    "fmt"
    "log"
    "time"

    "github.com/samuel/go-zookeeper/zk"
)

func main() {
    // 連接到ZooKeeper服務器
    servers := []string{"127.0.0.1:2181"}
    conn, _, err := zk.Connect(servers, time.Second*5)
    if err != nil {
        log.Fatalf("Failed to connect to ZooKeeper: %v", err)
    }
    defer conn.Close()

    // 創建節點
    path := "/example"
    data := []byte("hello, world")
    flags := int32(0)
    acls := zk.WorldACL(zk.PermAll)
    createdPath, err := conn.Create(path, data, flags, acls)
    if err != nil {
        log.Fatalf("Failed to create node: %v", err)
    }
    fmt.Printf("Created node: %s\n", createdPath)

    // 獲取節點數據
    exists, stat, err := conn.Exists(path)
    if err != nil {
        log.Fatalf("Failed to check if node exists: %v", err)
    }
    if exists {
        fmt.Printf("Node %s exists, version: %d\n", path, stat.Version)

        nodeData, stat, err := conn.Get(path)
        if err != nil {
            log.Fatalf("Failed to get node data: %v", err)
        }
        fmt.Printf("Node data: %s, version: %d\n", string(nodeData), stat.Version)
    } else {
        fmt.Printf("Node %s does not exist\n", path)
    }

    // 設置節點數據
    newData := []byte("new data")
    _, err = conn.Set(path, newData, stat.Version)
    if err != nil {
        log.Fatalf("Failed to set node data: %v", err)
    }
    fmt.Printf("Set node %s data to: %s\n", path, string(newData))

    // 獲取更新後的節點數據
    updatedData, stat, err := conn.Get(path)
    if err != nil {
        log.Fatalf("Failed to get updated node data: %v", err)
    }
    fmt.Printf("Updated node data: %s, version: %d\n", string(updatedData), stat.Version)

    // 刪除節點
    err = conn.Delete(path, stat.Version)
    if err != nil {
        log.Fatalf("Failed to delete node: %v", err)
    }
    fmt.Printf("Deleted node: %s\n", path)
}

代碼分析

1 連接到 ZooKeeper 服務器

servers := []string{"127.0.0.1:2181"}
conn, _, err := zk.Connect(servers, time.Second*5)
if err != nil {
    log.Fatalf("Failed to connect to ZooKeeper: %v", err)
}
defer conn.Close()

使用zk.Connect連接到 ZooKeeper 服務器,連接超時時間設置爲 5 秒。連接成功後,需要在程序結束時關閉連接。

2 創建節點

path := "/example"
data := []byte("hello, world")
flags := int32(0)
acls := zk.WorldACL(zk.PermAll)
createdPath, err := conn.Create(path, data, flags, acls)
if err != nil {
    log.Fatalf("Failed to create node: %v", err)
}
fmt.Printf("Created node: %s\n", createdPath)

使用conn.Create創建節點,指定節點路徑、數據、標誌和訪問控制列表(ACL)。

3 檢查節點是否存在

exists, stat, err := conn.Exists(path)
if err != nil {
    log.Fatalf("Failed to check if node exists: %v", err)
}
if exists {
    fmt.Printf("Node %s exists, version: %d\n", path, stat.Version)
} else {
    fmt.Printf("Node %s does not exist\n", path)
}

使用conn.Exists檢查節點是否存在,返回節點狀態信息。

4 獲取節點數據

nodeData, stat, err := conn.Get(path)
if err != nil {
    log.Fatalf("Failed to get node data: %v", err)
}
fmt.Printf("Node data: %s, version: %d\n", string(nodeData), stat.Version)

使用conn.Get獲取節點數據和狀態信息。

5 設置節點數據

newData := []byte("new data")
_, err = conn.Set(path, newData, stat.Version)
if err != nil {
    log.Fatalf("Failed to set node data: %v", err)
}
fmt.Printf("Set node %s data to: %s\n", path, string(newData))

使用conn.Set設置節點數據,傳遞節點路徑、新數據和版本信息。

6 刪除節點

err = conn.Delete(path, stat.Version)
if err != nil {
    log.Fatalf("Failed to delete node: %v", err)
}
fmt.Printf("Deleted node: %s\n", path)

使用conn.Delete刪除節點,傳遞節點路徑和版本信息。

總結

通過上述代碼示例,展示瞭如何在 Go 語言中使用go-zookeeper庫與 ZooKeeper 進行交互,包括連接服務器、創建節點、獲取和設置節點數據以及刪除節點等基本操作。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/6UhOq4wGsmiaBhhPAbahaw