Zookeeper的使用中需要注意的几个点

Zookeeper它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
简单来说zookeeper=文件系统+监听通知机制. 
它相对于用Redis来做服务注册,优点就是能通知。
我们以前做游戏服务的时候,也有一个中心服,就是干这个的。就是好多服务可以注册上来,然后,它可以对注册了监听的服务,进行通知这个变化。
Zookeeper除了注册服务外,还可以管比如理配置文件这样的大小不大的小文件。

当安装好Zookeeper后,可以用它自带的客户端,进行各种操作。我们的服务,对接这个用的是JAVA的客户端,遇到一些需要注意的地方。如下:
1. 直接写IP:PORT给它做参数的话,遇到了连接非常慢的问题,大概卡住十几秒,是由DNS解析造成的。所以,需要修改host文件,给这个IP配一个简单的域名,初始化的参数,变成HOST:PORT的形式。速度就很快了。
2. 通知是一次性的。当通知回调回来之后,需要重新注册。能监听变化的,比如用zk.exist(path,true)。创建ZK实例的时候,传递的wacher在数据变化的时候,会收到事件通知。
3. ZK客户端内部在disconnected之后,会自动重连ZK服务。需要我们重连的是在收到Expired事件之后,如果收到了这个,代表ZK服务挂了。我们需要重新初始化ZK客户端,进行连接, 然后走一遍注册的流程。

package com.qp;

import org.apache.zookeeper.*;

public class ZKHelper implements Watcher {
    private ZooKeeper zooKeeper = null;

    @Override
    public void process(WatchedEvent event) {
        System.out.println("[ZKHelper======>] receive the event:"+event);
        if(Event.KeeperState.SyncConnected == event.getState()) {
            switch (event.getType()){
                case NodeCreated:
                case NodeDeleted:
                case NodeDataChanged:{
                    try {
                        zooKeeper.exists("/evnet", true);
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }
        }else{
            if(Event.KeeperState.Expired==event.getState()){
                try{
                    zooKeeper.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
                setup();
            }
        }
    }

    public void setup(){
        ZKHelper helper = new ZKHelper();
        try {
            zooKeeper = new ZooKeeper("zk01:2181",5000,helper);
            while(zooKeeper.getState()!=ZooKeeper.States.CONNECTED);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("zookeeper session established");
        /*try {
            zooKeeper.setData("/evnet", (System.currentTimeMillis()+"").getBytes(), -1);
        }catch (Exception e){
            e.printStackTrace();
        } */
        try {
            zooKeeper.exists("/evnet", true);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public void close(){
        if(zooKeeper != null) {
            try {
                zooKeeper.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            zooKeeper = null;
        }
    }

    public static void main(String[] args){
        new ZKHelper().setup();
        while(true){
            try{
                Thread.currentThread().sleep(Integer.MAX_VALUE);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Java使用Zookeeper需要先安装Zookeeper服务端并启动,然后在Java程序通过使用Zookeeper客户端库来连接和操作Zookeeper服务端。 可以使用Apache的Curator库来简化Zookeeper的Java操作。 在pom.xml文件加入依赖: ```xml <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>x.x.x</version> </dependency> ``` 连接Zookeeper服务端: ```java CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", new RetryNTimes(10, 5000)); client.start(); ``` 其,"localhost:2181"是Zookeeper服务端的地址,RetryNTimes是重试策略。 然后可以使用client对象来进行操作,如创建节、获取节数据、监听节变化等。 示例: ```java client.create().forPath("/example", "data".getBytes()); byte[] data = client.getData().forPath("/example"); System.out.println(new String(data)); ``` 需要注意的是,在使用完client后,要记得关闭连接。 ```java client.close(); ``` 可以查看Curator的官方文档获取更多使用细节。 ### 回答2: Zookeeper是一个分布式的开源协调服务,用于管理和协调分布式应用程序的配置信息、命名服务、分布式锁等等。在Java使用Zookeeper,可以通过以下几个步骤实现。 首先,需要在Java项目引入Zookeeper的依赖库。可以通过在项目的pom.xml文件添加相应的依赖来实现,例如: ```xml <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.6.2</version> </dependency> ``` 接下来,需要创建Zookeeper的客户端连接。可以通过ZooKeeper类来实现。例如: ```java ZooKeeper zooKeeper = new ZooKeeper("localhost:2181", 5000, new Watcher() { @Override public void process(WatchedEvent event) { // 处理Zookeeper事件 } }); ``` 在连接成功后,可以通过Zookeeper的API进行各种操作。例如,创建节: ```java String path = "/test"; byte[] data = "Hello Zookeeper".getBytes(); zooKeeper.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); ``` 或者获取节数据: ```java String path = "/test"; byte[] data = zooKeeper.getData(path, false, null); String dataStr = new String(data); System.out.println(dataStr); ``` 另外,Zookeeper还提供了许多其他功能,例如监听节变化、分布式锁、分布式队列等等。可以通过Zookeeper的API来实现这些功能。 最后,在应用程序使用Zookeeper后,需要关闭Zookeeper的连接,以释放资源。 ```java zooKeeper.close(); ``` 总之,通过在Java项目引入Zookeeper依赖,创建Zookeeper客户端连接,并使用Zookeeper的API,可以实现对分布式协调服务的使用。 ### 回答3: 在Java使用Zookeeper主要包括以下步骤: 1. 首先,需要安装Zookeeper并启动Zookeeper服务器。可以从官方网站下载Zookeeper,并按照其文档进行安装和配置。启动Zookeeper服务器后,可以通过指定的主机名和端口连接到服务器。 2. 在Java代码使用Zookeeper,首先需要导入Zookeeper相关的依赖包。可以在Maven或Gradle配置文件添加Zookeeper的依赖。 3. 使用Java编写的程序可以使用Zookeeper提供的Java API进行与Zookeeper服务器的交互。首先,需要创建一个Zookeeper客户端实例,并指定连接到Zookeeper服务器的地址。 4. 通过调用Zookeeper客户端实例提供的方法,可以实现对Zookeeper服务器的各种操作。例如,可以创建、读取、更新和删除Zookeeper。这些操作可以使用的路径进行标识,并使用Java提供的数据结构(例如字符串)来进行数据的存储和传输。 5. 在需要Zookeeper服务器进行交互的地方,可以使用Zookeeper提供的回调机制进行异步编程。通过使用回调函数,可以在收到Zookeeper服务器的响应时执行相应的操作。 6. 在程序运行结束时,需要关闭Zookeeper客户端实例。可以调用客户端实例的`close()`方法来关闭与Zookeeper服务器的连接。 总之,使用Java编写的程序可以通过导入依赖、创建Zookeeper客户端实例和调用提供的API方法,与Zookeeper服务器进行交互并实现节的增删改查等操作。同时,还可以使用Zookeeper提供的回调机制进行异步编程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值