Zookeeper应用--配置管理

需求:把连接数据库的配置放在Zookeeper上,连数据库的时候从Zookeeper上获取配置。

代码结构如下图:
这里写图片描述

类简介:

1. ConnBean和PgConnBean是连接数据库的配置。

2. Base64Util: 提供字符串的编码与解码的方法,其作用在于把配置上传到Zookeeper之前先进行编码。

3. BeanUtil:提供Bean与字符串之间转换的方法。

4. JdbcUtil: 提供过去数据库连接及关闭连接的方法。

5. ZookeeperUtil:提供配置数据上传与获取的方法。

6. ZookeeperTest:测试类。


步骤:

上传配置: 获取连接配置bean,将bean通过JSON转成String,经过Base64编码后上传至Zookeeper。

获取配置:在Zookeeper获取配置,经过Base64解码,得到JSON字符串,转成连接配置bean。


代码:

1. ConnBean和PgConnBean:

import java.io.Serializable;

public abstract class ConnBean implements Serializable {
    /**
     * serialVersionUID:TODO(用一句话描述这个变量表示什么).
     * @since JDK 1.6
     */
    private static final long serialVersionUID = -1990540354324018054L;
    private String url;
    private String username;
    private String password;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public abstract String getDriver();

    @Override
    public String toString() {
        return "ConnBean [url=" + url + ", username=" + username
                + ", password=" + password + ", getDriver()=" + getDriver()
                + "]";
    }

}
public class PgConnBean extends ConnBean {

    /**
     * serialVersionUID:TODO(用一句话描述这个变量表示什么).
     * @since JDK 1.6
     */
    private static final long serialVersionUID = 7234310704709246038L;
    private final static String PG_DRIVER = "org.postgresql.Driver";

    @Override
    public String getDriver() {
        return PG_DRIVER;
    }
}


2. Base64Util:

import org.apache.commons.codec.binary.Base64;

/**
 * ClassName:Base64Util <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Date: 2015年9月4日 下午9:18:51 <br/>
 * 
 * @author John
 * @version
 * @since JDK 1.6
 * @see
 */
public class Base64Util {

    public static byte[] decode(byte[] data) {
        if(date == null){
            return null;
        }
        return Base64.decodeBase64(data);
    }

    public static byte[] encode(String jsonStr) {
        if(jsonStr == null){
            return null;
        }
        return Base64.encodeBase64(jsonStr.getBytes());
    }

}


3. BeanUtil:

import cn.easysw.server.bean.PgConnBean;

import com.alibaba.fastjson.JSON;

/**
 * ClassName:BeanUtil <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Date: 2015年9月4日 下午5:30:16 <br/>
 * 
 * @author John
 * @version
 * @since JDK 1.6
 * @see
 */
public class BeanUtil {

    public static String connBean2Json(PgConnBean connBean) {
        return JSON.toJSONString(connBean);
    }

    public static PgConnBean json2ConnBean(String jsonStr) {
        PgConnBean connBean = JSON.parseObject(jsonStr, PgConnBean.class);
        return connBean;
    }
}


4. JdbcUtil:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import cn.easysw.server.bean.ConnBean;

/**
 * ClassName:JdbcUtil <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason: TODO ADD REASON. <br/>
 * Date: 2015年9月4日 下午10:46:49 <br/>
 * 
 * @author John
 * @version
 * @since JDK 1.6
 * @see
 */
public class JdbcUtil {

    static Connection conn;

