SpringBoot集成Curator实现Zookeeper基本操作

本文主要是介绍SpringBoot集成Curator实现Zookeeper基本操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录


文章目录

  • 系列文章目录
  • 前言


前言

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
在这里插入图片描述


Zookeeper是一个Apache开源的分布式的应用,为系统架构提供协调服务。从设计模式角度来审视:该组件是一个基于观察者模式设计的框架,负责存储和管理数据,接受观察者的注册,一旦数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的观察者做出相应的反应,从而实现集群中类似Master/Slave管理模式。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
在这里插入图片描述
zookeeper安装单机模式

http://www.javacui.com/opensource/445.html

官网

https://curator.apache.org/releases.html#Current_Release

POM引入

<!--                      curator                      -->
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.2.0</version>
</dependency>
<!--                      fastjson                      -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.79</version>
</dependency>

application.yml定义连接属性

server:port: 80
curator:connectString: 192.168.3.22:2181 # zookeeper 地址retryCount: 1 # 重试次数elapsedTimeMs: 2000 # 重试间隔时间sessionTimeoutMs: 60000 # session超时时间connectionTimeoutMs: 10000 # 连接超时时间

使用Springboot配置读取

package com.example.springboot.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** @Auther: Java小强* @Date: 2022/2/4 - 19:37* @Decsription: com.example.springboot.config* @Version: 1.0*/
@Data
@Component
@ConfigurationProperties(prefix = "curator")
public class CuratorConf {private int retryCount;private int elapsedTimeMs;private String connectString;private int sessionTimeoutMs;private int connectionTimeoutMs;
}

公用连接创建对象

package com.example.springboot.tool;import com.example.springboot.config.CuratorConf;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.RetryNTimes;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @Auther: Java小强* @Date: 2022/2/4 - 19:37* @Decsription: com.example.springboot.tool* @Version: 1.0*/
@Configuration
public class ZkConfiguration {@Autowiredprivate CuratorConf curatorConf;/*** 这里会自动调用一次start,请勿重复调用*/@Bean(initMethod = "start")public CuratorFramework curatorFramework() {return CuratorFrameworkFactory.newClient(curatorConf.getConnectString(),curatorConf.getSessionTimeoutMs(),curatorConf.getConnectionTimeoutMs(),new RetryNTimes(curatorConf.getRetryCount(), curatorConf.getElapsedTimeMs()));}}

编写测试类,实现各种基础操作,并挨个测试

package com.example.springboot;import com.alibaba.fastjson.JSON;
import com.example.springboot.tool.ZkConfiguration;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.api.BackgroundCallback;
import org.apache.curator.framework.api.CuratorEvent;
import org.apache.zookeeper.data.Stat;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.nio.charset.StandardCharsets;
import java.util.List;/*** @Auther: Java小强* @Date: 2022/2/4 - 19:33* @Decsription: com.example.springboot* @Version: 1.0*/
@SpringBootTest(classes = Application.class)
public class CuratorTest {@Autowiredprivate ZkConfiguration zk;// 测试连接@Testvoid contextLoads() {CuratorFramework client= zk.curatorFramework();System.out.println(client.toString());}// 创建节点@Testvoid createPath() throws Exception{CuratorFramework client= zk.curatorFramework();// 父节点不存在则创建String path = client.create().creatingParentsIfNeeded().forPath("/javacui/p1" ,"Java小强博客".getBytes(StandardCharsets.UTF_8));System.out.println(path);byte[] data = client.getData().forPath("/javacui/p1");System.out.println(new String(data));}// 赋值,修改数据@Testvoid setData() throws Exception{CuratorFramework client = zk.curatorFramework();int version = 0; // 当前节点的版本信息Stat stat = new Stat();client.getData().storingStatIn(stat).forPath("/javacui/p1");version = stat.getVersion();// 如果版本信息不一致,说明当前数据被修改过,则修改失败程序报错client.setData().withVersion(version).forPath("/javacui/p1","Java崔的博客".getBytes(StandardCharsets.UTF_8));byte[] data = client.getData().forPath("/javacui/p1");System.out.println(new String(data));}// 查询节点@Testvoid getPath() throws Exception{CuratorFramework client= zk.curatorFramework();// 查内容byte[] data = client.getData().forPath("/javacui/p1");System.out.println(new String(data));// 查状态Stat stat = new Stat();client.getData().storingStatIn(stat).forPath("/javacui/p1");System.out.println(JSON.toJSONString(stat, true));}// 删除节点@Testvoid deletePath() throws Exception{CuratorFramework client= zk.curatorFramework();// deletingChildrenIfNeeded如果有子节点一并删除// guaranteed必须成功比如网络抖动时造成命令失败client.delete().guaranteed().deletingChildrenIfNeeded().inBackground(new BackgroundCallback() {@Overridepublic void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {System.out.println("删除成功");// { "path":"/javacui/p1","resultCode":0,"type":"DELETE"}System.out.println(JSON.toJSONString(curatorEvent, true));}}).forPath("/javacui/p1");}// 查询子节点@Testvoid getPaths() throws Exception{CuratorFramework client= zk.curatorFramework();List<String> paths = client.getChildren().forPath("/javacui");for(String p : paths){System.out.println(p);}}
}

