Zookeeper应用--配置管理

来源:互联网 发布:四叶草引导mac和win7 编辑:程序博客网 时间:2024/06/07 01:51

需求:把连接数据库的配置放在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