1.介绍
zookeeper是一个分布式协调组件,为分布式应用提供一致性服务的软件。提供的功能包括:配置维护、域名服务、分布式同步等
zookeeper服务中含有临时节点和永久的节点。临时节点当客户端和服务端断开以后,会自动删除该节点。永久节点则不会。
zookeeper服务中提供了分布式独享锁,选举、队列的接口。
此外zookeeper提供了观察者回调,为继续等待获取分布式锁提供了监控的能力(1.监听节点的数据变化。2.监听子节点的增减变化)。基于这个监听机制可以实现配置统一管理。
2.docker安装zookeeper
基于liunx centos7、zookeeper3.7。
2.1 yaml文件
version: '3.7'
services:
zk01:
image: zookeeper:3.7.0
container_name: zk01
restart: always
ports:
- "2181:2181"
environment:
- TZ=Asia/Shanghai
volumes:
- /root/local/zookeeper/data:/data
networks:
- my-net
networks:
my-net:
external: true
2.2 容器启动测试
启动容器后,进入容器连接zookeeper服务
[root@m zookeeper]# docker-compose up -d
Starting zk01 ... done
[root@m zookeeper]# docker exec -it zk01 /bin/bash
root@f773b5679fb0:/apache-zookeeper-3.7.0-bin# ./bin/zkCli.sh
Connecting to localhost:2181
......
#创建持久节点
[zk: localhost:2181(CONNECTED) 1] create /test hello
Created /test
#创建临时节点,在客户端断开后会自动删掉
[zk: localhost:2181(CONNECTED) 2] create -e /temp
Created /temp
#查看节点
[zk: localhost:2181(CONNECTED) 3] ls /
[temp, test, zookeeper]
#修改节点的值
[zk: localhost:2181(CONNECTED) 2] set /test 123456
#获取节点的值
[zk: localhost:2181(CONNECTED) 3] get /test
123456
#创建同名节点
[zk: localhost:2181(CONNECTED) 4] create -e /temp
#独占锁的效果
Node already exists: /temp
3.springboot中集成zookeeper
基于springboot 2.5.6,zookeeper3.7。
3.1 pom文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.7.0</version>
<!--要排除zk包里面的日志,不然冲突会启动报错-->
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
</exclusions>
</dependency>
3.2 yaml文件
zookeeper:
address: 192.168.0.221:2181
timeout: 60000
server:
port: 8999
由于zookeeper没有springboot star包,需要自己初始化,
3.3 BeanConfig文件
package com.example.config;
import org.apache.zookeeper.ZooKeeper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class BeanConfig {
@Value("${zookeeper.address}")
String address;
@Value("${zookeeper.timeout}")
Integer timeout;
@Bean
public ZooKeeper zooKeeper() {
try {
ZooKeeper zooKeeper = new ZooKeeper(address, timeout, watchedEvent -> {
});
return zooKeeper;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("初始化zookeeper异常");
}
}
}
3.4 controller层代码
@RestController
public class ZookeeperController {
@Autowired
ZooKeeper zooKeeper;
@GetMapping("/create")
public String create(@RequestParam String path, @RequestParam String value) throws KeeperException, InterruptedException {
String s = zooKeeper.create(path, value.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
return s;
}
@GetMapping("/set")
public String set(@RequestParam String path, @RequestParam String value) throws KeeperException, InterruptedException {
Stat stat = zooKeeper.setData(path, value.getBytes(), -1);
return stat.toString();
}
@GetMapping("/get")
public String get(@RequestParam String path) throws KeeperException, InterruptedException {
byte[] data = zooKeeper.getData(path, false, null);
return new String(data);
}
}
上述内容仅仅是安装和初始使用,下节使用zookeeper来实现公用配置文件和备用节点。
以上就是本章的全部内容了。
上一篇:Redis第四话 – redis高性能原理(多路复用)和高可用分析(备份、主从))
下一篇:Zookeeper第二话 – Springboot基于zk watch机制实现公用配置和备用节点
书山有路勤为径,学海无涯苦作舟