在项目中使用Curator的Java 客户端搭建后进行长TCP连接和TCP权限配置【Zookeeper】

简介: 在项目中使用Curator的Java 客户端搭建后进行长TCP连接和TCP权限配置【Zookeeper】

长TCP连接

在Zookeeper的运行过程中,客户端会在会话超时的到期范围内向服务器发送请求(包括读写)或ping请求,俗称心跳检测,以完成会话激活,从而保持会话的有效性。

ExpirationTime = CurrentTime + SessionTimeout;
ExpirationTime = (ExpirationTime / ExpirationInterval + 1) * ExpirationInterval;

客户端和服务器之间的连接基于长TCP连接。客户端连接到服务器的默认2181端口,即会话会话。
由于建立了第一个连接,客户端开始会话的生命周期。当客户端从服务器请求ping数据包时,每个会话都可以设置超时。
创建会话
SessionID:会话ID用于唯一标识会话。每次客户端创建会话时,Zookeeper都会为其分配一个全局唯一的sessionID。Zookeeper在sessionID类SessionTrackerImpl中创建源代码。

echo [command] | nc [ip] [port]

超时:会话超时。当客户端构造Zookeeper实例时,它将配置的超时发送给服务器。服务器将根据自己的超时限制最终确认会话的超时。
TickTime:下一个会话的超时点。默认值为2000毫秒。它可以在zoo.cfg配置文件中进行配置,以便于服务器端对会话会话实施桶分割策略管理。
isClosing:此属性标记会话是否已关闭。当服务器检测到会话已过期时,会话将标记为“已关闭”,不会处理会话的新请求。
会话的状态

$ echo ruok | nc 192.168.3.38 2181

以下是一些重要状态:
正在连接:在连接中,一旦会话建立,状态在短时间内为连接状态。
已连接:已连接,连接成功后的状态。
Closed:已关闭,会话到期时发生。通常,由于网络故障,客户端重新连接失败,服务器停机或客户端主动断开连接。
会话超时管理(bucket拆分策略+会话激活)
Zookeeper的引导服务器在重新运行期间定期检查会话超时。时间间隔为ExpirationInterval,单位为毫秒。默认值为tickTime。每次tickTime都会执行会话超时检查。

$ echo conf | nc 192.168.3.38 2181

在这里插入图片描述

使用zookeeper的本地API连接到上一教程中设置的三个服务集群。因为连接需要时间,所以用countDownLatch阻塞它,等待连接成功,控制台将输出连接状态!
在这里插入图片描述

<dependency>
  <groupId>org.apache.zookeeper</groupId>
  <artifactId>zookeeper</artifactId>
  <version>3.4.8</version>
</dependency>
<dependency>
  <groupId>org.apache.curator</groupId>
  <artifactId>curator-framework</artifactId>
  <version>4.0.0</version>
</dependency>

Curator的Java 客户端搭建

Curator是Netflix的一个开源Zookeeper客户端框架,它解决了Zookeepher客户端开发的许多低级细节,包括重新连接、重复注册Watcher和NodeExistsException异常。
策展人包含几个包:
游标框架:封装了zookeeper的底层api。
Curator客户端:提供一些客户端操作,例如重试策略。
Curator拦截:封装了一些高级功能,例如:缓存事件侦听、选举、分布式锁、分布式计数器、分布式屏障等。

public class CuratorDemo {
 
    public static void main(String[] args) throws Exception {
        CuratorFramework curatorFramework=CuratorFrameworkFactory.
                builder().connectString("192.168.3.33:2181," +
                "192.168.3.35:2181,192.168.3.37:2181").
                sessionTimeoutMs(4000).retryPolicy(new
                ExponentialBackoffRetry(1000,3)).
                namespace("").build();
        curatorFramework.start();
        Stat stat=new Stat();
        //查询节点数据
        byte[] bytes =        curatorFramework.getData().storingStatIn(stat).forPath("/runoob");
        System.out.println(new String(bytes));
        curatorFramework.close();
    }
}

长TCP连接

动物园管理员的ACL(访问控制列表)权限在生产环境中尤为重要,因此本章将对其进行介绍。
可以为节点设置ACL权限,以确保数据安全。
权限可以指定不同的权限范围和角色。
ACL命令行

$ getAcl /runoob/child
$ setAcl /runoob/child world:anyone:crwa
$ delete /runoob/child

GetAcl命令:获取节点的acl权限信息。
SetAcl命令:设置节点的acl权限信息。
Addauth命令:输入认证和授权信息,注册时输入明文密码,并以加密形式保存。

