您的位置:首页 > 其它

Zookeeper应用--配置管理

2015-09-04 23:45 316 查看
需求:把连接数据库的配置放在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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: