当前位置: 首页 > news >正文

Zookeeper集成SpringBoot

Curator 是 Apache ZooKeeper 的Java客户端库。
Zookeeper现有常见的Java API如:原生JavaAPI、Curator、ZkClient等。

 

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.9</version><relativePath/></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.9.0</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>5.2.1</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.2.1</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository></repositories><pluginRepositories><pluginRepository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></pluginRepository><pluginRepository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></pluginRepository></pluginRepositories></project>

application.properties

server.port= 8085zookeeper.host= localhost:2181

一、建立连接

四个关键参数:
1、connectString 连接字符串 zkServer 地址和端口:"192.168.253.128:2181"
2、sessionTimeoutMs 会话超时时间,单位ms
3、connectionTimeoutMs 连接超时时间,单位ms
4、retryPolicy 重试策略

ZookeeperConfig
package com.example.demo.zk.config;import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author yanqiuxiang* @version 1.0*/
@Configuration
public class ZookeeperConfig {@Value("${zookeeper.host}")private String host;@Beanpublic CuratorFramework curatorFramework() {CuratorFramework curatorFramework = CuratorFrameworkFactory.builder().connectString(host).sessionTimeoutMs(5000).retryPolicy(new ExponentialBackoffRetry(500, 5)).build();curatorFramework.start();return curatorFramework;}}

ZookeeperController

二、创建节点:create 持久 临时 顺序 数据
  1. 基本创建 :create().forPath("")
  2. 创建节点 带有数据:create().forPath("",data)
  3. 设置节点的类型:create().withMode().forPath("",data)
  4. 创建多级节点  /app1/p1 :create().creatingParentsIfNeeded().forPath("",data)

package com.example.demo.zk.controller;import com.example.demo.zk.JsonResult;
import org.apache.curator.framework.CuratorFramework;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import java.nio.charset.StandardCharsets;
import java.util.List;/*** @author yanqiuxiang* @version 1.0*/
@RestController
@RequestMapping(path = "/zookeeper", produces = "application/json;charset=utf-8")
public class ZookeeperController {private final CuratorFramework curatorFramework;@Autowiredpublic ZookeeperController(CuratorFramework curatorFramework) {this.curatorFramework = curatorFramework;}/*** 判断znode是否存在* @param node 节点名称*/@RequestMapping(value = "/exist", method = RequestMethod.GET)public JsonResult<Stat> exist(String node) throws Exception {Stat stat = curatorFramework.checkExists().forPath(node);return new JsonResult(200, stat);}/*** 创建一个znode* @param node 节点名称*/@RequestMapping(value = "/create", method = RequestMethod.GET)public JsonResult<Void> create(String node) throws Exception {curatorFramework.create().creatingParentContainersIfNeeded()/*创建模式:常用的有PERSISTENT:持久化节点,客户端与zookeeper断开连接后,该节点依旧存在,只要不手动删除,该节点就会永远存在。PERSISTENT_SEQUENTIAL:持久化顺序编号目录节点,客户端与zookeeper断开连接后,该节点依旧存在,只是zookeeper给该节点名称进行顺序编号。EPHEMERAL:临时目录节点,客户端与zookeeper断开连接后,该节点被删除。EPHEMERAL_SEQUENTIAL:临时顺序编号目录节点,客户端与zookeeper断开连接后,该节点被删除,只是zookeeper给该节点名称进行顺序编号。*/.withMode(CreateMode.EPHEMERAL).forPath(node);return new JsonResult("创建成功");}/*** 设置znode节点的数据* @param node 节点名称* @param data 节点的数据*/@RequestMapping(value = "/setData", method = RequestMethod.GET)public JsonResult<Void> setData(String node, String data) throws Exception {curatorFramework.setData().forPath(node, data.getBytes(StandardCharsets.UTF_8));return new JsonResult("设置成功");}/*** 删除节点* @param node 节点名称*/@RequestMapping(value = "/delete", method = RequestMethod.GET)public JsonResult<Void> delete(String node) throws Exception {curatorFramework.delete().forPath(node);return new JsonResult("删除成功");}/*** 删除节点及其子节点的数据* @param node 节点名称*/@RequestMapping(value = "/deleteDeeply", method = RequestMethod.GET)public JsonResult<Void> deleteDeeply(String node) throws Exception {curatorFramework.delete().deletingChildrenIfNeeded().forPath(node);return new JsonResult("删除成功");}/*** 获取节点的数据* @param node 节点名称*/@RequestMapping(value = "/getData", method = RequestMethod.GET)public JsonResult<String> getData(String node) throws Exception {byte[] bytes = curatorFramework.getData().forPath(node);return new JsonResult(200, new String(bytes));}/*** 获取当前节点的子节点数据* @param node 节点名称*/@RequestMapping(value = "/getChildren", method = RequestMethod.GET)public JsonResult<List<String>> getChildren(String node) throws Exception {List<String> list = curatorFramework.getChildren().forPath(node);return new JsonResult(200, list);}}

