源码时代java干货分享|带你认识zookeeper分布式服务框架

IT-source IT-source     2022-12-14     423

关键词:

本质

它是一个分布式服务框架,是Apache Hadoop 的一个子项目

提供一种集中式信息存储服务,用于解决分布式应用中的一些数据管理问题

简单来说 zookeeper = 文件系统 + 监听通知机制。

特点

数据存在内存中

类似文件系统的树形结构(文件和目录)

高吞吐量和低延迟

集群高可靠

作用

实现分布式统一配置中心

服务注册中心

分布式锁等功能

用于分布式应用程序的高性能协调

 

ZK实现配置中心操作

 

ZK 配置节点信息

我们通过 zkui 添加一个节点,并存放一些数据信息

Java 实现

1. pom 引入

<parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>2.0.5.RELEASE</version>

</parent>

<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-configuration-processor</artifactId>

        <optional>true</optional>

    </dependency>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-test</artifactId>

    </dependency>

    <dependency>

        <groupId>junit</groupId>

        <artifactId>junit</artifactId>

        <version>4.12</version>

    </dependency>

    

    <dependency>

        <groupId>org.apache.curator</groupId>

        <artifactId>curator-recipes</artifactId>

        <version>4.0.0</version>

    </dependency>

</dependencies>

<properties>

    <java.version>1.8</java.version>

</properties>

 

2. 配置中心

本地配置文件 application.properties 中,需要配置关于Zookeeper配置中心的信息

config.zookeeper.url=127.0.0.1:2181
config.zookeeper.nodename=pay-server-config

 

3. 监听配置修改

当配置中心的数据发生修改,我们需要实时的更新到各个站点去

Zookeeper的订阅发布

zk的发布订阅也就是watch机制,是一个轻量级的设计。

它采用了一种推拉模式

一旦服务端感知数据发生了变化,那么会发送一个事件类型和节点信息给关注的客户端,而不会包括具体的变更内容,所以事件本身是轻量级的,这就是所谓的“推”部分。然后,收到变更通知的客户端需要自己去拉变更的数据,这就是“拉”部分。

 

4. Java客户端实现

@Configuration
public class ZkConfig

    @Value("$config.zookeeper.url")
    String zkUrl;   // 配置文件读取zk的地址
    @Value("$config.zookeeper.nodename")
    String nodename;  // 配置所在的节点名

    private Properties properties = new Properties();

    public String getProperty(String key)
        String value = properties.getProperty(key);

        if (StringUtils.isEmpty(value))
            throw new RuntimeException("配置信息不存在");
        
        return value;
    

    @PostConstruct
    public void init()
        CuratorFramework zkclient = CuratorFrameworkFactory.newClient(zkUrl,
                new RetryOneTime(1000));
        zkclient.start();// 启动Zookeeper的连接

        try 
            // 1. 读取zookeeper数据
            HashMap<String, String> configMap = new HashMap<>();
            List<String> configKeys = zkclient.getChildren().forPath("/" + nodename);
            for (String configKey : configKeys)
                byte[] data = zkclient.getData().forPath("/" + nodename + "/" + configKey);
                configMap.put(configKey, new String(data));
            

            // 2. 把数据存储到 properties中
            properties.putAll(configMap);

            // 3. 配置发生修改  -->  watch监听机制
            TreeCache treeCache = new TreeCache(zkclient, "/" + nodename);
            treeCache.start(); // 监听整个节点内的数据变化

            treeCache.getListenable().addListener(new TreeCacheListener()
                @Override
                public void childEvent(CuratorFramework curatorFramework,

      •    TreeCacheEvent treeCacheEvent) throws Exception 
                           // 如果zk中有数据变化,执行相应的代码
                           switch (treeCacheEvent.getType())
                               case NODE_UPDATED:
                               System.out.println("数据发生了变化: "+treeCacheEvent.getData());

                               String key = treeCacheEvent.getData().getPath().replace("/"+nodename+"/","");
                               String value = new String(treeCacheEvent.getData().getData());
                               properties.setProperty(key, value);
                                 break;
                               default:
                                 break;// 其他情况不做处理
      •        
                         
                     );
                   catch (Exception e)
                      e.printStackTrace();
                  
             

 

源码时代软测干货分享|带你了解cgi支持模块

该模块定义了许多由Python编写的CGI脚本使用的实用程序。 21.2.1。介绍HTTP服务器调用CGI脚本,通常用于处理通过HTML<FORM>或<ISINDEX>元素提交的用户输入。 通常,CGI脚本存在于服务器的特殊cgi-bin目录中。HTTP服务器... 查看详情

带你重新认识zookeeper!java项目结构图

为什么阿里巴巴的持久层抛弃hibernate,采用MyBatis框架?原因大概有以下4点:尤其是需要处理大量数据或者大并发情况的网站服务,这也阿里选择MyBatis的原因。MyBatis整体架构不多讲,先看目录图MyBatis源码笔记... 查看详情

源码时代java干货分享|springsecurity快速上手秘籍(代码片段)

前言至今Java能够如此的火爆Spring做出了很大的贡献,它的出现让Java程序的编写更为简单灵活,而Spring如今也形成了自己的生态圈,今天咱们探讨的是Spring旗下的一个款认证工具:SpringSecurity,如今认证框架主流“sh... 查看详情

