引言

行内在构建微服务平台时,选用了 Zookeeper 作为服务注册核心。

就分布式 CAP 定理而言,ZookeeperCPEurekaAP,但其实是 AP 场景更适宜服务注册核心的高可用,可用性要比一致性更重要。

目前国内的 Zookeeper 遍及受影响于 Dubbo 的开源,阿里巴巴有一套本人的服务注册核心配合 Dubbo,但该服务注册核心却并未随 Dubbo 一起开源,主观环境限度下,Dubbo 官网举荐应用 Zookeeper 作为服务注册核心,这影响了一大批企业,尽管在起初阿里巴巴官网相干团队曾经公布文章不举荐应用 Zookeeper,但这就像流言和造谣一样,流言流传的范畴远远高于造谣信息的流传范畴。

阿里巴巴为什么不必 ZooKeeper 做服务发现? - 阿里中间件团队博客

所以,如果不是非要用 Zookeeper 搭建服务注册核心的话,本文请选择性观看,就当做是一个对 Zookeeper 的理解学习就好。Zookeeper 依然是一款平凡的框架,当之无愧的分布式顶级我的项目,在数据一致性方面无可匹敌。

再次关上 Spring 官网,不由得感叹开源社区的平凡,在去年学习微服务时,仅有 EurekaZuulFeignRibbonHystrix 等几个组件,现在曾经倒退至 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,其中 0000000008Zookeeper 追加的序列号。该序列号在同一父节点下是惟一的,格局为 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 节点下挂载了一个 nameUUID 格局的长期节点,节点内存储了该微服务的相干信息。

总结

当前有工夫一起学习 Zookeeper 集群及其他支流分布式解决方案。

本文作者:河北工业大学梦云智开发团队 张喜硕