Zookeeper第一话 -- docker安装zookeeper以及Springboot集成zk

214 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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机制实现公用配置和备用节点

书山有路勤为径,学海无涯苦作舟