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:
2. Base64Util:
3. BeanUtil:
4. JdbcUtil:
5. ZookeeperUtil:
6. ZookeeperTest:
附 Maven dependencies:
代码结构如下图:
类简介:
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>
相关文章推荐
- 1/X+1/Y=1/N!的两种O(n)做法
- Atitit.检测文本文件的编码 自动获取文件的中文编码
- Atitit.检测文本文件的编码 自动获取文件的中文编码
- 轮播图2(jQ)
- Atitit.检测文本文件的编码 自动获取文件的中文编码
- [转]ibatis中井号跟美元符号区别(#、$)
- 微博开发笔记上(未完待续)
- SGU 194. Reactor Cooling【无源汇上下界最大流】
- C#之Attribute(特性)
- Atitit. 衡量项目规模 ----包含的类的数量 .net java类库包含多少类 多少个api方法??
- Common Lisp 学习笔记(1)
- 排序算法总结
- Atitit. 衡量项目规模 ----包含的类的数量 .net java类库包含多少类 多少个api方法??
- Atitit. 衡量项目规模 ----包含的类的数量 .net java类库包含多少类 多少个api方法??
- 文本编辑工具vim的使用方法练习
- iOS开发-用ZipArchive添加和解压zip包
- apache+tomcat反向代理
- mysql SQL Select 语句 简单应用
- GraphX的基本介绍
- VS2015+OpenCV3.0配置教程