java连接zookeeper的3种方式小结

目录
  • java连接zookeeper3种方式
    • 1、使用zookeeper原始api
    • 2、使用ZkClient客户端连接,这种连接比较简单
    • 3、使用curator连接
  • Java集成zookeeper笔记
    • 一、引入zookeeper-3.4.5.jar(原生zk包)
    • 二、手写ZookeeperBase.java

java连接zookeeper3种方式

1、使用zookeeper原始api

public class Demo {
    private static String ip = "192.168.0.101:2181";
    private static int  session_timeout = 40000;
    private static CountDownLatch latch = new CountDownLatch(1);
    public static void main(String[] args) throws Exception {
        ZooKeeper zooKeeper = new ZooKeeper(ip, session_timeout, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                if(watchedEvent.getState() == Event.KeeperState.SyncConnected) {
                    //确认已经连接完毕后再进行操作
                    latch.countDown();
                    System.out.println("已经获得了连接");
                }
            }
        });

        //连接完成之前先等待
        latch.await();
        ZooKeeper.States states = zooKeeper.getState();
        System.out.println(states);
    }
}

打印:

如果打印出来的状态为 CONNECTED 则表示连接成功

2、使用ZkClient客户端连接,这种连接比较简单

public class ZkClientTest {
    private static String ip = "192.168.0.101:2181";
    private static int  session_timeout = 40000;
    public static void main(String[] args) {
        ZkClient zkClient = new ZkClient(ip,session_timeout);
        System.out.println(zkClient.getChildren("/"));
    }
}

打印:

3、使用curator连接


public class CuratorDemo {
    //ZooKeeper服务地址
    private static final String SERVER = "192.168.0.101:2181";

    //会话超时时间
    private static final int SESSION_TIMEOUT = 30000;

    //连接超时时间
    private static final int CONNECTION_TIMEOUT = 5000;

    /**
     * baseSleepTimeMs:初始的重试等待时间
     * maxRetries:最多重试次数
     *
     *
     * ExponentialBackoffRetry:重试一定次数,每次重试时间依次递增
     * RetryNTimes:重试N次
     * RetryOneTime:重试一次
     * RetryUntilElapsed:重试一定时间
     */
    private static final RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
    public static void main(String[] args) throws Exception {
        //创建 CuratorFrameworkImpl实例
        CuratorFramework client = CuratorFrameworkFactory.newClient(SERVER, SESSION_TIMEOUT, CONNECTION_TIMEOUT, retryPolicy);

        //启动
        client.start();
        System.out.println("连接成功!");
        Object o = client.getChildren().forPath("/");
        System.out.println(o);
    }
}

打印:

Java集成zookeeper笔记

一、引入zookeeper-3.4.5.jar(原生zk包)

slf4j.jar即可,其他还有zkClient和Curator,其中Curator封装的zk客户端组件最好用。

二、手写ZookeeperBase.java

少废话,上代码:

简单的创建连接和增删改查操作:

public class ZookeeperBase{
	//zk集群地址(端口号为客户端端口号)
	private static final String CONNECT_ADDR = "192.168.241.127:2181,192.168.241.128:2181,192.168.241.129:2181";
	//session 超时时间,单位毫秒
	private static final int SESSION_OUTTIME = 5000;
	//用于阻塞程序执行,直到zk成功连接后再发送继续执行信号,因为zk建立连接是异步的,阻塞是防止程序在zk成功连接前被调用。
	private static final CountDownLatch contectedSemaphore = new CountDownLatch (1);
	public static void main(String[] args)throws Exception{
		Zookeeper zk = new Zookeeper(CONNECT_ADDR,SESSION_OUTTIME,new Watcher()){
			@override
			public void process(WatcherEvent event){  //WatcherEvent为观察者监听事件

				//获取事件状态(与客户端连接状态相关)
				/*
				* KeeperState:Disconneced        连接失败
				* KeeperState:SyncConnected	 连接成功
				* KeeperState:AuthFailed         认证失败
				* KeeperState:Expired            会话过期
				*/
				KeeperState keeperState = event.getState();

				//获取事件类型(与zknode相关)
				/*
				* EventType:NodeCreated            节点创建
				* EventType:NodeDataChanged        节点的数据变更
				* EventType:NodeChildrentChanged   子节点下的数据变更
				* EventType:NodeDeleted            节点删除
				* EventType:None                   刚连接什么都没做
				*/
				EventType eventType  = event.getType();

				//成功建立连接(固定写法)
				if(KeeperState.SyncConnected == keeperState){
					if(EventType.None == eventType){
						//发送信号让程序继续执行
						contectedSemaphore.countDown();
					}
				}
			}

			//阻塞程序执行
			contectedSemaphore.await();
			//创建节点
			//同步创建
			String newNode = zk.create("/testRoot","data".getBytes(),ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
			/*
			*参数1:节点路径:/testRoot,原生api不允许递归创建节点,即没有父节点不允许直接连带父子节点一起创建。创建节点是要写全路径,例如:/testRoot/children。
			*参数2:节点内容:内容类型为字节数组,不支持存储序列化对象,例如不支持将java对象序列化为json存储,但可以使用java序列化框架,如hession或kyso。
			*参数3:权限控制:在对权限要求不严格情况下都使用OPEN_ACL_UNSAFE开放权限即可。
			*参数4:节点类型:提供了四种类型。
			*PERSISTENT 持久化节点
			*PERSISTENT SEQUENTIAL 持久顺序节点
			*EPHEMERAL 临时节点
			*EPHEMERAL SEQUENTIAL 临时顺序节点
			*/
		};
	}
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 在Java中操作Zookeeper的示例代码详解

    依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.6.0</version> </dependency> 连接到zkServer //连接字符串,zkServer的ip.port,如果是集群逗号分隔 String connectStr = "192.

  • java连接zookeeper实现zookeeper教程

    目录 java连接zookeeper实现zookeeper Java服务端连接Zookeeper,进行节点信息的获取,管理-整理成一个基本工具 添加依赖: <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.3.6</version> </dependency> 具体

  • Java中dubbo+zookeeper微服务架构简介

    目录 1.Apache Dubbo概述 1.1.Dubbo简介 1.2.Dubbo的服务架构 2.服务注册中心 Zookeeper 2.1.ZooKeeper介绍 2.2.ZooKeeper安装 2.3.启动 ZooKeeper 3.ZooKeeper快速入门 3.1.服务提供方 3.2.服务消费方 3.3.问题思考 4. Dubbo管理控制台 4.1.安装 5. Dubbo相关配置 5.1.包扫描 5.2.Dubbo 协议 5.3.负载均衡 5.4. Dubbo无法发布被事务代理的服务 1.A

  • java Zookeeper简述

    目录 Zookeeper 角色 Leader Follower Observer Zookeeper 工作原理(原子广播) Znode 四种形式的目录节点 ZooKeeper 安装和使用 常用命令 总结 Zookeeper 是一个分布式协调服务,可用于服务发现,分布式锁,分布式领导选举,配置管理等.Zookeeper 提供了一个类似于 Linux 文件系统的树形结构(可认为是轻量级的内存文件系统,但只适合存少量信息,完全不适合存储大量文件或者大文件),同时提供了对于每个节点的监控通知机制. Zo

  • 如何使用Java操作Zookeeper

    简介 Java操作Zookeeper有很多种方式,如zookeeper.zkclient.curator等等,下面介绍下使用zkclient的方式操作Zookeeper. Maven依赖: <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.11</version> </dependency&g

  • Java调用Zookeeper的实现步骤

    目录 watch机制 常用API JAVA调用 watch机制 Zookeeper watch是一种监听通知机制,可以随时监听一些数据的变化,从而实现数据的及时性. Zookeeper所有的读操作getData(), getChildren()和 exists()都可以设置监听(watch).[写操作则是不能设置监视点的.] Watch的三个关键点: 一次有效:当设置监视的数据发生改变时,该监视事件会被发送到客户端,并且该监听将会停止,除非重启注册监听: 顺序保证:网络延迟或者其他因素可能导致不

  • Java之Zookeeper注册中心原理剖析

    RPC框架中有3个重要的角色: 注册中心 :保存所有服务的名字,服务提供者的IP列表,服务消费者的IP列表 服务提供者: 提供跨进程服务 服务消费者: 寻找到指定命名的服务并消费. Zookeeper用作注册中心 简单来讲,zookeeper可以充当一个服务注册表(Service Registry),让多个服务提供者形成一个集群,让服务消费者通过服务注册表获取具体的服务访问地址(IP+端口)去访问具体的服务提供者.如下图所示: 具体来说,zookeeper就是个分布式文件系统,每当一个服务提供者

  • java连接zookeeper的3种方式小结

    目录 java连接zookeeper3种方式 1.使用zookeeper原始api 2.使用ZkClient客户端连接,这种连接比较简单 3.使用curator连接 Java集成zookeeper笔记 一.引入zookeeper-3.4.5.jar(原生zk包) 二.手写ZookeeperBase.java java连接zookeeper3种方式 1.使用zookeeper原始api public class Demo { private static String ip = "192.168.

  • java定时任务实现的4种方式小结

    1. java自带的Timer Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("Time's up!"); } },3*1000,1000); 2.ScheduledThreadPool-线程池 ScheduledExecutorService scheduledThreadPool = Executors.newS

  • Java 异步实现的几种方式小结

    Java 异步实现的几种方式 1. jdk1.8之前的Future jdk并发包里的Future代表了未来的某个结果,当我们向线程池中提交任务的时候会返回该对象,可以通过future获得执行的结果,但是jdk1.8之前的Future有点鸡肋,并不能实现真正的异步,需要阻塞的获取结果,或者不断的轮询. 通常我们希望当线程执行完一些耗时的任务后,能够自动的通知我们结果,很遗憾这在原生jdk1.8之前是不支持的,但是我们可以通过第三方的库实现真正的异步回调. /** * jdk1.8之前的Future

  • Java 实现并发的几种方式小结

    Java实现并发的几种方法 Java程序默认以单线程方式运行. synchronized Java 用过synchronized 关键字来保证一次只有一个线程在执行代码块. public synchronized void code() { // TODO } Volatile Volatile 关键字保证任何线程在读取Volatile修饰的变量的时候,读取的都是这个变量的最新数据. Threads 和 Runnable public class MyRunnable implements Ru

  • Java对象的复制三种方式(小结)

    1.概述 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的.例如下面程序展示的情况: class Student { private int number; public int getNumber() { return number; } public void setNumber(int number)

  • java解析XML几种方式小结

    java解析XML几种方式小结 第一种:DOM. DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作.通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制. DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依

  • java List去掉重复元素的几种方式(小结)

    使用LinkedHashSet删除arraylist中的重复数据(有序) LinkedHashSet是在一个ArrayList删除重复数据的最佳方法.LinkedHashSet在内部完成两件事: 删除重复数据 保持添加到其中的数据的顺序 List<String> words= Arrays.asList("a","b","b","c","c","d"); HashSet<

  • Java 数组转List的四种方式小结

    目录 第一种方式(未必最佳):使用ArrayList.asList(strArray) 第二种方法(支持增删查改): 第三种方式(通过集合工具类Collections.addAll()方法(最高效)) 第四种方式通过JDK8的Stream流将3总基本类型数组转为List java数组转list误区 一.不能把基本数据类型转化为列表 二.asList方法返回的是数组的一个视图 第一种方式(未必最佳):使用ArrayList.asList(strArray) ​ 使用Arrays工具类Arrays.

  • Springcloud+Mybatis使用多数据源的四种方式(小结)

    前段时间在做会员中心和中间件系统开发时,多次碰到多数据源配置问题,主要用到分包方式.参数化切换.注解+AOP.动态添加 这四种方式.这里做一下总结,分享下使用心得以及踩过的坑. 分包方式 数据源配置文件 在yml中,配置两个数据源,id分别为master和s1. spring: datasource: master: jdbcUrl: jdbc:mysql://192.168.xxx.xxx:xxxx/db1?......... username: xxx password: xxx drive

  • springboot集成websocket的四种方式小结

    目录 1. 原生注解 2. Spring封装 3. TIO STOMP Session 共享的问题 如何选择 其它 参考链接 1. 原生注解 pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> WebSocketConfi

随机推荐