最近在项目中用到ZooKeeper, 通过Java连接比较容易,.net项目就没那么容易,尤其对于不熟悉Linux的开发人员,这里写点搭建ZooKeeper测试环境的经验,供参考。

背景知识:

Zookeeper的优点和用途就不再赘述,但是关于ZooKeeper的特点和原理还是要清楚,可以参考官方文档:http://zookeeper.apache.org/doc/trunk/zookeeperOver.html

环境准备:

系统:对于ZooKeeper等等开源类的服务端软件,运行环境通常都推荐Linux,所以,建议使用虚拟机安装Linux系统,本文中使用VirtualBox 运行Ubuntu 14.04 ,并且需要安装和配置好JDK。编译ZooKeeperNet 需要在Windows下进行,使用VisualStudio。

虚机网络:通常使用NAT 连接外网,使用网桥进行主机与虚间进行交互。由于公司的网络有特殊限制,所以,我在笔记本上,使用了网桥桥接了笔记本的无线网卡,使用NAT连接有线网卡。由于主机上网也要通过公司的代理,所以也要在Ubuntu中设置相应的代理实现网络访问。

1. Ubuntu中安装ZooKeeper

  1)下载

    http://mirror.bit.edu.cn/apache/zookeeper/

    下载3.4.8  得到文件:zookeeper-3.4.8.tar.gz

2)在Ubuntu中解压文件:   

tar -zxvf  zookeeper-3.4..tar.gz

  3)初始化zookeeper 配置文件:

    zookeeper  默认包含了配置文件,在 zookeeper-3.4.8/conf 目录中,文件名是zoo_sample.cfg,  我们需要的是zoo.cfg文件来运行zookeeper服务,所以,最简单的办法就是复制这个文件即可。

cp zoo_sample.cfg zoo.cfg

  4)运行 zookeeper 服务

#切换至zookeeper的bin目录
rqing@rqing-VirtualBox:~/shared/tools/zookeeper-3.4./bin$ ls
README.txt zkCli.cmd zkEnv.cmd zkServer.cmd zookeeper.out
zkCleanup.sh zkCli.sh zkEnv.sh zkServer.sh #运行 zkServer.sh 启动服务
rqing@rqing-VirtualBox:~/shared/tools/zookeeper-3.4./bin$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/rqing/shared/tools/zookeeper-3.4./bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

5)运行zookeeper 客户端进行验证