这篇关于SpringBoot集成Curator实现Zookeeper基本操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/986543

相关文章

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

利用Python实现可回滚方案的示例代码

《利用Python实现可回滚方案的示例代码》很多项目翻车不是因为不会做,而是走错了方向却没法回头,技术选型失败的风险我们都清楚,但真正能提前规划“回滚方案”的人不多,本文从实际项目出发,教你如何用Py... 目录描述题解答案(核心思路)题解代码分析第一步:抽象缓存接口第二步:实现两个版本第三步:根据 Fea

Java应用如何防止恶意文件上传

《Java应用如何防止恶意文件上传》恶意文件上传可能导致服务器被入侵,数据泄露甚至服务瘫痪,因此我们必须采取全面且有效的防范措施来保护Java应用的安全,下面我们就来看看具体的实现方法吧... 目录恶意文件上传的潜在风险常见的恶意文件上传手段防范恶意文件上传的关键策略严格验证文件类型检查文件内容控制文件存储

Go语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态:

浅析Java如何保护敏感数据

《浅析Java如何保护敏感数据》在当今数字化时代,数据安全成为了软件开发中至关重要的课题,本文将深入探讨Java安全领域,聚焦于敏感数据保护的策略与实践,感兴趣的小伙伴可以了解下... 目录一、Java 安全的重要性二、敏感数据加密技术(一)对称加密(二)非对称加密三、敏感数据的访问控制(一)基于角色的访问

python利用backoff实现异常自动重试详解

《python利用backoff实现异常自动重试详解》backoff是一个用于实现重试机制的Python库,通过指数退避或其他策略自动重试失败的操作,下面小编就来和大家详细讲讲如何利用backoff实... 目录1. backoff 库简介2. on_exception 装饰器的原理2.1 核心逻辑2.2

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

Java实现视频格式转换的完整指南

《Java实现视频格式转换的完整指南》在Java中实现视频格式的转换,通常需要借助第三方工具或库,因为视频的编解码操作复杂且性能需求较高,以下是实现视频格式转换的常用方法和步骤,需要的朋友可以参考下... 目录核心思路方法一:通过调用 FFmpeg 命令步骤示例代码说明优点方法二:使用 Jaffree(FF

基于C#实现MQTT通信实战

《基于C#实现MQTT通信实战》MQTT消息队列遥测传输,在物联网领域应用的很广泛,它是基于Publish/Subscribe模式,具有简单易用,支持QoS,传输效率高的特点,下面我们就来看看C#实现... 目录1、连接主机2、订阅消息3、发布消息MQTT(Message Queueing Telemetr