真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java如何操作Zookeeper

這篇文章主要為大家展示了Java如何操作Zookeeper,內(nèi)容簡(jiǎn)而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會(huì)有收獲的,下面讓小編帶大家一起來(lái)看看吧。

創(chuàng)新互聯(lián)公司基于成都重慶香港及美國(guó)等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動(dòng)大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)服務(wù)器托管報(bào)價(jià),主機(jī)托管價(jià)格性價(jià)比高,為金融證券行業(yè)溫江服務(wù)器租用,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專業(yè)成都idc公司。

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

Zookeeper 一個(gè)最常用的使用場(chǎng)景就是用于擔(dān)任服務(wù)生產(chǎn)者和服務(wù)消費(fèi)者的注冊(cè)中心。 服務(wù)生產(chǎn)者將自己提供的服務(wù)注冊(cè)到Zookeeper中心,服務(wù)的消費(fèi)者在進(jìn)行服務(wù)調(diào)用的時(shí)候先到Zookeeper中查找服務(wù),獲取到服務(wù)生產(chǎn)者的詳細(xì)信息之后,再去調(diào)用服務(wù)生產(chǎn)者的內(nèi)容與數(shù)據(jù)。如下圖所示,在 Dubbo架構(gòu)中 Zookeeper 就擔(dān)任了注冊(cè)中心這一角色。

maven依賴


  org.apache.zookeeper
  zookeeper
  3.6.0

程序其它依賴:



  org.apache.logging.log4j
  log4j-core
  2.11.2



  org.apache.logging.log4j
  log4j-1.2-api
  2.11.2



  org.apache.logging.log4j
  log4j-slf4j-impl
  2.11.2



  org.apache.zookeeper
  zookeeper
  3.6.0
  
    
      org.slf4j
      slf4j-log4j12
    
  

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操作測(cè)試
 * 
 * @author 張遠(yuǎn)志
 * @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ù),當(dāng)路徑已經(jīng)存在時(shí)會(huì)報(bào)錯(cuò),初始版本號(hào)為0。第三個(gè)參數(shù)是權(quán)限控制。 
* 第四個(gè)參數(shù),CreateMode: *
  • PERSISTENT:持久化保存 *
  • PERSISTENT_SEQUENTIAL:持久化保存,并且路徑附加一個(gè)自動(dòng)增長(zhǎng)的序號(hào) *
  • EPHEMERAL:臨時(shí)數(shù)據(jù),客戶端斷開(kāi)連接時(shí)自動(dòng)刪除數(shù)據(jù)(dubbo就是采用這種機(jī)制) *
  • EPHEMERAL_SEQUENTIAL:客戶端斷開(kāi)連接時(shí)自動(dòng)刪除數(shù)據(jù),并且路徑會(huì)附加一個(gè)自動(dòng)增長(zhǎng)的序號(hào) *
  • CONTAINER: *
  • PERSISTENT_WITH_TTL:客戶端斷開(kāi)連接時(shí)自動(dòng)刪除數(shù)據(jù),當(dāng)節(jié)點(diǎn)在指定時(shí)間沒(méi)有被修改且沒(méi)有子目錄時(shí),數(shù)據(jù)會(huì)被刪除 *
  • PERSISTENT_SEQUENTIAL_WITH_TTL:客戶端斷開(kāi)連接時(shí)自動(dòng)刪除數(shù)據(jù),路徑會(huì)附加一個(gè)自動(dòng)增長(zhǎng)的序號(hào),且當(dāng)節(jié)點(diǎn)在指定時(shí)間沒(méi)有被修改且沒(méi)有子目錄時(shí),數(shù)據(jù)會(huì)被刪除 */ @Order(1) @Test public void create() { try { String back = zooKeeper.create(path, "這是一個(gè)測(cè)試".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); logger.info("添加一條數(shù)據(jù)成功,實(shí)際路徑:{}", back); } catch (Exception e) { logger.error("調(diào)用create出錯(cuò)", e); } } /** * 判斷路徑是否存在,不存在時(shí)返回null */ @Order(2) @Test public void exists() { try { Stat stat = zooKeeper.exists(path, false); logger.info("路徑為{}的節(jié)點(diǎn){}存在", path, stat == null ? "不" : ""); } catch (Exception e) { logger.error("調(diào)用exists出錯(cuò)", e); } } /** * 查詢數(shù)據(jù),路徑不存在時(shí)會(huì)報(bào)錯(cuò) */ @Order(3) @Test public void find() { try { byte[] bits = zooKeeper.getData(path, false, new Stat()); // 路徑不存在時(shí)會(huì)報(bào)錯(cuò) String data = new String(bits); logger.info("路徑{}查詢到數(shù)據(jù):{}", path, data); } catch (Exception e) { logger.error("調(diào)用getData出錯(cuò)", e); } } /** * 獲取子目錄,結(jié)果為空時(shí)返回一個(gè)長(zhǎng)度為0的ArrayList */ @Order(3) @Test public void children() { try { List list = zooKeeper.getChildren(path, false); logger.info("路徑{}的子目錄有:{}", path, String.join("、", list.toArray(new String[0]))); } catch (Exception e) { logger.error("調(diào)用getChildren出錯(cuò)", e); } } /** * 修改數(shù)據(jù),路徑不存在時(shí)會(huì)報(bào)錯(cuò),版本號(hào)與存儲(chǔ)中不一致時(shí)也報(bào)錯(cuò) */ @Order(4) @Test public void udpate() { try { Stat stat = zooKeeper.exists(path, false); if (stat != null) { stat = zooKeeper.setData(path, "這是一個(gè)修改測(cè)試".getBytes(), stat.getVersion()); // 版本號(hào)為-1時(shí)不做版本校驗(yàn) logger.info("數(shù)據(jù)修改成功,原版本號(hào):{},新版本號(hào):{}", stat.getAversion(), stat.getVersion()); } } catch (Exception e) { logger.error("調(diào)用setData出錯(cuò)", e); } } /** * 刪除節(jié)點(diǎn),路徑不存在時(shí)報(bào)錯(cuò),版本號(hào)不一致時(shí)也會(huì)報(bào)錯(cuò) */ @Order(5) @Test public void delete() { try { zooKeeper.delete(path, -1); // -1表示不做版本校驗(yàn) logger.info("根據(jù)path刪除數(shù)據(jù)成功"); } catch (Exception e) { logger.error("調(diào)用delete出錯(cuò)", e); } } @AfterAll public void destory() throws Exception { if (zooKeeper != null) { zooKeeper.close(); } } }
  • 以上就是關(guān)于Java如何操作Zookeeper的內(nèi)容,如果你們有學(xué)習(xí)到知識(shí)或者技能,可以把它分享出去讓更多的人看到。


    新聞名稱:Java如何操作Zookeeper
    本文鏈接:http://weahome.cn/article/pchghd.html

    其他資訊

    在線咨詢

    微信咨詢

    電話咨詢

    028-86922220(工作日)

    18980820575(7×24)

    提交需求

    返回頂部