SpringBoot集成Curator实现Zookeeper基本操作

news2024/11/29 12:56:39

系列文章目录


文章目录

  • 系列文章目录
  • 前言


前言

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


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 {
 
    @Autowired
    private 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 {
    @Autowired
    private ZkConfiguration zk;
 
    // 测试连接
    @Test
    void contextLoads() {
        CuratorFramework client= zk.curatorFramework();
        System.out.println(client.toString());
    }
 
    // 创建节点
    @Test
    void 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));
    }
 
    // 赋值,修改数据
    @Test
    void 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));
    }
 
    // 查询节点
    @Test
    void 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));
    }
 
    // 删除节点
    @Test
    void deletePath() throws Exception{
        CuratorFramework client= zk.curatorFramework();
        // deletingChildrenIfNeeded如果有子节点一并删除
        // guaranteed必须成功比如网络抖动时造成命令失败
        client.delete().guaranteed().deletingChildrenIfNeeded().inBackground(new BackgroundCallback() {
            @Override
            public 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");
    }
 
    // 查询子节点
    @Test
    void getPaths() throws Exception{
        CuratorFramework client= zk.curatorFramework();
        List<String> paths = client.getChildren().forPath("/javacui");
        for(String p : paths){
            System.out.println(p);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1670391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全场景智能终端RK3288主板在智能垃圾回收项目的应用,支持鸿蒙,支持全国产化

全场景智能终端主板AIoT-3588A推出的智能化垃圾回收项目&#xff0c;旨在解决城市化进程中日益突出的垃圾处理问题。智能垃圾分类箱具备触屏操作、自动称重、分类投放以及电子语音播报提示等多项功能&#xff0c;居民能够经过分类积分卡、手机扫码、人脸识别等多种途径进行投放…

新书首发 |《低代码在制造行业数字化实践》正式出版!

得帆云出书了&#xff01; 得帆云团队编写的《低代码在制造行业数字化实践》正式出版&#xff01; 毫无疑问&#xff0c;对传统开发技术而言&#xff0c;低代码技术是一场技术革命&#xff0c;低代码技术将深刻地影响和改变企业的数字化转型和发展道路。 《低代码在制造行业…

全球家装水管十大名牌排行榜

现代家居装修中&#xff0c;水管都是采用埋墙式施工&#xff0c;为了保证日后的安全用水&#xff0c;最好就选用好的家装水管品牌&#xff0c;避免日后出现爆裂等现象&#xff0c;好的家装水管的质量才有所保障&#xff0c;下面就和下面分享一下全球家装水管十大名牌排行榜。 …

如何在创建之前检测 Elasticsearch 将使用哪个索引模板

作者&#xff1a;来自 Elastic Musab Dogan 概述 Elasticsearch 提供两种类型的索引模板&#xff1a;旧&#xff08;legacy&#xff09;索引模板和可组合 (composable) 索引模板。 Elasticsearch 7.8 中引入的可组合模板旨在替换旧模板&#xff0c;两者仍然可以在 Elasticsear…

一文掌握gRPC

文章目录 1. gRPC简介2. Http2.0协议3. 序列化-Protobuf4. gRPC开发实战环境搭建5. gRPC的四种通信方式&#xff08;重点&#xff09;6. gRPC的代理方式7. SprintBoot整合gRPC 1. gRPC简介 gRPC是由google开源的高性能的RPC框架。它是由google的Stubby这样一个内部的RPC框架演…

钉钉群直播回放保存下来方法

想要永久留存那些不容错过的钉钉群直播精华吗&#xff1f;你是否曾在群直播结束后急切地希望重温那些信息满载的讲解&#xff0c;或是那些激动人心的讨论时刻&#xff1f;现在&#xff0c;你不再需要担忧这些宝贵内容的丢失。这里&#xff0c;我们将带领你通过一些简单的步骤&a…

网络配置的加密存储

随着数据泄露事件的增加&#xff0c;扰乱了公司的正常工作周期&#xff0c;企业遭受了损失。事实上&#xff0c;数据泄露可以通过存储加密来控制&#xff0c;存储加密是防止黑客对网络数据库造成严重破坏的最有效方法之一。在网络配置管理器中&#xff0c;存储加密可用于存储设…

白酒:酒精度数对白酒贮存老熟的影响研究

云仓酒庄豪迈白酒作为一种品质的白酒&#xff0c;其酒精度数对白酒贮存老熟的影响是一个值得探讨的话题。酒精度数作为白酒的一个重要参数&#xff0c;不仅决定了酒体的基本风格&#xff0c;更在很大程度上影响了白酒在贮存过程中的变化和老熟过程。 首先&#xff0c;酒精度数的…

2024年最顶尖的AI驱动SEO工具|TodayAI

在当今数字营销的竞争环境中&#xff0c;获得搜索引擎的高排名至关重要&#xff0c;因为它直接关联到网站的有机流量和品牌的在线影响力。搜索引擎优化&#xff08;SEO&#xff09;是提高网站排名的关键方式&#xff0c;通过优化网站内容和结构来符合搜索引擎的算法要求。然而&…

一站式搭建交友平台-交友系统源码-支持H5小程序+带安装说明+可封装APP-交友网站系统平台搭建

简述 社交交友系统是一种比较复杂的系统&#xff0c;需要涉及到前端、后端、数据库等多个方面。具体实现方式因不同开发者和需求而异。 功能 1、用户注册、登录和注销功能。 2、用户资料填写和修改功能&#xff0c;包括头像、昵称、性别、年龄、个人介绍等信息。 3、用户之间…

SQL_hive的连续开窗函数

SQL三种排序&#xff08;开窗&#xff09;第几名/前几名/topN 1三种排序&#xff08;开窗&#xff09;第几名/前几名/topN思路 4种排序开窗函数 1三种排序&#xff08;开窗&#xff09;第几名/前几名/topN 求每个学生成绩第二高的科目-排序思路 t2表&#xff1a;对每个学生 的…

Windows的消息过程调用与窗口位于同一个线程

消息过程函数和窗口通常在同一个线程中运行。 在Windows中&#xff0c;每个窗口都有一个与之相关联的线程&#xff0c;这个线程负责处理窗口的消息。当窗口接收到消息时&#xff0c;系统会将消息发送给创建窗口的线程&#xff0c;并在该线程上调用窗口过程函数来处理消息。 这…

证件照的制作打印不求人策略

写一期关于证件照的知识吧。 现在手机端有很多支持自拍照&#xff0c;一键更换背景底色变成证件照的软件了&#xff0c;不必再花冤枉钱去照相馆招人PS。直接手机制作好&#xff0c;在某宝或者某多多下单&#xff0c;几块元就给你邮寄到家&#xff0c;非常方便。 自己去打印尽…

Spring整体流程源码分析

DisableEncodeUrlFilter 防止sessionId被泄露 包装器模式 WebAsyncManagerIntegrationFilter WebAsyncManagerIntegrationFilter通常与Spring MVC的异步请求处理机制一起使用&#xff0c;确保在使用Callable或DeferredResult等异步处理方式时&#xff0c;安全上下文能够正…

PSFRGAN量化:量化技术、实现步骤与常见问题解决

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 背景PyTorch 量化量化流程动态量化训练后量化量化感知训练 Eager 模式量化训练后动态量…

numpy(机器学习)

numpy(机器学习) 小白的机器学习学习笔记 2024/5/7 14&#xff1a;22 文章目录 numpy(机器学习)创建矩阵用列表用元组 读取矩阵numpy.arange.reshapenp.linsqacenp.zerosnp.eyenp.ones数组的加减运算矩阵内部计算合并矩阵矩阵转置 学习历史的数据&#xff0c;预测未来发生的情况…

Linux提权--SUDO(CVE-2021-3156)Polkit(CVE-2021-4034)

免责声明:本文仅做技术学习与交流... 目录 SUDO(CVE-2021-3156) 影响版本 -判断&#xff1a; -利用&#xff1a; Polkit(CVE-2021-4034&#xff09; ​ -判断&#xff1a; -利用: 添加用户 SUDO(CVE-2021-3156) another: SUDO权限配置不当. 影响版本 由系统的内核和发…

传统鞋业如何转型?3D数字化技术让鞋业品牌焕发新机!

数字经济时代&#xff0c;3D数字化技术在各行业都得到广泛应用&#xff0c;这其中&#xff0c;传统的鞋服行业的发展也受到了3D数字化技术的影响&#xff0c;产生了深刻的变化&#xff0c;越来越多的鞋企品牌开始尝试3D数字化营销。 比如&#xff0c;时尚运动品牌VANS就在官网上…

Linux开发--Linux字符设备驱动设计

Linux字符设备驱动设计 概述 驱动的定义与功能 计算机系统中存在着大量的设备&#xff0c; 操作系统要求能够控制和管理这些硬件&#xff0c; 而驱动就是帮助操作系统完成这个任务。 驱动相当于硬件的接口&#xff0c; 它直接操作、 控制着我们的硬件&#xff0c; 操作系统通…

单链表经典算法题

一&#xff1a;反转链表&#xff1a; 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 思路一&#xff1a;就是创建一个新的链表&#xff0c;然后将原链表的节点拿过来头插&#xff1a; 首先创建一个新的链表&#xff08;带头链表)&#xff08;哨兵位&#xff09;然后每…