자바 조작 Zookeeper 원리 및 과정 상세 설명

6819 단어 JavaZookeeper
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 ? " " : "");
    } 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();
    }
  }
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기