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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值