#运行 zkCli.sh 启动客户端
rqing@rqing-VirtualBox:~/shared/tools/zookeeper-3.4./bin$ ./zkCli.sh
Connecting to localhost:
2016-05-26 11:29:24,943 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.8--1, built on 02/06/2016 03:18 GMT
2016-05-26 11:29:24,962 [myid:] - INFO [main:Environment@100] - Client environment:host.name=rqing-VirtualBox
2016-05-26 11:29:24,962 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.8.0_91
2016-05-26 11:29:24,976 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2016-05-26 11:29:24,976 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/media/sf_Shared/tools/jdk1.8.0_91/jre
2016-05-26 11:29:24,976 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/home/rqing/shared/tools/zookeeper-3.4.8/bin/../build/classes:/home/rqing/shared/tools/zookeeper-3.4.8/bin/../build/lib/*.jar:/home/rqing/shared/tools/zookeeper-3.4.8/bin/../lib/slf4j-log4j12-1.6.1.jar:/home/rqing/shared/tools/zookeeper-3.4.8/bin/../lib/slf4j-api-1.6.1.jar:/home/rqing/shared/tools/zookeeper-3.4.8/bin/../lib/netty-3.7.0.Final.jar:/home/rqing/shared/tools/zookeeper-3.4.8/bin/../lib/log4j-1.2.16.jar:/home/rqing/shared/tools/zookeeper-3.4.8/bin/../lib/jline-0.9.94.jar:/home/rqing/shared/tools/zookeeper-3.4.8/bin/../zookeeper-3.4.8.jar:/home/rqing/shared/tools/zookeeper-3.4.8/bin/../src/java/lib/*.jar:/home/rqing/shared/tools/zookeeper-3.4.8/bin/../conf:
2016-05-26 11:29:24,976 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2016-05-26 11:29:24,977 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2016-05-26 11:29:24,977 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA>
2016-05-26 11:29:24,977 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux
2016-05-26 11:29:24,977 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=amd64
2016-05-26 11:29:24,977 [myid:] - INFO [main:Environment@100] - Client environment:os.version=3.13.0-85-generic
2016-05-26 11:29:24,977 [myid:] - INFO [main:Environment@100] - Client environment:user.name=rqing
2016-05-26 11:29:24,977 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/home/rqing
2016-05-26 11:29:24,977 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/media/sf_Shared/tools/zookeeper-3.4.8/bin
2016-05-26 11:29:24,986 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@506c589e
Welcome to ZooKeeper!
2016-05-26 11:29:25,244 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2016-05-26 11:29:25,577 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@876] - Socket connection established to localhost/127.0.0.1:2181, initiating session
2016-05-26 11:29:25,778 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x154e80a09410000, negotiated timeout = 30000 WATCHER:: WatchedEvent state:SyncConnected type:None path:null
#运行 ls 命令查看zookeeper 节点
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]

到这里,zookeeper 的测试环境就已经搭建好了

更多操作,参见:http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html

2. 编译ZooKeeperNet

1)下载源代码:

  地址:https://github.com/ExactTargetDev/zookeeper/tree/et-develop

dotnet代码在解压后目录的 zookeeper-et-develop\src\dotnet 下

直接使用VisualStudio编译项目会报缺少依赖的错误。

建议把下载后的文件放到主机与虚机的共享目录中,便于后面使用ant下载依赖。

2)使用ant 下载依赖项, 在Ubuntu上操作

  a. 下载并安装ant: 下载地址:apache-ant-1.9.7-bin.tar.gz

  b. 配置环境变量,修改 ~/.bashrc

$ vim ~/.bashrc

添加如下环境变量:

ANT_HOME=~/shared/tools/apache-ant-1.9.
export $ANT_HOME
PATH=$ANT_HOME/bin:$PATH

c. 切换到 zookeeper-et-develop 目录下,运行ant命令

$ ant

ant 命令会根据目录中build.xml的配置执行依赖项下载,build.xml文件在zookeeper-et-develop目录下。 但是,这时,构建会失败,但并不影响,只要依赖项正常下载就够了。

3)使用VisualStudio编译项目ZooKeeperNet 。这时编译即可成功。

3 编写测试程序

上面编译好了ZooKeeperNet,我们就可以使用了,建议引用项目而不是只引用编译好的dll,这样更便于调试。

建立测试项目,我的习惯是编写一个WinForm程序来做测试。

下面列出关键代码:

1) 建立Watcher类:

 class zkWatcher : IWatcher
{
public delegate void NodeChangeCallBack(string path);
public delegate void ConnStateChangeCallBack(KeeperState state); public NodeChangeCallBack cbNodeChange;
public ConnStateChangeCallBack cbConnection; /// <summary>
/// 自定义构造函数以传递委托
/// </summary>
/// <param name="cbConn">连接状态回调</param>
/// <param name="cbNode">节点变更回调</param>
public zkWatcher(ConnStateChangeCallBack cbConn,NodeChangeCallBack cbNode)
{
this.cbConnection = cbConn;
this.cbNodeChange = cbNode;
} public void Process(WatchedEvent e)
{ if (e.Type == EventType.None)
{
this.cbConnection(e.State);
}
else if (e.Type == EventType.NodeDataChanged)
{
this.cbNodeChange(e.Path);
} } }

2 窗体类

public partial class Form1 : Form
{
private ZooKeeper _zk;
private string _defaultServer = "10.130.201.47:2181"; //默认服务地址,实为Ubuntu中运行的zookeeper服务的地址。
public Form1()
{
InitializeComponent();
toolStripStatusLabel1.Text = "Not Connected";
this.tbServerAddr.Text = _defaultServer;
}
/// <summary>
/// 建立连接
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
string zkConn = this.tbServerAddr.Text;
try
{
zkWatcher w = new zkWatcher(ConnectionCallBack, NodeChangeCallBack);
this._zk = new ZooKeeper(zkConn, new TimeSpan(, , , ), w); //次操作为异步的,需要通过Watcher获取连接状态
}
catch (Exception ex)
{
MessageBox.Show("建立连接失败!");
}
} private void btnCreate_Click(object sender, EventArgs e)
{
//未实现
}
/// <summary>
/// 获取节点,前提为连接已经成功
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnGet_Click(object sender, EventArgs e)
{
try
{
StringBuilder sb = new StringBuilder();
string node = tbNode.Text; var stat = _zk.Exists(node, false); //是否存在
var data = _zk.GetData(node, false, stat); //获取数据,如果没有数据,会返回null
//输出节点值
sb.AppendLine("Value:");
if (data != null)
{
string value = System.Text.Encoding.Default.GetString(data);
sb.AppendLine(value);
}
//输出节点的子节点名
var childList = _zk.GetChildren(node, null); //获取子节点
sb.AppendLine("Children:");
foreach (string child in childList)
{
sb.AppendLine(child);
}
tbResult.Text = sb.ToString(); //输出节点值及自节点名
}
catch (Exception ex)
{
//当连接状态不为已连接时,会触发异常。
} } private void NodeChangeCallBack(string path)
{
//未实现
} /// <summary>
/// 处理连接状态变更
/// </summary>
/// <param name="state"></param>
private void ConnectionCallBack(KeeperState state)
{
this.toolStripStatusLabel1.Text = state.ToString(); }
}

上面是节点查询的实现,实际效果如下

以上通过ZooKeeperNet,实现了.Net对ZooKeeper服务的调用。

使用.net实现ZooKeeper客户端的更多相关文章

  1. 【分布式】Zookeeper客户端

    一.前言 前篇博客分析了Zookeeper的序列化和通信协议,接着继续学习客户端,客户端是开发人员使用Zookeeper最主要的途径,很有必要弄懂客户端是如何与服务端通信的. 二.客户端 2.1 客户 ...

  2. zookeeper 客户端编程

    zookeeper是一个分布式的开源的分布式协调服务,用它可以来现同步服务,配置维护.zookeeper的稳定性也是可以保证的,笔者曾参与过的使用zookeeper的两个应用,一个是用zookeepe ...

  3. ZooKeeper客户端事件串行化处理

    为了提升系统的性能,进一步提高系统的吞吐能力,最近公司很多系统都在进行异步化改造.在异步化改造的过程中,肯定会比以前碰到更多的多线程问题,上周就碰到ZooKeeper客户端异步化过程中的一个死锁问题, ...

  4. zookeeper客户端操作

    ZooKeeper客户端 zkCli.sh 节点的增删改查 在 bin 目录下的  zkCli.sh  就是ZooKeeper客户端 ./zkCli.sh -timeout 5000  -server ...

  5. zookeeper客户端 zkCli使用及常用命令

    上篇(http://www.cnblogs.com/yangzhenlong/p/8270835.html)zk伪集群搭建好后,使用zkCli连接zk服务 切换到zk1/bin 目录,执行zkCli. ...

  6. Zookeeper客户端Curator基本API

    在使用zookeper的时候一般不使用原生的API,Curator,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连.反复注册Watcher和NodeExistsExceptio ...

  7. Zookeeper客户端Curator的使用,简单高效

    Curator是Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更高,简化了Zookeeper客户端的开发量. 1.引入依赖: ...

  8. Zookeeper客户端介绍

    客户端是开发人员使用Zookeeper的主要的途径,以下内容将对Zookeeper的内部原理进行详细的学习和讲解.ZooKeeper的客户端主要有一下几个核心组件组成: Zookeeper:提供客户端 ...

  9. ZooKeeper客户端 zkCli.sh 节点的增删改查

    zkCli.sh 在 bin 目录下的  zkCli.sh  就是ZooKeeper客户端 ./zkCli.sh -timeout 5000  -server 127.0.0.1:2181  客户端与 ...

  10. Zookeeper客户端Curator使用详解

    Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBoot.Curator.Bootstrap写了一个可视化的Web应用: zookeep ...

随机推荐

  1. 总结java编程常用的快捷键

    Eclipse 常用快捷键 Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键. 1. [ALT+/] 此快捷键为用户 ...

  2. ORACLE物化视图具体解释

    一.物化的一般使用方法物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的.普通视图是虚拟表.应用的局限性大,不论什么对视图的查询.oracle ...

  3. jQuery Validate(三)

    这里,我们再说说radio.checkbox.select的验证方式. 1.用新版的写法进行验证. <!DOCTYPE html> <html> <head> &l ...

  4. 疑问:使用find_elements_by_ios_predicate定位元素组,获取元素的index没有按照顺序

    通过ios Appium Inspect查看到的元素信息如下: eList=self.driver.find_elements_by_ios_predicate('type == “XCUIEleme ...

  5. vagrant 介绍,安装与使用

    可以帮你统一团队成员的开发环境.如果你或者你的伙伴创建了一个Vagrantfile,那么你只需要执行vagrant up就行了,所有的软件都会安装并且配置好.团队成员可以通过相同的Vagrantfil ...

  6. 创业做移动互联网App的4个注意事项

    导语:大多数人对于做App还是比較盲目,有个想法立刻就去做了.做出来了才忽然想到市场和推广.我把做移动 互联网App注意事项情给大家列下. 文| 移动互联网李建华 近 来,常常有人问我关于推广的事情, ...

  7. 【剑指Offer学习】【面试题58:二叉树的下一个结点】

    题目:给定一棵二叉树和当中的一个结点.怎样找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,另一个指向父节点的指针. 解题思路 假设一个结点有右子树.那么它的下一个结点就 ...

  8. EntityFramework走马观花之CRUD(下)

    我在Entity Framework系列文章的CRUD上篇中介绍了EF的数据查询,中篇谈到了EF的数据更新,下篇则聊聊EF实现CRUD的内部原理. 跟踪实体对象状态 在CRUD上篇和中篇谈到,为了实现 ...

  9. Navicat Premium创建事件计划调用MySql存储过程

    1.检查事件计划,操作:工具——命令行界面——执行命令 show variables like '%event_scheduler%'; (分号不能丢)—— event_scheduler  ON 表 ...

  10. DBUtils使用详解

    https://blog.csdn.net/samjustin1/article/details/52220423 https://www.cnblogs.com/CQY1183344265/p/58 ...