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
- ZooKeeper应用场景-配置管理
- Zookeeper应用--配置管理
- php zookeeper配置管理应用实践
- Zookeeper应用 - 集中配置管理系统的实现
- Zookeeper应用 - 集中配置管理系统的实现
- ZooKeeper实战应用之【统一配置管理】
- ZooKeeper实战应用之【统一配置管理】
- ZooKeeper实战应用之【统一配置管理】
- ZooKeeper实战应用之【统一配置管理】
- Zookeeper配置管理
- Zookeeper配置管理
- Zookeeper系列(三十)Zookeeper场景应用之配置管理中心
- zookeeper应用——集中配置管理系统的实现
- ZooKeeper 笔记(3) 实战应用之【统一配置管理】
- zookeeper应用——集中配置管理系统的实现
- ZooKeeper 笔记(3) 实战应用之【统一配置管理】
- zookeeper分布式配置管理
- zookeeper分布式配置管理
- 微博开发笔记上(未完待续)
- Collections分析之SynchronizedList
- Atitit.检测文本文件的编码 自动获取文件的中文编码
- 轮播图2(jQ)
- 浅谈Android中微信的文本,音频,视频,链接,表情,图片分享接口开发详解
- Zookeeper应用--配置管理
- 自定义UIActionSheet
- 如何在Windows7操作系统下使用g++命令
- mac下使用navicat连接mysql时遇到的问题
- Atitit.swt 线程调用ui控件的方法
- cart2pol函数
- 设计模式之UML类图的常见关系
- MatLab函数:pol2cart()
- hdu5164 Matching on Array map实现ac自动机