SpringBoot3集成Zookeeper

標籤:Zookeeper3.8 ,Curator5.5;

一、簡介

ZooKeeper是一個集中的服務,用於維護配置信息、命名、提供分佈式同步、提供組服務。分佈式應用程序以某種形式使用所有這些類型的服務。

二、環境搭建

1、修改配置文件

# 1、拷貝一份樣本配置文件
cp zookeeper-3.8.3/conf/zoo_sample.cfg zookeeper-3.8.3/conf/zoo.cfg

# 2、修改數據文件地址,注意這裏用本地路徑
dataDir=/local-path/zookeeper-3.8.3/data

# 3、添加一個配置,處理啓動日誌的提示:ZooKeeper audit is disabled.
audit.enable=true

2、服務啓動

# 1、啓動服務端
zookeeper-3.8.3/bin/zkServer.sh start

# 2、停止服務端
zookeeper-3.8.3/bin/zkServer.sh stop

# 3、啓動客戶端
zookeeper-3.8.3/bin/zkCli.sh

3、客戶端測幾個增刪查的命令

[zk: localhost:2181(CONNECTED) 0] create /cicada smile1
Created /cicada
[zk: localhost:2181(CONNECTED) 1] get /cicada
smile1
[zk: localhost:2181(CONNECTED) 2] ls /
[cicada, zookeeper]
[zk: localhost:2181(CONNECTED) 3] delete /cicada

三、工程搭建

1、工程結構

2、依賴管理

Curator是一組Java庫,它讓ZooKeeper的使用變得更加容易,這裏的依賴實際是查詢匹配版本的時候走了個捷徑,也可以參考integration-redis包,熟悉下Spring的封裝策略。

<!-- Zookeeper組件 -->
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>${zookeeper.version}</version>
</dependency>
<!-- 包含Curator組件 -->
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-zookeeper</artifactId>
    <version>${spring-integration.version}</version>
</dependency>

3、配置文件

配置腳本

zookeeper:
  #服務器地址
  connectString: 127.0.0.1:2181
  #會話超時時間
  sessionTimeoutMs: 3000
  #連接超時時間
  connectionTimeoutMs: 60000
  #最大重試次數
  maxRetries: 3
  #初始休眠時間
  baseSleepTimeMs: 1000

配置類

@Configuration
public class ZookeeperConfig {

    @Value("${zookeeper.connectString}")
    private String connectString;
    
    @Value("${zookeeper.baseSleepTimeMs}")
    private int baseSleepTimeMs;

    @Value("${zookeeper.maxRetries}")
    private int maxRetries ;

    @Value("${zookeeper.connectionTimeoutMs}")
    int connectionTimeoutMs ;

    @Value("${zookeeper.sessionTimeoutMs}")
    int sessionTimeoutMs ;

    private static CuratorFramework client = null ;
    /**
     * 初始化
     */
    @PostConstruct
    public void init (){
        // 重試策略
        RetryPolicy policy = new ExponentialBackoffRetry(baseSleepTimeMs, maxRetries);
        // 創建Curator
        client = CuratorFrameworkFactory.builder()
                .connectString(connectString)
                .connectionTimeoutMs(connectionTimeoutMs)
                .sessionTimeoutMs(sessionTimeoutMs)
                .retryPolicy(policy).build();
        //開啓連接
        client.start();
    }

    @Bean
    public CuratorFramework getClient (){
        return client ;
    }
}

四、ZooKeeper用法

測試幾個API方法,節點創建和添加數據,以及判斷和查詢數據,還有就是基於ZooKeeper提供的讀寫鎖能力。

public class ConfigTest {

    @Autowired
    private CuratorFramework client ;

    @Test
    public void testCreate () throws Exception {
        // 創建一個持久化節點,斷開連接時不會自動刪除
        client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/path1");
    }

    @Test
    public void testExists () throws Exception {
        // 判斷節點是否存在,path2不存在所以stat2是null
        Stat stat1 = client.checkExists().forPath("/path1");
        System.out.println(stat1);
        Stat stat2 = client.checkExists().forPath("/path2");
        System.out.println(stat2);
    }

    @Test
    public void testSetData () throws Exception {
        // 設置節點數據
        client.setData().forPath("/path1", "data1".getBytes(StandardCharsets.UTF_8));
    }

    @Test
    public void testCreateAndSet () throws Exception {
        // 創建一個持久化節點並設置節點數據
        client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT)
                .forPath("/path3","data3".getBytes(StandardCharsets.UTF_8));
    }

    @Test
    public void testGetData () throws Exception {
        // 查詢節點數據
        byte[] data = client.getData().forPath("/path3");
        System.out.println(new String(data,StandardCharsets.UTF_8));
    }

    @Test
    public void testDelete () throws Exception {
        // 刪除節點
        client.delete().guaranteed().deletingChildrenIfNeeded().forPath("/path3");
    }

    @Test
    public void testReadLock () throws Exception {
        // 讀寫鎖-讀
        InterProcessReadWriteLock lock = new InterProcessReadWriteLock(client,"/lock-read");
        lock.readLock().acquire();
        System.out.println("獲取-ReadLock");
        lock.readLock().release();
    }

    @Test
    public void testWriteLock () throws Exception {
        // 讀寫鎖-寫
        InterProcessReadWriteLock lock = new InterProcessReadWriteLock(client,"/lock-write");
        lock.writeLock().acquire();
        System.out.println("獲取-WriteLock");
        lock.writeLock().release();
    }
}

五、參考源碼

文檔倉庫:
https://gitee.com/cicadasmile/butte-java-note

源碼倉庫:
https://gitee.com/cicadasmile/butte-spring-parent
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章