引言
行内在构建微服务平台时,选用了 Zookeeper
作为服务注册核心。
就分布式 CAP
定理而言,Zookeeper
做 CP
,Eureka
做 AP
,但其实是 AP
场景更适宜服务注册核心的高可用,可用性要比一致性更重要。
目前国内的 Zookeeper
遍及受影响于 Dubbo
的开源,阿里巴巴有一套本人的服务注册核心配合 Dubbo
,但该服务注册核心却并未随 Dubbo
一起开源,主观环境限度下,Dubbo
官网举荐应用 Zookeeper
作为服务注册核心,这影响了一大批企业,尽管在起初阿里巴巴官网相干团队曾经公布文章不举荐应用 Zookeeper
,但这就像流言和造谣一样,流言流传的范畴远远高于造谣信息的流传范畴。
阿里巴巴为什么不必 ZooKeeper 做服务发现? - 阿里中间件团队博客
所以,如果不是非要用 Zookeeper
搭建服务注册核心的话,本文请选择性观看,就当做是一个对 Zookeeper
的理解学习就好。Zookeeper
依然是一款平凡的框架,当之无愧的分布式顶级我的项目,在数据一致性方面无可匹敌。
再次关上 Spring
官网,不由得感叹开源社区的平凡,在去年学习微服务时,仅有 Eureka
、Zuul
、Feign
、Ribbon
、Hystrix
等几个组件,现在曾经倒退至 30
多个开源组件;现在的 Spring Cloud
,曾经反对 Zookeeper
,成为业界最风行的微服务解决方案。
Zookeeper
官网定义:
ZooKeeper: A Distributed Coordination Service for Distributed Applications.
Zookeeper
:面向分布式应用的分布式协调服务。
装置
Zookeeper
下载地址:Releases - Apache Zookeeper
抉择一个稳固的 Release
版本下载:
Zookeeper
采纳 Java
编写,运行 Zookeeper
之前须要配置 Java
环境。
默认 conf
目录下没有配置文件,此处只做学习应用,创立文件 zoo.cfg
,内容与 zoo_sample.cfg
统一,应用默认配置即可。
在命令行中运行 bin
目录下的 zkServer.cmd
启动 Zookeeper
服务器(若在 Unix
环境下请运行 .sh
脚本,下同)。
启动客户端连贯。
运行 zkCli.cmd
启动 Zookeeper
客户端,是一个可对服务器数据进行操作的命令行界面,与 Redis
相似。
数据结构
援用 Zookeeper
官网的一张图,Zookeeper
的外部数据结构采纳树状构造,以 /
为根节点,相似于 Unix
文件系统,每个节点中能够存储信息。
Zookeeper
节点分为永恒节点、程序节点、长期节点,如下图所示。
永恒节点:节点始终存在,除非显式执行删除命令,永恒节点下能够创立子节点。
程序节点:节点创立之后,Zookeeper
为节点增加一个序列号,如图中的 zk-sequence-node0000000008
,其中 0000000008
为 Zookeeper
追加的序列号。该序列号在同一父节点下是惟一的,格局为 10
位数字,有余 10
位用 0
补齐。
长期节点:该节点的生命周期依赖于创立它的会话,当客户端断开连接后,该节点会被主动删除,长期节点不容许有子节点。
这里的长期节点就非常适合做微服务注册核心。
微服务启动时作为客户端向 Zookeeper
注册,创立蕴含以后微服务信息的长期节点,当微服务下线时,该长期节点主动被 Zookeeper
删除,保障了微服务的高可用。
并且客户端能够增加对节点的监听 watch
,也就是观察者,当节点更新时,会告诉客户端,这样能保障微服务获取到的服务列表始终是最新的。
可视化工具
Zookeeper
的根底命令就不做解说了,Zookeeper
的命令无非是对节点的减少、删除、更新、查问,没有必要深刻学习,作为非专业利用反对人员,简略做理解即可。
这里举荐应用可视化工具对 Zookeeper
进行学习,能够可视化对节点进行操作,不须要打命令那么麻烦了。
zkui - Github
实战
新建 maven
我的项目,增加依赖:
<dependencies> <!-- Zookeeper 服务发现组件 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> </dependency></dependencies>
增加配置:
spring: application: # 利用名 name: sample-application cloud: zookeeper: # Zookeeper 地址,此处演示只应用单 Zookeeper 节点,未部署集群 connect-string: localhost:2181 # 服务发现 discovery: # 注册本身 register: true # 优先注册 IP prefer-ip-address: trueserver: port: 9000
启动利用,会打印出很多 Zookeeper
连贯相干的日志:
查看 Zookeeper
服务器的节点信息,在 services/sample-application
节点下挂载了一个 name
为 UUID
格局的长期节点,节点内存储了该微服务的相干信息。
总结
当前有工夫一起学习 Zookeeper
集群及其他支流分布式解决方案。
本文作者:河北工业大学梦云智开发团队 张喜硕