$ setAcl /runoob/child auth:user1:123456:cdrwa
$ addauth digest user1:123456
$ setAcl /runoob/child auth:user1:123456:cdrwa
$ getAcl /runoob/child

ACL组成
Zookeeper的ACL通过[scheme:id:ppermissions]形成权限列表。
1.Scheme:表示一定的权限机制,包括world、auth、digest、ip和super。
2.Id:表示允许访问的用户。
3.权限:权限组合字符串,由cdrwa组成,每个字母代表支持的不同权限。创建权限Create(c)、删除权限delete(d)、读取权限read(r)、写入权限write(w)和管理权限admin(a)。
世界实例
查看默认节点权限,然后将节点权限更新为crwa。因此,删除节点失败。世界代表开放许可。

$ ls /runoob
$ create /runoob/child01 runoob
$ getAcl /runoob/child01
$ setAcl /runoob/child01 digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:cdra
$ getAcl /runoob/child01
$ addauth digest user1:123456
$ getAcl /runoob/child01

Zookeeper的观察者机制可以分为四个过程:
客户端注册观察者。
服务器处理观察者。
服务器触发观察者事件。
客户端回调观察者。
客户端有三种方法来注册观察者。调用客户端API可以分别通过getData、exists和getChildren实现。使用上一章中创建的maven项目,创建一个新的WatcherDemo类。
服务器NIOServerCnxn类用于处理客户端发送的请求,最后调用FinalRequestProcessor。有一段源代码添加了客户端发送的观察者事件

  @Override
    public void process(WatchedEvent event) {
        System.out.println("eventType:"+event.getType());
        if(event.getType()==Event.EventType.NodeDataChanged){
            try {
                zooKeeper.exists(event.getPath(),true);
            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

当Zookeeper类调用exists方法时,它将创建事件侦听器封装到请求对象中,将watch属性设置为true,并在服务器返回响应后将侦听器事件封装到客户端的ZKCatchManager类中。

相关文章
|
人工智能 前端开发 Java
2025年WebStorm高效Java开发全指南:从配置到实战
WebStorm 2025不仅是一款强大的JavaScript IDE,也全面支持Java开发。本文详解其AI辅助编程、Java特性增强及性能优化,并提供环境配置、高效开发技巧与实战案例,助你打造流畅的全栈开发体验。
1036 4
|
Java 应用服务中间件 Linux
在Java 12环境中配置和部署Apache Tomcat的步骤。
这段部署Tomcat的冒险旅程充满技术挑战,但同时也像游戏一样充满乐趣。它需要你提前准备,仔细执行,并随时准备解决意外情况。成功后,你就可以在这匹强壮的网络野马上,带着你的Java应用,冲向Web开发的璀璨星空。
406 56
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
536 13
|
存储 搜索推荐 算法
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
本文深入探讨了Java大数据技术在智能金融理财产品风险评估与个性化配置中的关键应用。通过高效的数据采集、存储与分析,Java大数据技术助力金融机构实现精准风险评估与个性化推荐,提升投资收益并降低风险。
Java 大视界 -- Java 大数据在智能金融理财产品风险评估与个性化配置中的应用(195)
|
Linux 网络安全 Docker
尼恩一键开发环境: vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)
尼恩提供了一系列文章,旨在帮助开发者轻松搭建一键开发环境,涵盖Java分布式、高并发场景下的多种技术组件安装与配置。内容包括但不限于Windows和CentOS虚拟机的安装与排坑指南、MySQL、Kafka、Redis、Zookeeper等关键组件在Linux环境下的部署教程,并附带详细的视频指导。此外,还特别介绍了Vagrant这一虚拟环境部署工具,
尼恩一键开发环境: vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)
|
消息中间件 存储 NoSQL
java连接redis和基础操作命令
通过以上内容,您可以掌握在Java中连接Redis以及进行基础操作的基本方法,进而在实际项目中灵活应用。
835 30
|
Java Shell 数据库
【YashanDB知识库】调用外部UDF未能识别Java环境配置
【YashanDB知识库】调用外部UDF未能识别Java环境配置
【YashanDB知识库】调用外部UDF未能识别Java环境配置
|
Java Linux 数据库
java连接kerberos用户认证
java连接kerberos用户认证
579 22
|
Java Linux iOS开发
如何配置 Java 环境变量:设置 JAVA_HOME 和 PATH
本文详细介绍如何在Windows和Linux/macOS系统上配置Java环境变量。
22561 12