JsonResult

package com.example.demo.zk;import java.io.Serializable;
/*** 用于封装服务器到客户端的Json返回值* @author yanqiuxiang**/
public class JsonResult<T> implements Serializable {//Serializable将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本public static final int SUCCESS=0;public static final int ERROR=1;public static final int OTHER=2;private int state;private String message = "";private T data;private String pass="";public JsonResult(){state = SUCCESS;}//为了方便,重载n个构造器public JsonResult(int state, String message, T data) {super();this.state = state;this.message = message;this.data = data;}public JsonResult(int state,String error){this(state,error,null);}public JsonResult(int state,T data){this(state,"",data);}public JsonResult(String error){this(ERROR,error,null);}public JsonResult(T data){this(SUCCESS,"",data);}public JsonResult(int state){this(state,"",null);}public JsonResult(Throwable e){this(ERROR,e.getMessage(),null);}public int getState() {return state;}public void setState(int state) {this.state = state;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public void setData(T data) {this.data = data;}public static int getSuccess() {return SUCCESS;}public static int getError() {return ERROR;}@Overridepublic String toString() {return "JsonResult [state=" + state + ", message=" + message + ", pass=" + pass + ", data=" + data + "]";}
}

相关文章:

Zookeeper集成SpringBoot

Curator 是 Apache ZooKeeper 的Java客户端库。 Zookeeper现有常见的Java API如&#xff1a;原生JavaAPI、Curator、ZkClient等。 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…...

ModaHub魔搭社区:星环科技致力于打造更优越的向量数据库

在数字化时代,数据成为了最重要的资源之一。随着人工智能、大数据等技术的不断发展,向量数据库成为了处理这类数据的关键工具。星环科技作为一家专注于数据存储和管理技术的公司,其重要目标就是将向量数据库打造得更为优越。 在星环科技,有一个专注于向量数据库的团队。这个…...

Dubbo默认使用什么序列化框架?还有哪些?

Dubbo默认使用的序列化框架是Hessian 2.0。Hessian是一种基于二进制的序列化协议&#xff0c;它具有简单、高效的特点&#xff0c;适用于网络传输和存储数据。Hessian在Dubbo中被广泛使用&#xff0c;因为它可以在不同的编程语言之间进行对象的序列化和反序列化。 除了Hessian…...

攻防世界-What-is-this

原题 解题思路 解压后文件 没有后缀&#xff0c;不知道是什么文件。用notepad打开找不到flag。 尝试当成压缩包解压。 用stegsolve以打开图片1&#xff0c; 合成两张图片。...

[C++]构造与毁灭:深入探讨C++中四种构造函数与析构函数

个人主页&#xff1a;北海 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C/C&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家一起学习交流&#xff01;&#x1f9…...

【跟小嘉学 Rust 编程】二十一、网络编程

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...

一文了解聚合支付

第四方支付是相对于第三方支付而提出的概念&#xff0c;又被称为“聚合支付”是指通过聚合第三方支付平台、合作银行、等多种支付工具进行的综合支付服务。 简言而之&#xff0c;把支付接口聚合到一个平台上面&#xff0c;来给商家或者个人来提供支付服务。 第四方支付集中了各…...

118.杨辉三角

