乐趣区

关于zookeeper:Spring-Cloud-Zookeeper-实战

引言

行内在构建微服务平台时,选用了 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: true
server:
  port: 9000

启动利用,会打印出很多 Zookeeper 连贯相干的日志:

查看 Zookeeper 服务器的节点信息,在 services/sample-application 节点下挂载了一个 nameUUID 格局的长期节点,节点内存储了该微服务的相干信息。

总结

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

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

退出移动版