Dubbo、Zookeeper 学习总结

dubbo、zookeeper 是常用的分布式服务治理服务协调框架,dubbo 是常用 RPC 框架,使用简单易上手,dubbo 除了具有 RPC 功能外还有服务注册服务发现的功能(尽管用的不多),zookeeper 是 Hadoop 开源项目下的一个子项目,常用来作为服务的注册中心,另外 zookeeper 也可以用来做分布式锁。

这篇文章的主要内容如下:

  • dubbo RPC 使用
  • RPC 过程
  • dubbo 使用
  • zookeeper 应用场景
  • zookeeper 做分布式锁

dubbo

dubbo 服务注册与发现机制

dubbo 是常用的 RPC 框架,在使用 RPC 功能前 Provider 需要把提供的服务(API)注册到注册到一个地方,然后 Consumer 进行调用。

过程如下图:

image.png

核心角色:

  • 提供者(Provider)提供具体的服务
  • 消费者(Consumer)调用具体的服务
  • 注册中心(Registry)记录服务的地方,通常记录服务(API 的 URL)
  • 监控中心(Monitor)监控状态

工作流程:

  1. 服务提供者向注册中心等级服务信息(API URL)
  2. 服务消费者订阅注册中心的数据变更
  3. 每当注册中心的服务的地址发生变化,注册中心向消费者推送变更信息
  4. 消费者拿到服务地址后进行 RPC 调用

RPC 过程

RPC(Remote Procedure Call)远程过程调用,是一种可以跨机器跨进程的方法/函数调用,RPC 技术使得传统单体应用得以拆分,以一个个的模块呈现,模块之间通过 RPC 继续协调通信形成整个系统。

RPC 离不开网络,如 TCP 链接,套接字,编解码等。

RPC过程图

RPC 调用过程。消费方从注册中心获取地址,调用具体的接口地址,服务提供方接受到消费方调用接口的信息(接口地址,参数等),然后主动调本地接口并传入消费方给的参数,得到结果后把数据传输给消费方。

dubbo 使用

dubbo 使用 demo 地址:https://github.com/elltor/dubbo-demo

  1. 生产者消费者都引用相同的 API 接口(Provider 主动暴露的)

  2. 暴露 API 的 API 接口通常单独是一个模块

  3. Provider 如何使用

image.png

  1. Consumer 如何使用

image.png

zookeeper

zookeeper 应用场景

  • 配置管理
    • zookeeper 提供了树型目录,目录上可以直接存放数据,zookeeper 作为服务注册中心是,服务提供者的服务地址就是存储在树型目录上的
  • 分布式管理、集群管理
    • 服务注册于发现(基于监听器)
    • 分布式锁 🔒

zookeeper 树型目录

类似 unix/linux 系统的目录系统,zookeeper 有着相似的功能,zookeeper 的目录还能存储数据。

image.png

zookeeper 做分布式锁

分布式锁需要满足几个条件:

  • 保证资源互斥:多个实例同一时刻只有一个能获取到
  • 避免死锁:客户端进程挂掉或由于网络原因(延迟、丢包等)保证锁被释放
  • 高效获取/释放锁:尽量不阻塞获取锁 🔒,获取不到锁及时返回失败等
  • 可重入:看应用场景,如果需要可以设计可重入

zookeeper 做分布式锁的原理:

利用 zookeeper 的临时有序节点,其节点在客户端断开连接后自动删除。

实现步骤:

  1. 当一个客户端要申请锁,要在目录下(如/lock)创建临时节点
  2. 客户端获取该目录下的所有创建的节点,把自己创建的节点与最小的节点进行比较
    1. 如果该客户端创建的节点是最小的,则该客户端可认为获得到了锁
    2. 否则,客户端未获取到锁,则监听比自己小(序号小)的节点删除事件
  3. 此时,竞争锁的客户端由于"得不到锁就监听比自己小的节点“机制就形成了一个线性的获取锁的序列
  4. 当监听事件到来时,重复步骤 2