ZooKeeper作为顶级分布式开源我的项目,利用十分宽泛,Dubbo和Kafka这些出名的开源我的项目都在应用。之前只是据说过它,并没有认真钻研过。明天带大家来学习下ZooKeeper,次要从ZooKeeper的装置、可视化工具、利用三方面来介绍,心愿对大家有所帮忙!
SpringBoot实战电商我的项目mall(40k+star)地址:https://github.com/macrozheng/mall
简介
ZooKeeper是一款分布式协调框架,它能够为分布式系统提供一致性服务。ZooKeeper最后由Yahoo开发,起初募捐给了Apache基金会,现已胜利Apache的顶级我的项目,目前在Github上有9.5k+Star。
分布式协调
要了解ZooKeeper咱们首先须要理解下什么是分布式协调
?这里拿Spring Cloud中注册核心的例子来说吧。
微服务(分布式)零碎中有很多服务,雷同的服务又有多个实例,咱们在利用中能够通过服务名来负载平衡地调用服务,而这些服务有可能会挂掉,也有可能会有新的实例退出。此时咱们就须要一个货色来做协调,保留好服务名称和可用实例3调用IP的对应关系,此时注册核心就是一个分布式协调者的角色,而ZooKeeper就能够用来充当这个协调者。
装置
ZooKeeper的装置无论是Windows还是Linux都是很不便的,咱们先来学习下它的装置。
Windows装置
- 首先下载ZooKeeper安装包,下载地址:https://www.apache.org/dyn/cl...
- 解压到指定目录,解压实现后目录构造如下;
- 在
conf
目录下创立配置文件zoo.cfg
,内容如下;
# 设置心跳工夫,单位毫秒tickTime=2000# 存储内存数据库快照的文件夹dataDir=I:/developer/env/apache-zookeeper-3.7.0-bin/data# 监听客户端连贯的端口clientPort=2181
- 进入
bin
目录,启动ZooKeeper服务;
zkServer.cmd
- 服务启动胜利后,控制台会输入如下信息。
Linux装置
- 应用Docker装置ZooKeeper无疑是最不便的,首先咱们下载它的Docker镜像;
docker pull zookeeper:3.7.0
- 创立好ZooKeeper的配置文件目录,并切换到该目录创立配置文件
zoo.cfg
;
mkdir /mydata/zookeeper/conf/ -pcd /mydata/zookeeper/conf/touch zoo.cfg
- 配置文件
zoo.cfg
内容如下,间接应用VIM编辑即可;
# 设置心跳工夫,单位毫秒tickTime=2000# 存储内存数据库快照的文件夹dataDir=/tmp/zookeeper# 监听客户端连贯的端口clientPort=2181
- 运行ZooKeeper容器。
docker run -p 2181:2181 --name zookeeper \-v /mydata/zookeeper/conf/zoo.cfg:/conf/zoo.cfg \-d zookeeper:3.7.0
命令行操作
接下来咱们用命令行来操作下ZooKeeper,相熟下ZooKeeper的应用。
- 首先应用
zkCli
命令行工具连贯到ZooKeeper;
zkCli.cmd -server 127.0.0.1:2181
- 通过
help
能够命令查看ZooKeeper的常用命令;
[zk: 127.0.0.1:2181(CONNECTED) 0] helpZooKeeper -server host:port -client-configuration properties-file cmd args addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE addauth scheme auth close config [-c] [-w] [-s] connect host:port create [-s] [-e] [-c] [-t ttl] path [data] [acl] delete [-v version] path deleteall path [-b batch size] delquota [-n|-b|-N|-B] path get [-s] [-w] path getAcl [-s] path getAllChildrenNumber path getEphemerals path history listquota path ls [-s] [-w] [-R] path printwatches on|off quit reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*] redo cmdno removewatches path [-c|-d|-a] [-l] set [-s] [-v version] path data setAcl [-s] [-v version] [-R] path acl setquota -n|-b|-N|-B val path stat [-w] path sync path version whoami
- 大家都晓得Redis是通过
key-value
的模式存储数据的,而ZooKeeper是通过znode-value
的模式存储数据的,znode有点像目录,而/
目录就是ZooKeeper中的根目录,通过如下命令能够查看所有znode;
[zk: 127.0.0.1:2181(CONNECTED) 1] ls /[zookeeper]
- 创立一个znode叫做
/zk_test
,存储字符串my_data
,这用起来有点像Redis;
[zk: 127.0.0.1:2181(CONNECTED) 2] create /zk_test my_dataCreated /zk_test
- 查看所有znode,能够看到
zk_test
这个znode;
[zk: 127.0.0.1:2181(CONNECTED) 3] ls /[zk_test, zookeeper]
- 获取znode中存储的数据;
[zk: 127.0.0.1:2181(CONNECTED) 4] get /zk_testmy_data
- 批改znode中的数据;
[zk: 127.0.0.1:2181(CONNECTED) 5] set /zk_test test_data[zk: 127.0.0.1:2181(CONNECTED) 6] get /zk_testtest_data
- 删除znode中的数据;
[zk: 127.0.0.1:2181(CONNECTED) 7] delete /zk_test[zk: 127.0.0.1:2181(CONNECTED) 8] ls /[zookeeper]
可视化治理
PrettyZoo
是一款基于 Apache Curator 和 JavaFX 实现的 Zookeeper 图形化治理客户端。颜值很高,举荐应用。
- 首先下载
PrettyZoo
的安装包,下载地址:https://github.com/vran-dev/P...
- 咱们须要创立一个连贯,连贯到ZooKeeper,能够发现
PrettyZoo
是反对通过SSH通道连贯的;
- 双击连贯,咱们能够查看到ZooKeeper中存储的数据,很分明的发现,ZooKeeper是按目录构造存储数据的;
- 右键目录,咱们能够创立和删除znode,有了这个工具,基本上能够和命令行操作说再见了;
- 如果你还是感觉命令行比拟炫酷的话,
PrettyZoo
也实现了命令行性能,关上命令行标签就能够欢快地敲命令了。
节点类型
ZooKeeper中的节点(znode)是有生命周期的,这取决于节点的类型。类型有次要有上面四种:
- 长久节点(Persistent):默认节点类型,节点创立后,会始终存在。
- 长久程序节点(Persistent Sequential):具备长久节点个性,节点名称后会减少自增数字后缀。
- 长期节点(Ephemeral):长期存在,当创立节点的会话敞开时,节点被删除。
- 长期程序节点(Ephemeral Sequential):具备长期节点个性,节点名称后会减少自增数字后缀。
如果你用命令行创立节点的话,程序个性对应-s
选项,长期个性对应-e
选项,比方如下命令:
# 创立长久程序节点create -s /test/seq segText# 创立长期节点create -e /test/tmp tmpText# 创立长期程序节点create -s -e /test/seqTmp setTmpText
创立胜利后显示如下:
如果你用PrettyZoo
来创立的话,只有勾选一个选项即可。
作为注册核心应用
CAP是分布式架构中的重要实践,其包含一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance)。咱们常常应用的Eureka反对AP,而ZooKeeper反对CP。接下来咱们学习下ZooKeeper在Spring Cloud中作为注册核心的利用。
- ZooKeeper作为注册核心应用,用法根本和Eureka和Consul雷同,首先咱们须要在
pom.xml
中增加ZooKeeper的服务发现组件;
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId></dependency>
- 之后批改配置文件
application.yml
,增加ZooKeeper相干配置;
spring: cloud: zookeeper: # zookeeper连贯地址 connect-string: localhost:2181 discovery: # 作为服务注册 register: true # 注册时应用IP地址而不是hostname prefer-ip-address: true
- 这里还是应用《Spring Cloud学习教程》中的例子,有两个服务
zookeeper-ribbon-service
和zookeeper-user-service
,前者通过Ribbon近程调用后者;
- 别离启动两个服务,咱们通过
PrettyZoo
能够发现,当ZooKeeper作为注册核心时,注册服务的名称、IP、端口都被存储到了外面;
- 咱们调用
zookeeper-ribbon-service
中的接口测试下,发现能够失常拜访,接口地址:http://localhost:8301/user/1
- 如果这时候咱们把
zookeeper-user-service
服务关掉的话,咱们能够发现ZooKeeper会主动删除存储的数据;
- 由此能够看出,ZooKeeper作为微服务的注册核心是通过长期节点来实现的,当服务上线时会向ZooKeeper中注册,当服务下线时会被ZooKeeper删除,保障了微服务的高可用。
总结
明天咱们学习了下ZooKeeper的装置、可视化工具PrettyZoo的应用以及ZooKeeper在Spring Cloud中作为注册核心的利用。其实ZooKeeper在分布式系统中还有很多利用,比如说做分布式锁、实现选主性能、取代UUID来生成惟一ID,大家感兴趣的话能够深入研究下!
参考资料
官网文档:https://zookeeper.apache.org/...
我的项目源码地址
https://github.com/macrozheng...
本文 GitHub https://github.com/macrozheng/mall-learning 曾经收录,欢送大家Star!