SpringBoot3集成Zookeeper的代碼詳解
一、簡介
ZooKeeper是一個集中的服務(wù),用于維護(hù)配置信息、命名、提供分布式同步、提供組服務(wù)。分布式應(yīng)用程序以某種形式使用所有這些類型的服務(wù)。
二、環(huán)境搭建
1、修改配置文件
# 1、拷貝一份樣本配置文件 cp zookeeper-3.8.3/conf/zoo_sample.cfg zookeeper-3.8.3/conf/zoo.cfg # 2、修改數(shù)據(jù)文件地址,注意這里用本地路徑 dataDir=/local-path/zookeeper-3.8.3/data # 3、添加一個配置,處理啟動日志的提示:ZooKeeper audit is disabled. audit.enable=true
2、服務(wù)啟動
# 1、啟動服務(wù)端 zookeeper-3.8.3/bin/zkServer.sh start # 2、停止服務(wù)端 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、工程結(jié)構(gòu)

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: #服務(wù)器地址 connectString: 127.0.0.1:2181 #會話超時時間 sessionTimeoutMs: 3000 #連接超時時間 connectionTimeoutMs: 60000 #最大重試次數(shù) 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);
// 創(chuàng)建Curator
client = CuratorFrameworkFactory.builder()
.connectString(connectString)
.connectionTimeoutMs(connectionTimeoutMs)
.sessionTimeoutMs(sessionTimeoutMs)
.retryPolicy(policy).build();
//開啟連接
client.start();
}
@Bean
public CuratorFramework getClient (){
return client ;
}
}
四、ZooKeeper用法
測試幾個API方法,節(jié)點創(chuàng)建和添加數(shù)據(jù),以及判斷和查詢數(shù)據(jù),還有就是基于ZooKeeper提供的讀寫鎖能力。
public class ConfigTest {
@Autowired
private CuratorFramework client ;
@Test
public void testCreate () throws Exception {
// 創(chuàng)建一個持久化節(jié)點,斷開連接時不會自動刪除
client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/path1");
}
@Test
public void testExists () throws Exception {
// 判斷節(jié)點是否存在,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 {
// 設(shè)置節(jié)點數(shù)據(jù)
client.setData().forPath("/path1", "data1".getBytes(StandardCharsets.UTF_8));
}
@Test
public void testCreateAndSet () throws Exception {
// 創(chuàng)建一個持久化節(jié)點并設(shè)置節(jié)點數(shù)據(jù)
client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT)
.forPath("/path3","data3".getBytes(StandardCharsets.UTF_8));
}
@Test
public void testGetData () throws Exception {
// 查詢節(jié)點數(shù)據(jù)
byte[] data = client.getData().forPath("/path3");
System.out.println(new String(data,StandardCharsets.UTF_8));
}
@Test
public void testDelete () throws Exception {
// 刪除節(jié)點
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
以上就是SpringBoot3集成Zookeeper的代碼詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot3集成Zookeeper的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺談Java由于不當(dāng)?shù)膱?zhí)行順序?qū)е碌乃梨i
為了保證線程的安全,我們引入了加鎖機制,但是如果不加限制的使用加鎖,就有可能會導(dǎo)致順序死鎖(Lock-Ordering Deadlock)。本文將會討論一下順序死鎖的問題。2021-06-06
idea在工具欄中顯示快速創(chuàng)建包和類的圖標(biāo)的詳細(xì)步驟
點擊需要創(chuàng)建包或者類的位置,在點擊對用的圖標(biāo)就可以快速創(chuàng)建類或者包了,下面小編給大家介紹idea在工具欄中顯示快速創(chuàng)建包和類的圖標(biāo)的詳細(xì)步驟,感興趣的朋友一起看看吧2024-02-02
SpringBoot整合kafka遇到的版本不對應(yīng)問題及解決
這篇文章主要介紹了SpringBoot整合kafka遇到的版本不對應(yīng)問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
java實現(xiàn)String字符串處理各種類型轉(zhuǎn)換
在日常的程序開發(fā)中,經(jīng)常會涉及到不同類型之間的轉(zhuǎn)換,本文主要介紹了String字符串處理各種類型轉(zhuǎn)換,具有一定的參考價值,感興趣的可以了解一下2023-10-10

