最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java操作Zookeeper原理及過程詳解

 更新時間:2020年05月19日 08:34:37   作者:玄同太子  
這篇文章主要介紹了Java操作Zookeeper原理及過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

ZooKeeper 是一個典型的分布式數(shù)據(jù)一致性解決方案,分布式應(yīng)用程序可以基于 ZooKeeper 實現(xiàn)諸如數(shù)據(jù)發(fā)布/訂閱、負載均衡、命名服務(wù)、分布式協(xié)調(diào)/通知、集群管理、Master 選舉、分布式鎖和分布式隊列等功能。

Zookeeper 一個最常用的使用場景就是用于擔任服務(wù)生產(chǎn)者和服務(wù)消費者的注冊中心。 服務(wù)生產(chǎn)者將自己提供的服務(wù)注冊到Zookeeper中心,服務(wù)的消費者在進行服務(wù)調(diào)用的時候先到Zookeeper中查找服務(wù),獲取到服務(wù)生產(chǎn)者的詳細信息之后,再去調(diào)用服務(wù)生產(chǎn)者的內(nèi)容與數(shù)據(jù)。如下圖所示,在 Dubbo架構(gòu)中 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());
      }
    });
  }

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

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

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

  /**
   * 獲取子目錄,結(jié)果為空時返回一個長度為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("調(diào)用getChildren出錯", e);
    }
  }

  /**
   * 修改數(shù)據(jù),路徑不存在時會報錯,版本號與存儲中不一致時也報錯
   */
  @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("數(shù)據(jù)修改成功,原版本號:{},新版本號:{}", stat.getAversion(), stat.getVersion());
      }
    } catch (Exception e) {
      logger.error("調(diào)用setData出錯", e);
    }
  }

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

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java?Spring的兩種事務(wù)你知道嗎

    Java?Spring的兩種事務(wù)你知道嗎

    這篇文章主要為大家詳細介紹了Java?Spring的兩種事務(wù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • javaweb中ajax請求后臺servlet(實例)

    javaweb中ajax請求后臺servlet(實例)

    下面小編就為大家?guī)硪黄猨avaweb中ajax請求后臺servlet(實例)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java四種元注解介紹

    Java四種元注解介紹

    元注解是用來修飾注解的注解,在java.lang.annotation包下,當我們需要自己定義一個注解去做某些事情的時候,我們要對該注解進行一些限制,確保我們注解的作用域,這篇文章主要介紹了Java四種元注解介紹,需要的朋友可以參考下
    2024-08-08
  • SpringMVC中的Model對象用法說明

    SpringMVC中的Model對象用法說明

    這篇文章主要介紹了SpringMVC中的Model對象用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之二叉樹

    帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之二叉樹

    這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之二叉樹,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • java判斷ip是否為指定網(wǎng)段示例

    java判斷ip是否為指定網(wǎng)段示例

    這篇文章主要介紹了java判斷ip是否為指定網(wǎng)段示例方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • MyBatis攔截器原理探究

    MyBatis攔截器原理探究

    MyBatis提供了一種插件(plugin)的功能,雖然叫做插件,但其實這是攔截器功能.這篇文章主要介紹了MyBatis攔截器原理探究,需要的朋友可以參考下
    2018-02-02
  • Mybatis攔截器實現(xiàn)一種百萬級輕量分表方案

    Mybatis攔截器實現(xiàn)一種百萬級輕量分表方案

    這篇文章主要介紹了Mybatis攔截器實現(xiàn)一種百萬級輕量分表方案,需要的朋友可以參考下
    2024-02-02
  • Spring中@Value注解的使用方法詳解

    Spring中@Value注解的使用方法詳解

    這篇文章主要介紹了Spring中@Value注解的使用方法詳解,在spring項目中必不可少的就是讀取配置文件,那么讀取配置文件就有兩種方式,一種就是使用Spring中@Value注解,還有一種是使用SpringBoot中的@ConfigurationProperties注解,需要的朋友可以參考下
    2024-01-01
  • struts2自定義攔截器的示例代碼

    struts2自定義攔截器的示例代碼

    本篇文章主要介紹了struts2自定義攔截器的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08

最新評論

新乡县| 龙江县| 泸溪县| 铜山县| 巩义市| 宝坻区| 宁南县| 瑞丽市| 台南市| 铁力市| 张家港市| 合川市| 吴旗县| 长治市| 乌鲁木齐市| 宁南县| 乌鲁木齐县| 商洛市| 北碚区| 铜陵市| 建宁县| 陵川县| 会泽县| 那坡县| 榆中县| 吉安市| 阿拉善盟| 平安县| 凤翔县| 临澧县| 洪洞县| 盈江县| 泰来县| 易门县| 唐海县| 怀柔区| 泸定县| 忻州市| 会昌县| 新宁县| 庆城县|