这篇文章主要介绍了分布式服务框架Zookeeper如何配置管理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
实现说明:
客户端实现zookeeper的watcher事件,监听节点的更新事件,zookeeper管理的节点配置有更新时,客户端会接收到更新事件,并作出相应的处理,本文代码只是一个简单的示例
服务端代码示例
/**
* 包名:com.lencee.demo.zookeeper.config
* 文件名:ConfigManager.java
* 版本信息:
* 日期:2015年1月23日-下午1:28:55
*
*/
package com.lencee.demo.zookeeper.config;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
/**
*
* <p>配置管理类<p>
* <p>维护分布式配置</p>
* @version 2015年1月23日 下午1:28:55
*
*/
public class ConfigManager {
private static ConfigManager configManager = null;
//Zookeeper集群服务地址与端口
private static String zkUrl = "192.168.0.101:11001";
//配置结点根路径
private final static String ROOT = "/myConf";
//结点鉴权方式
private final static String AUTH_TYPE = "digest";
//结点鉴权密码
private final static String AUTH_PWD = "password";
private ZooKeeper zk = null;
private ConfigManager(){}
public synchronized static ConfigManager getInstance() throws Exception{
if (configManager == null) {
configManager = new ConfigManager();
ZooKeeper zk = new ZooKeeper(zkUrl, 3000, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("事件类型:" + event.getType());
}
});
while (zk.getState() != ZooKeeper.States.CONNECTED) {
Thread.sleep(3000);
}
//给这个链接添加认证信息
zk.addAuthInfo(AUTH_TYPE, AUTH_PWD.getBytes());
configManager.setZk(zk);
String rootValue = "测试环境配置";
if(zk.exists(ROOT, true)==null){
//结点不存在
zk.create(ROOT , rootValue.getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);
}
}
return configManager;
}
public void addNode(String path,byte[] data,CreateMode createMode) throws Exception{
if(!path.startsWith("/")){
throw new Exception("传入的路径没有以'/'开始");
}
if(this.zk.exists(ROOT + path, true)==null){
//结点不存在
this.zk.create(ROOT + path, data, Ids.CREATOR_ALL_ACL, createMode);
}
}
public void setDate(String path,byte[] data) throws Exception{
if(this.zk.exists(ROOT + path, true)==null){
addNode(path, data, CreateMode.PERSISTENT);
}else{
zk.setData(ROOT + path, data, -1);
}
}
/**
* zk
*
* @return the zk
* @since 1.0.0
*/
public ZooKeeper getZk() {
return zk;
}
/**
* @param zk the zk to set
*/
public void setZk(ZooKeeper zk) {
this.zk = zk;
}
public static void main(String[] args) throws Exception {
ConfigManager cfm = ConfigManager.getInstance();
//添加数据库配置节点
String path = "/mysql";
String value = "测试环境Mysql配置";
cfm.setDate(path, value.getBytes());
//添加项目配置节点
String octopusPath = "/mysql/octopus";
String octopusValue = "资源系统";
cfm.setDate(octopusPath, octopusValue.getBytes());
//添加连接URL的配置
String urlPath = "/mysql/octopus/url";
String urlValue = "jdbc:mysql://test.xxx.com:3306/octopus?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&failOverReadOnly=false&maxReconnects=10";
cfm.setDate(urlPath, urlValue.getBytes());
//添加连接数据库的用户名配置
String userPath = "/mysql/octopus/username";
String userValue = "octopus";
cfm.setDate(userPath, userValue.getBytes());
//添加连接数据库的密码配置
String pwdPath = "/mysql/octopus/pwd";
String pwdValue = "octopus111";
cfm.setDate(pwdPath, pwdValue.getBytes());
}
}
客户端代码
/**
* 包名:com.lencee.demo.zookeeper.config
* 文件名:ConfigClient.java
* 版本信息:
* 日期:2015年1月23日-下午2:15:49
*
*/
package com.lencee.demo.zookeeper.config;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooKeeper;
/**
*
* <p>配置应用端<p>
* <p>读取分布式配置</p>
* @version 2015年1月23日 下午2:15:49
*
*/
public class ConfigClient implements Watcher{
// Zookeeper集群服务地址与端口
private static String zkUrl = "192.168.0.101:11001";
// 配置结点根路径
private final static String ROOT = "/myConf";
// 结点鉴权方式
private final static String AUTH_TYPE = "digest";
// 结点鉴权密码
private final static String AUTH_PWD = "password";
private ZooKeeper zk = null;
private String url;
private String username;
private String pwd;
public ConfigClient() {
try {
ZooKeeper zk = new ZooKeeper(zkUrl, 3000,this);
while (zk.getState() != ZooKeeper.States.CONNECTED) {
Thread.sleep(3000);
System.out.println();
}
//给这个链接添加认证信息
zk.addAuthInfo(AUTH_TYPE, AUTH_PWD.getBytes());
this.zk = zk;
//读取服务端的配置
reflushValue();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* reflushValue:<p>将配置服务设置的配置更新到对象中</p>
* @since 1.0.0
*/
public void reflushValue() {
try {
this.url = new String(this.zk.getData(ROOT + "/mysql/octopus/url", true, null));
this.username = new String(this.zk.getData(ROOT + "/mysql/octopus/username", true, null));
this.pwd = new String(this.zk.getData(ROOT + "/mysql/octopus/pwd", true, null));
} catch (Exception e) {
e.printStackTrace();
}
}
public void printValues(){
System.out.println("----------------当前配置---------------");
System.out.println("mysql.url:"+this.url);
System.out.println("mysql.username:"+this.username);
System.out.println("mysql.pwd:"+this.pwd);
}
@Override
public void process(WatchedEvent event) {
EventType eventType = event.getType();
if(Watcher.Event.EventType.None==eventType){
System.out.println("事件:连接服务成功");
}else if(Watcher.Event.EventType.NodeCreated==eventType){
System.out.println("事件:节点创建成功");
}else if(Watcher.Event.EventType.NodeChildrenChanged==eventType){
System.out.println("事件:子节点更新成功");
reflushValue();
printValues();
}else if(Watcher.Event.EventType.NodeDataChanged==eventType){
System.out.println("事件:节点更新成功");
reflushValue();
printValues();
}else if(Watcher.Event.EventType.NodeDeleted==eventType){
System.out.println("事件:节点删除成功");
}
}
/**
* url
*
* @return the url
* @since 1.0.0
*/
public String getUrl() {
return url;
}
/**
* username
*
* @return the username
* @since 1.0.0
*/
public String getUsername() {
return username;
}
/**
* pwd
*
* @return the pwd
* @since 1.0.0
*/
public String getPwd() {
return pwd;
}
public static void main(String[] args) throws Exception {
ConfigClient cc = new ConfigClient();
System.out.println("客户端开始运行"+cc);
while(true){
Thread.sleep(3000);
}
}
}
感谢你能够认真阅读完这篇文章,希望小编分享的“分布式服务框架Zookeeper如何配置管理”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/daoying/blog/371073