从一个 Demo 说起 Zookeeper 服务端源码
简介
Zookeeper目前是Apache下的开源项目,作为最流行的分布式协调系统之一,我们平时开发中熟知的Dubbo、Kafka、Elastic-Job、Hadoop、HBase等顶级开源项目中的分布式协调功能都是通过借助Zookeeper来实现的,可以看到想要在生产中保障Zookeeper服务的稳定、快速排查系统问题,深入探究Zookeeper系统的原理是有必要的,那Zookeeper是什么呢?
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,可用于实现高度可靠的分布式高性能协调的服务,Zookeeper用于维护配置信息,命名,提供分布式同步以及提供组服务的集中式服务,使用Zookeeper可以实现共识,组管理,领导者选举和状态协议,也可以根据自己的需求来构建分布式应用功能。
作为分布式协调系统,Zookeeper并没有直接采用Paxos算法,而是采用一种被称为ZAB(ZooKeeper Atomic Broadcast)的一致性协议。
分布式算法比较抽象枯燥难懂,这里将通过一个内嵌的Zookeeper服务来启动Zookeeper,方便分析调试,从Zookeeper的启动入门,探究一下Zookeeper源码。
入门
依赖
案例是通过一个Java应用程序来分析的,需要先新建一个Maven项目,然后我们引入Zookeeper的依赖,如下所示:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.8.0</version>
</dependency>
示例
入门案例是一个内嵌式的Zookeeper服务,通过运行main方法即可启动Zookeeper服务。
import org.apache.zookeeper.server.ServerConfig;
import org.apache.zookeeper.server.ZooKeeperServerMain;
import org.apache.zookeeper.server.quorum.QuorumPeerConfig;
import java.io.IOException;
import java.util.Properties;
public class EmbeddedZookeeper {
public static void main(String[] args) throws QuorumPeerConfig.ConfigException, IOException {
//属性设置
Properties properties = new Properties();
//数据目录
properties.setProperty("dataDir", "/tmp");
//服务端口
properties.setProperty("clientPort", "2181");
//属性转为节点配置
QuorumPeerConfig quorumPeerConfig = new QuorumPeerConfig();
quorumPeerConfig.parseProperties(properties);
//服务端配置
ServerConfig configuration = new ServerConfig();
configuration.readFrom(quorumPeerConfig);
//运行Zookeeper服务
ZooKeeperServerMain zkServer = new ZooKeeperServerMain();
zkServer.runFromConfig(configuration);
}
}
代码编写完成之后运行main方法即可启动Zookeeper服务,启动成功之后可以看到如下所示日志,可以看到Zookeeper绑定了2181端口。
客户端连接
Zookeeper服务启动之后就可以使用客户端来建立连接创建节点了,如下所示abc是我新建的一个节点。
当然也可以输入Zookeeper的四字监控命令如mntr查看Zookeeper服务的一个状态。
总结
可以看到启动一个单机版的Zookeeper服务并不复杂只需要配置属性,启动服务即可,前面的整个案例仅仅是一个入门案例可以方便借助开发工具来Debug源码,清晰的了解代码执行过程,更多原理与源码解析可以订阅微信公众号 《中间件源码》 及时获取。