IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> springboot整合zookeeper -> 正文阅读

[大数据]springboot整合zookeeper

前提:
springboot版本: 2.5.3
zookeeper版本:3.4.9 (centos7 安装集群)

gitee项目地址:https://gitee.com/qinenqi/zookeeper/tree/master/zookeeper01
postman测试数据:json.json

{
  "item":[

    {
      "name":"study",
      "item":[
        {
          "name":"zookeeper",
          "item":[
            {
              "name":"01 创建zookeeper节点",
              "request":{
                "method":"POST",
                "header":[

                ],
                "body":{
                  "mode":"raw",
                  "raw":"{\r\n    \"path\":\"/qinenqi\",\r\n    \"obj\":\"开始测试数据\",\r\n    \"aCLType\":\"OPEN_ACL_UNSAFE\",\r\n    \"createNodeType\":0\r\n}",
                  "options":{
                    "raw":{
                      "language":"json"
                    }
                  }
                },
                "url":{
                  "raw":"127.0.0.1:8888/zookeeperController/create",
                  "host":[
                    "127",
                    "0",
                    "0",
                    "1"
                  ],
                  "port":"8888",
                  "path":[
                    "zookeeperController",
                    "create"
                  ],
                  "query":[
                    {
                      "key":"path",
                      "value":"/qinenqi",
                      "disabled":true
                    },
                    {
                      "key":"obj",
                      "value":"",
                      "disabled":true
                    }
                  ]
                },
                "description":"01 创建zookeeper节点"
              },
              "response":[

              ]
            },
            {
              "name":"02更新节点",
              "request":{
                "method":"POST",
                "header":[

                ],
                "body":{
                  "mode":"raw",
                  "raw":"{\r\n    \"path\":\"/qinenqi\",\r\n    \"obj\":\"开始更新数据\"\r\n}",
                  "options":{
                    "raw":{
                      "language":"json"
                    }
                  }
                },
                "url":{
                  "raw":"127.0.0.1:8888/zookeeperController/updateZnode",
                  "host":[
                    "127",
                    "0",
                    "0",
                    "1"
                  ],
                  "port":"8888",
                  "path":[
                    "zookeeperController",
                    "updateZnode"
                  ]
                },
                "description":"02更新节点"
              },
              "response":[

              ]
            },
            {
              "name":"03删除节点",
              "request":{
                "method":"POST",
                "header":[

                ],
                "body":{
                  "mode":"raw",
                  "raw":"{\r\n    \"path\":\"/qinenqi\"\r\n}",
                  "options":{
                    "raw":{
                      "language":"json"
                    }
                  }
                },
                "url":{
                  "raw":"127.0.0.1:8888/zookeeperController/deleteZnode",
                  "host":[
                    "127",
                    "0",
                    "0",
                    "1"
                  ],
                  "port":"8888",
                  "path":[
                    "zookeeperController",
                    "deleteZnode"
                  ]
                },
                "description":"03删除节点"
              },
              "response":[

              ]
            },
            {
              "name":"04获取根节点下所有子节点",
              "request":{
                "method":"POST",
                "header":[

                ],
                "url":{
                  "raw":"127.0.0.1:8888/zookeeperController/getChildren",
                  "host":[
                    "127",
                    "0",
                    "0",
                    "1"
                  ],
                  "port":"8888",
                  "path":[
                    "zookeeperController",
                    "getChildren"
                  ]
                },
                "description":"04获取根节点下所有子节点"
              },
              "response":[

              ]
            }
          ]
        }
      ]
    }
  ]
}
  1. 引入依赖:
 <!-- zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
        </dependency>
  1. 新建 ZookeeperConfig

import lombok.Data;
import org.apache.zookeeper.*;

@Data
public class ZookeeperConfig {

    //连接的zk服务
    private static final String CONNECTION_HOSTS = "192.168.88.100:2181,192.88.110.128:2181,192.168.88.120:2181";
    //超时连接的时间
    private static final int SESSION_TIMEOUT = 2000;

