从一个 Demo 说起 Zookeeper 服务端源码

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: Zookeeper目前是Apache下的开源项目,作为最流行的分布式协调系统之一,我们平时开发中熟知的Dubbo、Kafka、Elastic-Job、Hadoop、HBase等顶级开源项目中的分布式协调功能都是通过借助Zookeeper来实现的,可以看到想要在生产中保障Zookeeper服务的稳定、快速排查系统问题,深入探究Zookeeper系统的原理是有必要的,那Zookeeper是什么呢?

从一个 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服务。

importorg.apache.zookeeper.server.ServerConfig;

importorg.apache.zookeeper.server.ZooKeeperServerMain;

importorg.apache.zookeeper.server.quorum.QuorumPeerConfig;

importjava.io.IOException;

importjava.util.Properties;

publicclassEmbeddedZookeeper {

   publicstaticvoidmain(String[] args) throwsQuorumPeerConfig.ConfigException, IOException {

       //属性设置

       Propertiesproperties=newProperties();

       //数据目录

       properties.setProperty("dataDir", "/tmp");

       //服务端口

       properties.setProperty("clientPort", "2181");

       //属性转为节点配置

       QuorumPeerConfigquorumPeerConfig=newQuorumPeerConfig();

       quorumPeerConfig.parseProperties(properties);

       //服务端配置

       ServerConfigconfiguration=newServerConfig();

       configuration.readFrom(quorumPeerConfig);

       //运行Zookeeper服务

       ZooKeeperServerMainzkServer=newZooKeeperServerMain();

       zkServer.runFromConfig(configuration);

   }

}

代码编写完成之后运行main方法即可启动Zookeeper服务,启动成功之后可以看到如下所示日志,可以看到Zookeeper绑定了2181端口。

网络异常,图片无法展示
|

客户端连接

Zookeeper服务启动之后就可以使用客户端来建立连接创建节点了,如下所示abc是我新建的一个节点。

网络异常,图片无法展示
|

当然也可以输入Zookeeper的四字监控命令如mntr查看Zookeeper服务的一个状态。

网络异常,图片无法展示
|

总结

可以看到启动一个单机版的Zookeeper服务并不复杂只需要配置属性,启动服务即可,前面的整个案例仅仅是一个入门案例可以方便借助开发工具来Debug源码,清晰的了解代码执行过程,更多原理与源码解析可以订阅微信公众号  《中间件源码》  及时获取。


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
6月前
|
存储 负载均衡 算法
深入浅出Zookeeper源码(七):Leader选举
对于一个分布式集群来说,保证数据写入一致性最简单的方式就是依靠一个节点来调度和管理其他节点。在分布式系统中我们一般称其为Leader。
203 6
|
4月前
|
API
【想进大厂还不会阅读源码】ShenYu源码-替换ZooKeeper客户端
ShenYu源码阅读。相信大家碰到源码时经常无从下手,不知道从哪开始阅读😭。我认为有一种办法可以解决大家的困扰!至此,我们发现自己开始从大量堆砌的源码中脱离开来😀。ShenYu是一个异步的,高性能的,跨语言的,响应式的 API 网关。
Zookeeper学习---2、客户端API操作、客户端向服务端写数据流程
Zookeeper学习---2、客户端API操作、客户端向服务端写数据流程
Zookeeper学习---2、客户端API操作、客户端向服务端写数据流程
|
6月前
|
存储 设计模式 算法
深入浅出Zookeeper源码(六):客户端的请求在服务器中经历了什么
当我们向zk发出一个数据更新请求时,这个请求的处理流程是什么样的?zk又是使用了什么共识算法来保证一致性呢?带着这些问题,我们进入今天的正文。
173 1
深入浅出Zookeeper源码(六):客户端的请求在服务器中经历了什么
|
6月前
|
Apache
Apache ZooKeeper - 构建ZooKeeper源码环境及StandAlone模式下的服务端和客户端启动
Apache ZooKeeper - 构建ZooKeeper源码环境及StandAlone模式下的服务端和客户端启动
123 2
|
6月前
|
网络协议 数据库
深入浅出Zookeeper源码(五):BadVersionException到底是怎么一回事
最近在开发时偶尔会观测到zk报出`BadVersionException`,后在搜索引起上得知了是乐观锁相关的问题,很快就解决了问题。不过学而不思则罔:无论是单体应用还是分布式系统,在运行过程中总要有一种**机制**来保证数据排他性。接下来,我们就来看看zk是如何实现这种**机制**的。
128 1
|
6月前
|
网络协议 数据库
深入浅出Zookeeper源码(三):会话管理
我们知道zookeeper是一个分布式协同系统。在一个大型的分布式系统中,必然会有大量的client来连接zookeeper。那么zookeeper是如何管理这些session的生命周期呢?带着这个问题,我们进入今天的正文。
122 1
|
6月前
|
存储 设计模式 算法
深入浅出Zookeeper源码(六):客户端的请求在服务器中经历了什么
当我们向zk发出一个数据更新请求时,这个请求的处理流程是什么样的?zk又是使用了什么共识算法来保证一致性呢?带着这些问题,我们进入今天的正文。
134 0
|
6月前
|
Java API 开发者
深入浅出Zookeeper源码(四):Watch实现剖析
用过zookeeper的同学都知道watch是一个非常好用的机制,今天我们就来看看它的实现原理。 在正文开始前,我们先来简单回忆一下watch是什么? zk提供了分布式数据的发布/订阅功能——即典型的发布订阅模型,其定义了一种一对多的订阅关系,能够让多个订阅者同时监听某个主题对象,当这个主题对象自身状态变化时,则会通知所有订阅者。具体来说,则是zk允许一个客户端向服务端注册一个watch监听,当服务端的一些指定事件触发了这个watch,那么就会向该客户端发送事件通知。
108 0
|
6月前
|
存储 关系型数据库 MySQL
深入浅出Zookeeper源码(二):存储技术
在上篇文章中,我们简单提到了Zookeeper的几个核心点。在这篇文章中,我们就来探索其存储技术。在开始前,读者可以考虑思考下列问题: - Zookeeper的数据存储是如何实现的? - Zookeeper进行一次写操作的时候,会发生什么å? - 当一个Zookeeper新加入现有集群时,如何同步现集群中的数据?
80 0