    public static Connection getConnection(ConnBean connBean) {
        try {
            Class.forName(connBean.getDriver());
            conn = DriverManager.getConnection(connBean.getUrl(),
                    connBean.getUsername(), connBean.getPassword());
            return conn;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void close() {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}


5. ZookeeperUtil:


import java.io.IOException;

import junit.framework.Assert;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * ClassName:ZookeeperUtil <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason: TODO ADD REASON. <br/>
 * Date: 2015年9月4日 下午9:26:03 <br/>
 * 
 * @author John
 * @version
 * @since JDK 1.6
 * @see
 */
public class ZookeeperUtil {

    private static Logger logger = LoggerFactory.getLogger(ZookeeperUtil.class);

    private static final int DEFAULT_TIMEOUT = 3000;

    private static int timeOut = DEFAULT_TIMEOUT;

    private static String rootPath = "/config";

    private static String zkConn = "127.0.0.1:2181";

    private static ZooKeeper zk;

    static {
        try {
            // 构造函数的watcher是该zookeeper对象的默认watcher,
            // 在API中参数是boolean的时候,如果为true时,就会执行构造函数中的watcer
            zk = new ZooKeeper(zkConn, timeOut, new Watcher() {
                public void process(WatchedEvent event) {
                    // System.out.println("【run default watcher..】");
                    logger.debug("【path: {}】", event.getPath());
                    KeeperState state = event.getState();
                    logger.debug("【state: {}】", state.getIntValue());
                    EventType type = event.getType();
                    logger.debug("【type: {}】", type.getIntValue());
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
            Assert.fail();
        }
    }

    /*
     * 存储数据
     */
    public static void createNode(String data) throws KeeperException,
            InterruptedException {
        String path = getDefaultPath();
        if (exists()) {
            zk.setData(path, Base64Util.encode(data), -1);
            return;
        }
        zk.create(path, Base64Util.encode(data), Ids.OPEN_ACL_UNSAFE,
                CreateMode.PERSISTENT);
    }

    /*
     * 获取数据
     */
    public static String getData() throws KeeperException, InterruptedException {
        String path = getDefaultPath();
        if (exists()) {
            byte[] data = zk.getData(path, true, null);
            return new String(Base64Util.decode(data));
        }
        logger.error("node doesn't exists!");
        return null;
    }

    public static String getDefaultPath() {
        String path = rootPath;
        if (!path.endsWith("/")) {
            path = path.concat("/");
        }
        return path.concat("localhost");
    }

    public static boolean exists() throws KeeperException, InterruptedException {
        Stat stat = zk.exists(getDefaultPath(), true);
        return stat != null;
    }

    public static void close() {
        if (zk != null) {
            try {
                zk.close();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}


6. ZookeeperTest:


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.zookeeper.KeeperException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.easysw.server.bean.ConnBean;
import cn.easysw.server.bean.PgConnBean;
import cn.easysw.server.utils.BeanUtil;
import cn.easysw.server.utils.JdbcUtil;
import cn.easysw.server.utils.ZookeeperUtil;

/**
 * ClassName:ZookeeperTest <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason: TODO ADD REASON. <br/>
 * Date: 2015年9月4日 下午4:58:47 <br/>
 * 
 * @author John
 * @version
 * @since JDK 1.6
 * @see
 */
public class ZookeeperTest {
    private static Logger logger = LoggerFactory.getLogger(ZookeeperTest.class);

    public static void main(String[] args) throws KeeperException,
            InterruptedException, SQLException {
        PgConnBean connBean = (PgConnBean) getConf();
        Connection conn = null;
        try {
            conn = JdbcUtil.getConnection(connBean);
            String sql = "select id,name,score from student";
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int score = rs.getInt("score");
                System.out.println(id + ", " + name + ", " + score);
            }
        } finally {
            if (conn != null) {
                conn.close();
            }
        }

    }

    private static ConnBean getConf() throws KeeperException,
            InterruptedException {
        // 获取配置
        String jsonStr = ZookeeperUtil.getData();
        PgConnBean connBean = BeanUtil.json2ConnBean(jsonStr);
        logger.debug(connBean.toString());
        return connBean;

    }

    public static void uploadConf() throws KeeperException,
            InterruptedException {
        PgConnBean connBean = new PgConnBean();
        connBean.setUrl("jdbc:postgresql://localhost/postgres");
        connBean.setUsername("postgres");
        connBean.setPassword("123456");

        String jsonStr = BeanUtil.connBean2Json(connBean);
        // 发布配置
        ZookeeperUtil.createNode(jsonStr);
    }

}




附 Maven dependencies:

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.1-901-1.jdbc4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.3.6</version>
        </dependency>
        <dependency>
            <groupId>javax.json</groupId>
            <artifactId>javax.json-api</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.2</version>
        </dependency>
        <dependency>
            <groupId>cn.easysw</groupId>
            <artifactId>easysw-log4j</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.10</version>
        </dependency>
    </dependencies>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
zookeeper-3.4.5-cdh5.16.2.tar.gz 是一个压缩文件,其中包含的是 ZooKeeper 分布式协调服务的安装包。ZooKeeper 是一个开源的分布式应用程序协调服务,它为分布式系统提供了高度可靠的协调功能。 在这个压缩文件中,"zookeeper-3.4.5" 表示 ZooKeeper 的版本号为 3.4.5,而 "cdh5.16.2" 则表示此版本是基于 Cloudera 发行版 5.16.2。Cloudera 是一个提供基于 Apache Hadoop 的大数据解决方案的公司,他们针对 ZooKeeper 进行了一些修改和适配,以便更好地与其它 Cloudera 软件产品集成。 .tar.gz 是一个常见的压缩格式,通常用于在 Linux 系统中打包和分发文件。使用该格式,文件被打包成一个.tar 文件,然后使用 gzip 压缩算法进行压缩,最终生成一个.tar.gz 文件。 为了使用这个安装包,我们可以按照以下步骤进行操作: 1. 首先,我们需要解压缩.tar.gz 文件。可以使用命令 "tar -zxvf zookeeper-3.4.5-cdh5.16.2.tar.gz" 解压缩该文件。执行完该命令后,会生成一个目录,其中包含了 ZooKeeper 安装包的所有文件。 2. 进入解压后的目录,在其中可以找到 ZooKeeper 的配置文件、示例配置文件和一些其他的脚本文件。 3. 根据自己的需求,修改配置文件。一般需要修改的配置包括 ZooKeeper 服务器集群的地址和端口,以及一些日志和存储文件的路径。 4. 配置完毕后,可以启动 ZooKeeper 服务器。通过运行脚本文件 "bin/zkServer.sh",以指定的模式(例如单机模式、主从模式等)启动服务器。 5. 一旦服务器启动,您就可以使用 ZooKeeper 客户端与其进行交互了。客户端提供了一组命令,可以帮助您管理分布式系统中的节点和数据。 总之,zookeeper-3.4.5-cdh5.16.2.tar.gz 是一个用于安装和部署 ZooKeeper 的文件压缩包,通过解压缩、配置和启动等步骤,您可以在您的分布式系统中使用 ZooKeeper 提供的协调功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值