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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值