zookeeper如何实现服务节点,集群的管理

一.zookeeper如何实现服务节点,集群的管理

Zookeeper使用实例——服务节点管理
分布式处理中,总会存在多个服务节点同时工作,并且节点数量会随着网络规模的变化而动态增减,服务节点也有可能发生宕机与恢复。面对着动态增减的服务节点,我们如何保证客户请求被服务器正确处理呢。我们可以通过zookeeper临时节点创建与自动删除来掌握服务节点的动态增减。

思路为:

  1. zookeeper 的apach jar包依赖支持 在zookeeper创建临时节点,当session断开时,自动删除临时节点
  2. zookeeper 的apach jar包依赖支持 有监听器模式,能够监听到 临时节点的增加与删除

1、 服务器启动后 在zookeeper创建 (与session同步的 )临时目录

package com.coshaho.learn.zookeeper;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

/**
 * 
 * 服务节点启动后注册到zookeeper
 * @author coshaho
 *
 */
public class AppServer extends Thread
{
    private String clusterNode = "Locks";
    private String serverNode = "mylock";
    private String serverName;
    private long sleepTime;

    public void run()
    {
        try 
        {
            connectZookeeper(serverName);
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }
    public void connectZookeeper(String address) throws Exception 
    {
        ZooKeeper zk = new ZooKeeper("192.168.1.104:12181", 5000, new Watcher() 
        {
            public void process(WatchedEvent event) 
            {}
        });

        // 关键方法,创建包含自增长id名称的目录,这个方法支持了分布式锁的实现
        // 四个参数:
        // 1、目录名称 2、目录文本信息 
        // 3、文件夹权限,Ids.OPEN_ACL_UNSAFE表示所有权限 
        // 4、目录类型,CreateMode.EPHEMERAL_SEQUENTIAL表示创建临时目录,session断开连接则目录自动删除
        String createdPath = zk.create(
                "/" + clusterNode + "/" + serverNode, 
                address.getBytes("utf-8"), 
                Ids.OPEN_ACL_UNSAFE, 
                CreateMode.EPHEMERAL_SEQUENTIAL);
        System.out.println("create: " + createdPath);
        Thread.sleep(sleepTime);
    }
    
    public AppServer(String serverName, long sleepTime)
    {
        this.serverName = serverName;
        this.sleepTime = sleepTime;
    }
}

2、 节点管理服务 监听zookeeper 临时目录节点 创建,删除事件

package com.coshaho.learn.zookeeper;

import java.util.ArrayList;
import java.util.List;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooKeeper;

/**
 * 
 * 客户端注册监听server节点变化
 * @author coshaho
 *
 */
public class AppMaster 
{
    private String clusterNode = "Locks";
    private ZooKeeper zk;
    private volatile List<String> serverList;

    public void connectZookeeper() throws Exception 
    {
        // 注册全局默认watcher
        zk = new ZooKeeper("192.168.1.104:12181", 5000, new Watcher() 
        {
            public void process(WatchedEvent event) 
            {
                if (event.getType() == EventType.NodeChildrenChanged 
                        && ("/" + clusterNode).equals(event.getPath())) 
                {
                    try 
                    {
                        updateServerList();
                    } 
                    catch (Exception e) 
                    {
                        e.printStackTrace();
                    }
                }
            }
        });

        updateServerList();
    }

    private void updateServerList() throws Exception 
    {
        List<String> newServerList = new ArrayList<String>();

        // watcher注册后,只能监听事件一次,参数true表示继续使用默认watcher监听事件
        List<String> subList = zk.getChildren("/" + clusterNode, true);
        for (String subNode : subList)
        {
            // 获取节点数据
            byte[] data = zk.getData("/" + clusterNode + "/" + subNode, false, null);
            newServerList.add(new String(data, "utf-8"));
        }

        serverList = newServerList;
        System.out.println("server list updated: " + serverList);
    }

    public static void main(String[] args) throws Exception 
    {
        AppMaster ac = new AppMaster();
        ac.connectZookeeper();
        Thread.sleep(Long.MAX_VALUE);
    }
}

3、 启动两个服务器 进行测试

package com.coshaho.learn.zookeeper;

public class Server1 
{
    public static void main(String[] args) throws Exception 
    {
        AppServer server1 = new AppServer("Server1", 5000);
        server1.start();
    }
}

package com.coshaho.learn.zookeeper;

public class Server2 
{
    public static void main(String[] args) throws Exception 
    {
        AppServer server1 = new AppServer("Server2", 10000);
        server1.start();
    }
}

4、 运行结果

log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
server list updated: []
server list updated: [Server1]
server list updated: [Server2, Server1]
server list updated: [Server2]
server list updated: []

文章来源:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值