91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java如何操作Zookeeper

發布時間:2020-07-23 15:24:57 來源:億速云 閱讀:181 作者:小豬 欄目:編程語言

這篇文章主要為大家展示了Java如何操作Zookeeper,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

ZooKeeper 是一個典型的分布式數據一致性解決方案,分布式應用程序可以基于 ZooKeeper 實現諸如數據發布/訂閱、負載均衡、命名服務、分布式協調/通知、集群管理、Master 選舉、分布式鎖和分布式隊列等功能。

Zookeeper 一個最常用的使用場景就是用于擔任服務生產者和服務消費者的注冊中心。 服務生產者將自己提供的服務注冊到Zookeeper中心,服務的消費者在進行服務調用的時候先到Zookeeper中查找服務,獲取到服務生產者的詳細信息之后,再去調用服務生產者的內容與數據。如下圖所示,在 Dubbo架構中 Zookeeper 就擔任了注冊中心這一角色。

maven依賴

<dependency>
  <groupId>org.apache.zookeeper</groupId>
  <artifactId>zookeeper</artifactId>
  <version>3.6.0</version>
</dependency>

程序其它依賴:

<!-- Logger(log4j2) -->
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.11.2</version>
</dependency>
<!-- Log4j 1.x API Bridge -->
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-1.2-api</artifactId>
  <version>2.11.2</version>
</dependency>
<!-- SLF4J Bridge -->
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-slf4j-impl</artifactId>
  <version>2.11.2</version>
</dependency>

<dependency>
  <groupId>org.apache.zookeeper</groupId>
  <artifactId>zookeeper</artifactId>
  <version>3.6.0</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
  </exclusions>
</dependency>

API操作代碼:

package com.zhi.test;

import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.junit.jupiter.api.TestMethodOrder;

/**
 * Zookeeper操作測試
 * 
 * @author 張遠志
 * @since 2020年5月3日14:31:28
 *
 */
@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ZookeeperTest {
  private final Logger logger = LogManager.getLogger(this.getClass());
  private ZooKeeper zooKeeper;
  private final String path = "/test";

  @BeforeAll
  public void init() throws Exception {
    zooKeeper = new ZooKeeper("192.168.59.131:2181", 60000, new Watcher() {
      public void process(WatchedEvent event) {
        logger.info("事件類型:{},路徑:{}", event.getType(), event.getPath());
      }
    });
  }

  /**
   * 添加數據,當路徑已經存在時會報錯,初始版本號為0。第三個參數是權限控制。 <br>
   * 第四個參數,CreateMode:
   * <li>PERSISTENT:持久化保存
   * <li>PERSISTENT_SEQUENTIAL:持久化保存,并且路徑附加一個自動增長的序號
   * <li>EPHEMERAL:臨時數據,客戶端斷開連接時自動刪除數據(dubbo就是采用這種機制)
   * <li>EPHEMERAL_SEQUENTIAL:客戶端斷開連接時自動刪除數據,并且路徑會附加一個自動增長的序號
   * <li>CONTAINER:
   * <li>PERSISTENT_WITH_TTL:客戶端斷開連接時自動刪除數據,當節點在指定時間沒有被修改且沒有子目錄時,數據會被刪除
   * <li>PERSISTENT_SEQUENTIAL_WITH_TTL:客戶端斷開連接時自動刪除數據,路徑會附加一個自動增長的序號,且當節點在指定時間沒有被修改且沒有子目錄時,數據會被刪除
   */
  @Order(1)
  @Test
  public void create() {
    try {
      String back = zooKeeper.create(path, "這是一個測試".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
      logger.info("添加一條數據成功,實際路徑:{}", back);
    } catch (Exception e) {
      logger.error("調用create出錯", e);
    }
  }

  /**
   * 判斷路徑是否存在,不存在時返回null
   */
  @Order(2)
  @Test
  public void exists() {
    try {
      Stat stat = zooKeeper.exists(path, false);
      logger.info("路徑為{}的節點{}存在", path, stat == null &#63; "不" : "");
    } catch (Exception e) {
      logger.error("調用exists出錯", e);
    }
  }

  /**
   * 查詢數據,路徑不存在時會報錯
   */
  @Order(3)
  @Test
  public void find() {
    try {
      byte[] bits = zooKeeper.getData(path, false, new Stat()); // 路徑不存在時會報錯
      String data = new String(bits);
      logger.info("路徑{}查詢到數據:{}", path, data);
    } catch (Exception e) {
      logger.error("調用getData出錯", e);
    }
  }

  /**
   * 獲取子目錄,結果為空時返回一個長度為0的ArrayList
   */
  @Order(3)
  @Test
  public void children() {
    try {
      List<String> list = zooKeeper.getChildren(path, false);
      logger.info("路徑{}的子目錄有:{}", path, String.join("、", list.toArray(new String[0])));
    } catch (Exception e) {
      logger.error("調用getChildren出錯", e);
    }
  }

  /**
   * 修改數據,路徑不存在時會報錯,版本號與存儲中不一致時也報錯
   */
  @Order(4)
  @Test
  public void udpate() {
    try {
      Stat stat = zooKeeper.exists(path, false);
      if (stat != null) {
        stat = zooKeeper.setData(path, "這是一個修改測試".getBytes(), stat.getVersion()); // 版本號為-1時不做版本校驗
        logger.info("數據修改成功,原版本號:{},新版本號:{}", stat.getAversion(), stat.getVersion());
      }
    } catch (Exception e) {
      logger.error("調用setData出錯", e);
    }
  }

  /**
   * 刪除節點,路徑不存在時報錯,版本號不一致時也會報錯
   */
  @Order(5)
  @Test
  public void delete() {
    try {
      zooKeeper.delete(path, -1); // -1表示不做版本校驗
      logger.info("根據path刪除數據成功");
    } catch (Exception e) {
      logger.error("調用delete出錯", e);
    }
  }

  @AfterAll
  public void destory() throws Exception {
    if (zooKeeper != null) {
      zooKeeper.close();
    }
  }
}

以上就是關于Java如何操作Zookeeper的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

青浦区| 丹阳市| 沾益县| 会昌县| 察隅县| 留坝县| 日土县| 石屏县| 延庆县| 安溪县| 杭锦后旗| 海口市| 泰兴市| 广州市| 林口县| 巫溪县| 湄潭县| 封丘县| 临西县| 芜湖市| 彭州市| 象州县| 龙岩市| 花莲县| 库车县| 收藏| 松原市| 子洲县| 临高县| 葫芦岛市| 洛宁县| 彭泽县| 巴里| 乾安县| 岳普湖县| 当雄县| 横峰县| 财经| 建瓯市| 广安市| 桦甸市|