    private  static ZooKeeper zooKeeper = null;
    static {
        try {
            zooKeeper = new ZooKeeper(CONNECTION_HOSTS, SESSION_TIMEOUT, new Watcher() {
                public void process(WatchedEvent watchedEvent) {
                    System.out.println(watchedEvent.getPath()+";"+watchedEvent.getState());
                    try {
                        //获取对根目录节点数据的监控
                        zooKeeper.getChildren("/",true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static ZooKeeper getZooKeeper() {
        return zooKeeper;
    }
}

新建 ZookeeperUtil


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Stat;
import java.util.ArrayList;


/**
 *  Zookeeper 工具类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ZookeeperUtil {

    private ZooKeeper zooKeeper;

    /*
    判断当前节点是否存在
    */
    public Stat isExistZnode(String path) throws Exception{
        Stat stat = zooKeeper.exists(path,true);
        return stat;
    }
    /*
      创建节点
     */
    public String createZnode(String path, Object object, ArrayList<ACL> zooDefs, CreateMode createMode) throws Exception {
        return  zooKeeper.create(path,object.toString().getBytes(),zooDefs,createMode);
    }
    /*
      修改节点
     */
    public Stat updateZnode(String path, Object object, int version) throws Exception {
        return zooKeeper.setData(path,object.toString().getBytes(),version);
    }
    /*
      删除节点
     */
    public void deleteZnode(String path,int version) throws Exception {
        zooKeeper.delete(path,version);
    }


}

新建实体类:


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.data.ACL;
import java.io.Serializable;
import java.util.ArrayList;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Slf4j
public class Zookeeper implements Serializable {

    private String id;

    /**
     *  zookeeper的路径
     */
    private String path;

    /**
     *  节点对应的数据
     */
    private Object obj;

    /**
     * OPEN_ACL_UNSAFE  : 完全开放的ACL,任何连接的客户端都可以操作该属性znode
     * CREATOR_ALL_ACL : 只有创建者才有ACL权限
     * READ_ACL_UNSAFE:只能读取ACL
     */
    private String aCLType;

    /**
     *  acl的集合:ACL权限
     */
    private ArrayList<ACL> lists;

    /**
     *  0 PERSISTENT 持久化目录节点, 会话结束存储数据不会丢失
     *  2 PERSISTENT_SEQUENTIAL 顺序自动编号持久化目录节点
     *  1 EPHEMERAL 临时目录节点
     *  3 EPHEMERAL_SEQUENTIAL 临时自动编号节点
     */
    private int createNodeType;

    /**
     *  节点类型:
     *  PERSISTENT 持久化目录节点, 会话结束存储数据不会丢失
     *  PERSISTENT_SEQUENTIAL 顺序自动编号持久化目录节点
     *  EPHEMERAL 临时目录节点
     *  EPHEMERAL_SEQUENTIAL 临时自动编号节点
     */
    private CreateMode createMode;

    public void setaCLType(String aCLType) {
        this.aCLType = aCLType;
        // ArrayList<ACL> 赋值
        if("OPEN_ACL_UNSAFE".equals(aCLType)){
            lists = ZooDefs.Ids.OPEN_ACL_UNSAFE;
        }else if("CREATOR_ALL_ACL".equals(aCLType)){
            lists = ZooDefs.Ids.CREATOR_ALL_ACL;
        }else if("READ_ACL_UNSAFE".equals(aCLType)){
            lists = ZooDefs.Ids.READ_ACL_UNSAFE;
        }
    }


    public void setCreateNodeType(int createNodeType) {
        this.createNodeType = createNodeType;
        if(createNodeType == 0){
            createMode = CreateMode.PERSISTENT;
        }else if(createNodeType == 2){
            createMode = CreateMode.PERSISTENT_SEQUENTIAL;
        }else if(createNodeType == 1){
            createMode = CreateMode.EPHEMERAL;
        }else if(createNodeType == 3){
            createMode = CreateMode.EPHEMERAL_SEQUENTIAL;
        }
    }
}

新建controller ZookeeperController


import com.example.zookeeper01.entry.Zookeeper;
import com.example.zookeeper01.service.ZookeeperService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/zookeeperController")
public class ZookeeperController {



    @Autowired
    private ZookeeperService zookeeperService;

    /**
     *  创建zookeeper节点
     * @param zookeeper
     */
    @RequestMapping("/create")
    public void create(@RequestBody Zookeeper zookeeper){
        zookeeperService.create(zookeeper);
    }

    /**
     * 更新节点
     * @param zookeeper
     */
    @RequestMapping("/updateZnode")
    public void updateZnode(@RequestBody Zookeeper zookeeper){
        zookeeperService.updateZnode(zookeeper);
    }

    /**
     * 删除节点
     * @param zookeeper
     */
    @RequestMapping("/deleteZnode")
    public void deleteZnode(@RequestBody Zookeeper zookeeper){
        zookeeperService.deleteZnode(zookeeper);
    }

    /**
     * 获取根节点下所有子节点
     */
    @RequestMapping("/getChildren")
    public void getChildren(){
        zookeeperService.getChildren();
    }
}

新建 ZookeeperService


import com.example.zookeeper01.entry.Zookeeper;

public interface ZookeeperService {

    /**
     *  创建zookeeper节点
     * @param zookeeper
     */
    public void create(Zookeeper zookeeper);

    /**
     * 更新节点
     * @param zookeeper
     */
    public void updateZnode(Zookeeper zookeeper);

    /**
     * 删除节点
     * @param zookeeper
     */
    public void deleteZnode(Zookeeper zookeeper);

    /**
     * 获取根节点下所有子节点
     *
     */
    public void getChildren();
}

新建 ZookeeperServiceImpl


import com.example.zookeeper01.config.ZookeeperConfig;
import com.example.zookeeper01.entry.Zookeeper;
import com.example.zookeeper01.service.ZookeeperService;
import com.example.zookeeper01.utils.ZookeeperUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Stat;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class ZookeeperServiceImpl implements ZookeeperService {



    /**
     *  创建zookeeper节点
     * @param zookeeper
     */
    public void create(Zookeeper zookeeper){
        try{
            String path = zookeeper.getPath();
            Object obj = zookeeper.getObj();
            ArrayList<ACL> lists = zookeeper.getLists();
            CreateMode createMode = zookeeper.getCreateMode();
            ZooKeeper zooKeeper = ZookeeperConfig.getZooKeeper();
            ZookeeperUtil zookeeperUtil = new ZookeeperUtil(zooKeeper);
            if(zookeeperUtil.isExistZnode(path) == null){
                zookeeperUtil.createZnode(path, obj, lists, createMode);
                log.info("创建zookeeper节点 成功");
            }else {
                log.info(path + " znode exist!!!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 更新节点
     * @param zookeeper
     */
    public void updateZnode(Zookeeper zookeeper){
        try{
            String path = zookeeper.getPath();
            Object obj = zookeeper.getObj();
            ArrayList<ACL> lists = zookeeper.getLists();
            CreateMode createMode = zookeeper.getCreateMode();
            ZooKeeper zooKeeper = ZookeeperConfig.getZooKeeper();
            ZookeeperUtil zookeeperUtil = new ZookeeperUtil(zooKeeper);
            Stat existZnode = zookeeperUtil.isExistZnode(path);
            if(existZnode != null){
                zookeeperUtil.updateZnode(path, obj, existZnode.getVersion());
                log.info("更新 zookeeper节点 成功");
            }else {
                log.info(path + " 不存在!!!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



    /**
     * 删除节点
     * @param zookeeper
     */
    public void deleteZnode(Zookeeper zookeeper){
        try{
            String path = zookeeper.getPath();
            Object obj = zookeeper.getObj();
            ArrayList<ACL> lists = zookeeper.getLists();
            CreateMode createMode = zookeeper.getCreateMode();
            ZooKeeper zooKeeper = ZookeeperConfig.getZooKeeper();
            ZookeeperUtil zookeeperUtil = new ZookeeperUtil(zooKeeper);
            Stat existZnode = zookeeperUtil.isExistZnode(path);
            if(existZnode != null){
                zookeeperUtil.deleteZnode(path, existZnode.getVersion());
                log.info("删除 zookeeper节点 成功");
            }else {
                log.info(path + " 不存在!!!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 获取根节点下所有子节点
     *
     */
    public void getChildren(){
        try{
            ZooKeeper zooKeeper = ZookeeperConfig.getZooKeeper();
            //获取根节点下所有子节点,遍历获取对应节点的数据
            List<String> znodes = zooKeeper.getChildren("/",true);
            for(String str : znodes){
                log.info(str+">>>"+new String(zooKeeper.getData("/"+str,true,new Stat())));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 12:09:17  更:2021-08-07 12:11:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 19:03:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码