当前位置: 首页 > 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 + "]";}
}

http://www.lryc.cn/news/147026.html

相关文章:

  • ModaHub魔搭社区:星环科技致力于打造更优越的向量数据库
  • Dubbo默认使用什么序列化框架?还有哪些?
  • 攻防世界-What-is-this
  • [C++]构造与毁灭:深入探讨C++中四种构造函数与析构函数
  • 【跟小嘉学 Rust 编程】二十一、网络编程
  • 一文了解聚合支付
  • 118.杨辉三角
  • 第7节——渲染列表+Key作用
  • NTP服务器时间配置
  • vulhub之MinIO信息泄露漏洞(CVE-2023-28432)
  • C语言:递归思想及实例详解
  • 好题分享0
  • python的asyncio事件循环
  • QT day1登录界面设计
  • (一)KITTI数据集用于3D目标检测
  • 手写Promise完整介绍
  • 【kubernetes系列】Calico原理及配置
  • RabbitMQ 的快速使用
  • VUE3添加全局变量
  • JavaScript基础语法01——初识JavaScript
  • 家宽用户家庭网的主要质量问题是什么?原因有哪些
  • ZooKeeper的典型应用场景及实现
  • 智能安全帽~生命体征检测与危险气体检测一体化集成设计还是蓝牙无线外挂式方式好?
  • 【Java并发】聊聊对象内存布局和syn锁升级过程
  • 【档案专题】八、电子档案鉴定与销毁
  • 进程与子进程
  • 如何对MySQL和MariaDB中的查询和表进行优化-提升查询效率
  • 【Android】关于binder_calls_stats服务
  • 给前端返回http链接,由于浏览器缓存不能获取到最新资源怎么办?
  • 【Java Web】检查用户登录状态,防止用户访问到非法页面