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 的组件一共有 5 部分:
- Container 容器;
- Provider 服务提供者;
- Consumer 服务消费者;
- Registry 注册中心;
- Monitor 监控中心。
我们来讲解一下它们之间的调用关系:
- 从 Container 中启动服务提供者 Provider;
- Provider 服务提供者把自己注册到 Registry 注册中心;
- Consumer 服务消费者从 Registry 注册中心订阅服务;
- Registry 注册中心发送 Provider 的服务地址给 Consumer 服务消费者;
- Consumer 服务消费者远程调用 Provider 服务提供者的服务;
- Consumer 和 Provider 的调用情况定时发送到 Monitor 监控中心。
简单的介绍了 Dubbo,接下来我们就来介绍 Zookeeper 在 Dubbo 中的应用。
3.2 Zookeeper 在 Dubbo 中的应用
在 Dubbo 官方网站中的注册中心参考手册中, Dubbo 官方推荐 Zookeeper 作为注册中心。下面是一张来自 Dubbo 官网的 Zookeeper 节点结构图:
我们来分析一下节点的结构,根据 Zookeeper 的树状结构,Dubbo 把节点分为 4 层:
- 第一层为 Root 节点,固定为 dubbo;
- 第二层为服务节点,我们可以根据不同的服务来注册不同的服务节点,同时 Monitor 会监听服务节点;
- 第三层为服务的类型,分别为服务提供者和服务消费者,固定为 providers 和 consumers ;
- 第四层为服务提供者和服务消费者的 URL,如果是 Provider 就会注册到 providers 节点下的临时节点。如果是 Consumer 就注册到 consumers 节点下的临时节点,并且对同一服务下的 providers 开启监听。
我们来总结一下 Zookeeper 作为注册中心的原理:服务提供者把 URL 注册到 providers 下的临时节点,服务消费者从 providers 获取 URL 列表,并对 providers 开启子节点事件的监听。根据 Zookeeper 临时节点的特性,服务提供者只要与 Zookeeper 断开连接,Zookeeper 服务就会把该临时节点移除,此时服务消费者就会收到 providers 的子节点移除事件,然后更新自己的服务提供者的 URL 列表。
4. 总结
在本节内容中,我们学习了在 Kafka 和 Dubbo 中 Zookeeper 的应用,其实 Zookeeper 的应用就是根据它的树状结构,节点的特性以及节点的监听机制,同学们在使用 Zookeeper 时可以利用好这些点。以下是本节内容总结:
- Zookeeper 在 Kafka 中的应用。
- Zookeeper 在 Dubbo 中的应用。