跳到主要内容

ZooKeeper 的应用

1. 前言

在分布式应用中,我们除了单独使用 Zookeeper 来实现分布式锁、配置中心等功能外,在我们使用一些优秀的框架时,比如高性能的分布式流处理平台 Apache Kafka,高性能的 Java RPC 框架 Apache Dubbo,它们也不同程度的依赖于 Zookeeper 服务,来实现一些特定的功能。

在本节内容中,我们就来学习在 Kafka 和 Dubbo 中,是如何使用 Zookeeper 的。

2. Zookeeper 在 Kafka 中的应用

在学习 Zookeeper 在 Kafka 中的应用之前,我们先来简单的了解一下 Kafka。

2.1 Kafka 简介

Apache Kafka 是一个高性能的分布式流处理平台,它可以做什么呢?

  • Kafka 可以发布和订阅消息。
  • Kafka 可以储存消息。
  • Kafka 可以在消息产生时就进行处理。

了解了 Kafka 可以实现的一些功能,接下来我们需要了解的是 Kafka 系统的组成有哪些:

  • Broker: 消息管理者,Kafka 通常使用集群模式来提供服务,集群中的单个 Kafka 节点就称为 Broker;
  • Topic: 消息的主题,用于区分消息的类型,保存在 Broker 中;
  • Partition: 消息的分区,Topic 下可以有一个或者多个分区;
  • Producer: 消息生产者,Producer 将消息发布到 Topic 中,由 Broker 把消息存放到 Partition 中;
  • Consumer:消息消费者,Consumer 从 Broker 中的 Topic 拉取消息,可以拉取多个 Topic 的消息;
  • Consumer Group: 消费者分组,对 Consumer 进行分组,方便对多个 Consumer 进行消息广播;
  • Leader: 分区副本的领导者,当前负责读写操作的 Partition;
  • Follower: Leader 的跟随者,会同步 Leader 的数据,Leader 失效后从 Follower 中选举 Leader ;
  • Offset: Partition 消息的消费数量记录。

简单的了解了 Kafka,接下来我们就来介绍 Zookeeper 在 Kafka 中的应用。

2.2 Zookeeper 在 Kafka 中的应用

  • Topic 配置管理: Topic 的配置会注册到 Zookeeper 中 的 config 节点下,根据 config 节点来动态更新配置;
  • Broker 管理: 在每个 Broker 启动时,都会注册到 Zookeeper 的 brokers 节点下;
  • Topic 及 Partition 管理: Topic 会注册到 brokers 节点下的 topics 节点下,Partition 会注册到 Topic 的节点下;
  • Producer 负载均衡: Producer 将消息发布到 Topic 时,会根据 Zookeeper 的 brokers 节点下的 Broker 来进行动态的负载均衡;
  • Consumer 负载均衡: Consumer 从 Topic 拉取消息时,同样也需要根据 Zookeeper 的 brokers 节点下的 Broker 来进行动态的负载均衡;
  • 消费管理: 每个 Partition 只能被 Consumer Group 中的一个 Consumer 进行消费,因此需要关联 Partition 与 Consumer 之间的关系,将 Consumer 的 Consumer ID 注册到相关联的 Partition 节点的临时节点上;
  • Offset 记录: 在 Consumer 对指定 Partition 进行消息消费的过程中,需要将 Partition 的消费数量记录到 Zookeeper 中。

介绍完一部分 Zookeeper 在 Kafka 中的应用,接下来我们就来介绍在 Dubbo 中 Zookeeper 的应用。

3. Zookeeper 在 Dubbo 中的应用

首先我们来简单的了解一下 Dubbo 是什么,再来介绍 Zookeeper 在 Dubbo 中的应用。

3.1 Dubbo 简介

Apache Dubbo 是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:

  • 面向接口的远程方法调用;
  • 智能容错和负载均衡;
  • 服务自动注册和发现。

下面是一张来自 Dubbo 官网的结构图:

Dubbo 架构图

从图中我们可以看到,Dubbo 的组件一共有 5 部分:

  • Container 容器;
  • Provider 服务提供者;
  • Consumer 服务消费者;
  • Registry 注册中心;
  • Monitor 监控中心。

我们来讲解一下它们之间的调用关系:

  1. 从 Container 中启动服务提供者 Provider;
  2. Provider 服务提供者把自己注册到 Registry 注册中心;
  3. Consumer 服务消费者从 Registry 注册中心订阅服务;
  4. Registry 注册中心发送 Provider 的服务地址给 Consumer 服务消费者;
  5. Consumer 服务消费者远程调用 Provider 服务提供者的服务;
  6. Consumer 和 Provider 的调用情况定时发送到 Monitor 监控中心。

简单的介绍了 Dubbo,接下来我们就来介绍 Zookeeper 在 Dubbo 中的应用。

3.2 Zookeeper 在 Dubbo 中的应用

在 Dubbo 官方网站中的注册中心参考手册中, Dubbo 官方推荐 Zookeeper 作为注册中心。下面是一张来自 Dubbo 官网的 Zookeeper 节点结构图:

我们来分析一下节点的结构,根据 Zookeeper 的树状结构,Dubbo 把节点分为 4 层:

  1. 第一层为 Root 节点,固定为 dubbo;
  2. 第二层为服务节点,我们可以根据不同的服务来注册不同的服务节点,同时 Monitor 会监听服务节点;
  3. 第三层为服务的类型,分别为服务提供者和服务消费者,固定为 providers 和 consumers ;
  4. 第四层为服务提供者和服务消费者的 URL,如果是 Provider 就会注册到 providers 节点下的临时节点。如果是 Consumer 就注册到 consumers 节点下的临时节点,并且对同一服务下的 providers 开启监听。

我们来总结一下 Zookeeper 作为注册中心的原理:服务提供者把 URL 注册到 providers 下的临时节点,服务消费者从 providers 获取 URL 列表,并对 providers 开启子节点事件的监听。根据 Zookeeper 临时节点的特性,服务提供者只要与 Zookeeper 断开连接,Zookeeper 服务就会把该临时节点移除,此时服务消费者就会收到 providers 的子节点移除事件,然后更新自己的服务提供者的 URL 列表。

4. 总结

在本节内容中,我们学习了在 Kafka 和 Dubbo 中 Zookeeper 的应用,其实 Zookeeper 的应用就是根据它的树状结构,节点的特性以及节点的监听机制,同学们在使用 Zookeeper 时可以利用好这些点。以下是本节内容总结:

  1. Zookeeper 在 Kafka 中的应用。
  2. Zookeeper 在 Dubbo 中的应用。