一、题目 118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>>data(numRows);for(int i0;i<numRows;i){data[i].resize(i1);//扩容data[i]…...

第7节——渲染列表+Key作用

一、列表渲染 我们再react中如果渲染列表&#xff0c;一般使用map方法进行渲染 import React from "react";export default class LearnJSX2 extends React.Component {state {infos: [{name: "张三",age: 18,},{name: "李四",age: 20,},{nam…...

NTP服务器时间配置

简介 ntp服务器是一个同步时间都服务器。 开启ntpd 1.查看状态&#xff08;可以看到状态为&#xff1a;inactive&#xff0c;也就是没有启动ntp服务&#xff09; [rootlocalhost]$ systemctl status ntpd ● ntpd.service - Network Time ServiceLoaded: loaded (/usr/lib/…...

vulhub之MinIO信息泄露漏洞(CVE-2023-28432)

文章目录 0x01 前言0x02 漏洞描述0x03 影响范围0x04 漏洞复现1.启动环境2.查看端口3.构造POC 0x05 修复建议 0x01 前言 本次测试仅供学习使用&#xff0c;如若非法他用&#xff0c;与本文作者无关&#xff0c;需自行负责&#xff01;&#xff01;&#xff01; 0x02 漏洞描述 …...

C语言:递归思想及实例详解

简介&#xff1a;在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。通过函数的自调用化繁为简。 递归可以说是编程中最神奇的一种算法。因为我们有时候可能不能完全明晰代码的运行过程&#xff0c;但是我们却知道代码可以跑出正确的结果。而当我们使…...

好题分享0

P2141 [NOIP2014 普及组] 珠心算测验 原题链接 : [NOIP2014 普及组] 珠心算测验 - 洛谷 思路 : 用哈希表来存出现过的两数之和&#xff0c;最后ans即可 代码 : #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define end…...

python的asyncio事件循环

一、介绍 asyncio是Python标准库中的一个异步编程框架&#xff0c;它提供了一个事件循环&#xff08;event loop&#xff09;&#xff0c;用于协调异步任务的执行和结果的返回。在asyncio中&#xff0c;事件循环是一个非常重要的概念&#xff0c;它是异步编程的核心。 事件循…...

QT day1登录界面设计

要设计如下图片&#xff1a; 代码如下&#xff1a; main.cpp widget.h widget.cpp 运行效果&#xff1a; 2&#xff0c;思维导图...

(一)KITTI数据集用于3D目标检测

KITTI数据集介绍 数据基本情况 KITTI是德国卡尔斯鲁厄科技学院和丰田芝加哥研究院开源的数据集,最早发布于2012年03月20号。 对应的论文Are we ready for Autonomous Driving? The KITTI Vision Benchmark Suite发表在CVPR2012上。 KITTI数据集搜集自德国卡尔斯鲁厄市&…...

手写Promise完整介绍

Promise是一种用于处理异步操作的机制&#xff0c;它可以将异步操作的结果以同步的方式进行处理和返回。在JavaScript中&#xff0c;Promise是一种内置对象&#xff0c;但我们也可以手动实现一个Promise类来更好地理解其原理和工作方式。 Promise的特性 首先&#xff0c;让我…...

【kubernetes系列】Calico原理及配置

概述 Calico是针对容器&#xff0c;虚拟机和基于主机的本机工作负载的开源网络和网络安全解决方案。 Calico支持广泛的平台&#xff0c;包括Kubernetes&#xff0c;OpenShift&#xff0c;Docker EE&#xff0c;OpenStack和裸机服务。 Calico在每个计算节点都利用Linux Kernel实…...

RabbitMQ 的快速使用

docker部署rabbitmq # management才有管理页面 docker pull rabbitmq:management# 新建容器并运行 docker run \-e RABBITMQ_DEFAULT_USERadmin \ -e RABBITMQ_DEFAULT_PASSadmin \ -v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \-itd \ra…...

VUE3添加全局变量

全局变量的添加 在vue3.0中注入全局方法不是在prototype上挂载了&#xff0c;而是添加在config.globalProperties属性上。 //main.js import { createApp } from "vue"; import App from "./App.vue";const app createApp(App); app.config.globalPrope…...

JavaScript基础语法01——初识JavaScript

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 最近有项目用到KingFusion软件&#xff0c;由于KingFusion是B/S架构的客户端组态软件&#xff0c;因此在学习KingFusion产品时会涉及许多前端的知识。 像JavaScript语言就是需要用的&#xff0c;俗话说&#xff1a;活到…...

家宽用户家庭网的主要质量问题是什么?原因有哪些

1 引言 截至2020年底&#xff0c;我国家庭宽带&#xff08;以下简称“家宽”&#xff09;普及率已达到96%。经过一年多的发展&#xff0c;当前&#xff0c;家庭宽带的市场空间已经饱和。运营商在家宽市场的竞争也随之从新增用户数的竞争转移到家宽品质的竞争。 早期运营商的家…...

ZooKeeper的典型应用场景及实现

文章目录 1、典型应用场景及实现1.1、 数据发布/订阅1.1.1、配置管理案列 1.2、负载均衡1.3、命名服务1.4、分布式协调/通知1.4.1、一种通用的分布式系统机器间通信方式 1.5、集群管理1.6、Master选举1.7、分布式锁1.7.1、排他锁1.7.2、共享锁 1.8、分布式队列 2、ZooKeeper在大…...

智能安全帽~生命体征检测与危险气体检测一体化集成设计还是蓝牙无线外挂式方式好?

生命体征&#xff08;心率、血氧等&#xff09;检测&上报平台&#xff0c;危险气体采集&上报平台&#xff0c;是智能安全帽产品中常见的两种选配件&#xff0c;它们的实现有两种典型的模式&#xff1a; 1&#xff09;将传感器集成到主板上&#xff0c;做成一体化的智能…...

【Java并发】聊聊对象内存布局和syn锁升级过程

对象存储解析&#xff1a;一个空Object对象到底占据多少内存&#xff1f; 对象内存布局 Mark Word占用8字节&#xff0c;类型指针占用8个字节&#xff0c;对象头占用16个字节。 好了&#xff0c;我们来看一下一个Object对占用多少空间&#xff0c; 因为java默认是开启压缩…...

【档案专题】八、电子档案鉴定与销毁

导读&#xff1a;主要针对电子档案鉴定与销毁相关内容介绍。对从事电子档案管理信息化的职业而言&#xff0c;不断夯实电子档案管理相关理论基础是十分重要。只有通过不断梳理相关知识体系和在实际工作当中应用实践&#xff0c;才能走出一条专业化加职业化的道路&#xff0c;从…...

进程与子进程

一、子进程 1.fork()创建子进程 一个现有的进程可以调用 fork()函数创建一个新的进程&#xff0c;调用 fork()函数的进程称为父进程&#xff0c;由 fork()函数创建出来的进程被称为子进程&#xff08;child process&#xff09;。&#xff08;使用该函数需要包含头文件<uni…...

如何对MySQL和MariaDB中的查询和表进行优化-提升查询效率

前言 MySQL和MariaDB是数据库管理系统的流行选择。两者都使用SQL查询语言来输入和查询数据。 尽管SQL查询是简单易学的命令&#xff0c;但并不是所有的查询和数据库函数都具有相同的效率。随着你存储的信息量的增长&#xff0c;如果你的数据库支持一个网站&#xff0c;随着网…...

【Android】关于binder_calls_stats服务

Android 9上有了binder_calls_stats服务&#xff0c;提供了java层的binder统计&#xff0c; Android中的Binder Call Stats&#xff08;Binder调用统计&#xff09;是一项用于监控和记录Android系统中Binder通信的统计信息的功能。Binder是Android中的一种进程间通信&#xff…...

给前端返回http链接,由于浏览器缓存不能获取到最新资源怎么办?

1、问题描述 今天在工作中接到这样一个需求&#xff0c;接收前端的图片文件并上传到远程&#xff0c;将原有图片覆盖并返回一个http链接以供前端展示。用户使用后反馈没有修改成功&#xff0c;上了远程拉图片发现已经修改了&#xff0c;但是用户浏览器还是老的图片。排查原因是…...