源码时代软测干货分享|探索语境驱动测试七大原则

探索式测试的奠基人和积极实践者cemKaner和JamesBach都支持语境驱动测试。语境驱动测试的7条基本原则对于正确理解并应用探索式测试具有重要意义,本文将予以简单讨论。 原则1:任何实践的价值都取决于其语境(Con... 查看详情

源码时代java干货分享|手把手教你用maven构建docker镜像

一、原理分析由于我们开发pc上面没有docker,所以没办法直接打包镜像,所以要调用远程主机docker进行。并且远程主机docker默认不支持远程访问,所以需要开启远程。然后我们在项目中以dockermaven插件方式进行打包镜... 查看详情

源码时代java干货分享|手把手教你springboot配置ssl证书(代码片段)

图说明第一步首先去阿里云弄一个免费的SSL证书下载然后放到项目里面的resource路径下这里一定要注意是key-store和key-store-password我在配置时写出了key-password弄了很久没找到原因换成了nginx去配置,最近还是嫌弃服务启动太多改... 查看详情

带你重新认识zookeeper!java在线教程视频

在校生如果你是在校生,你应该趁着在学校的时间夯实基础(比如计算机系统、算法、编译原理等等)不要动不动去搞什么项目,你也搞不出一个让面试官很满意的项目出来,所以根本没必要在项目上面浪费... 查看详情

带你重新认识zookeeper!java在线教程视频

在校生如果你是在校生,你应该趁着在学校的时间夯实基础(比如计算机系统、算法、编译原理等等)不要动不动去搞什么项目,你也搞不出一个让面试官很满意的项目出来,所以根本没必要在项目上面浪费... 查看详情

带你重新认识zookeeper!java开发入门思维导图

阿里系的lazada一面现场(50min)①sync的底层实现,锁优化,和lock的对⽐等②jvm参数调优详细过程,到为什么这么设置,好处,⼀些gc场景,如何去分析gc⽇志③redis数据结构,使⽤场景,微博... 查看详情

源码时代前端干货分享|javascript编程优化,超强入门必备技能!

一、按强类型风格定义变量大家要知道js是一种弱类型语言,定义变量的时候不要太随意,大多数初学者定义变量时,只是声明变量而没有赋值,这样就显得太随意了声明变量的时候,一定要指明变量的类型,告诉解析器,你要... 查看详情

源码时代前端干货分享|swoole开启后无法访问问题

首先说一下环境,由于swoole只能在linux环境中使用,开发者通常使用的windows系统,所以我的swoole是安装在Cygwin环境中的。Cygwin可以在windows系统中运行,提供一个类似linux命令行的环境。同时,也虚拟机不同ÿ... 查看详情

源码时代前端干货分享|new关键字底层原理-执行过程

构造对象关键字:new众所周知,js是用new来产生对象的,那么今天我们就来说说js里new产生对象的构造原理。//人类构造函数functionPeople()People.prototype.index=1;//在原型上绑定一个index属性,值为1varp1=newPeople();//... 查看详情

源码时代ui干货分享|axure基础教程

主界面介绍知识重点一、页面的切换热区:就是可做交互的区域。动态面板:多种状态,可以反复切换。第一步:鼠标选择热区,鼠标左键拖拽到画布中,调整到合适位置,合适大小第二步:在图... 查看详情

干货分享!现在java后端的主流技术(代码片段)

2.ZooKeeper介绍2.1.ZooKeeper由来正式介绍ZooKeeper之前,我们先来看看ZooKeeper的由来,还挺有意思的。下面这段内容摘自《从Paxos到ZooKeeper》第四章第一节,推荐大家阅读一下:ZooKeeper最早起源于雅虎研究院的一个研究... 查看详情

源码时代软测干货分享|jmeter性能测试实战(上)(代码片段)

确认被测项目的性能指标1.1性能测试指标性能测试指标,是性能测试中重要的测试依据,相当于测试用例中的预期结果,由于性能测试属于非功能性测试,在规范的项目中有专门的非功能性需求,但是在互联网高速发展的今天,为了早一... 查看详情

源码时代前端干货分享|从零动手封装一个通用的vue按钮组件

我们在使用目前最主流的前端框架vue在开发过程中,组件是一个非常重要的组成部分,可以这么说,所有的vue应用,都是由一个一个的小组件拼装而成的。正是由于vue组件如此重要,所以vue的生态中,也非常多的UI组件库,其中... 查看详情

源码时代软测干货分享|今天来说说测试转向敏捷路线

尽管跳上敏捷的潮流对企业来说很有诱惑力,但这并不总是那么容易,向敏捷的转变很可能伴随着的是测试方面的一系列挑战。为了使敏捷能够快速交付高质量的产品,测试必须比以往更早地开始介入。 今天,... 查看详情

干货分享!java开发流程图工具(代码片段)

正文ZooKeeper很流行,有个基本的疑问:ZooKeeper是用来做什么的?之前没有ZK,为什么会诞生ZK?OK,解答一下上面的疑问:(下面是凭直觉说的)ZooKeeper是用于简化分布式应用开发的,对开发... 查看详情