消息发布与订阅:通过 Etcd 的 Watcher 机制,可以使订阅者订阅他们关心的目录。当消息发布者修改被监控的目录内容时,可以将变化实时通知给订阅者。
Etcd 的集群的基本架构图
相对于其他的组件来讲,Etcd 更为轻量级,部署简单,支持 HTTP 接口。它可以为服务发现提供一个稳定高可用的消息注册仓库,为微服务协同工作提供了有力的支持。
重量级一致性服务系统 ZookeeperZookeeper 作为 Hadoop 和 Hbase 的重要组件,是一个开源的分布式应用协调服务,目前由 Apache 基金会维护,采用 Java 语言开发。Zookeeper 致力于为分布式应用提供一致性服务,它的设计目标是将分布式系统中那些复杂且容易出错的服务封装为简单高效的接口以供开发人员使用。
Zookeeper 底层只提供了两个功能,管理客户端提交的数据和为客户端程序提供数据节点的监听服务。它是一个典型的分布式数据一致性解决方案,基于 ZooKeeper 可以实现服务发现与注册、消息发布与订阅、分布式协调与通知、分布式锁、Master 选举、集群管理和分布式队列等诸多功能。
Zookeeper 集群中存在三种角色,分别为 Leader、Follower 和 Observer,架构图如图所示:
Zookeeper 架构图
Zookeeper 通过 ZAB 协议来保证其数据一致性。ZAB 不是一种通用的分布式一致性算法,它是在 Paxos 算法的基础上,为 Zookeeper 特别设计的崩溃可恢复的原子消息广播协议。ZAB 协议主要包含两种基本模式,崩溃恢复和消息广播:
崩溃恢复模式:在服务启动或者 Leader 服务器崩溃时,ZAB协议就会进入崩溃恢复模式,在所有的 Follower 中选举出 Leader。当选举了新的 Leader 后,集群中有半数与新的Leader 完成状态同步后就会退出恢复模式,进入到消息广播模式。
消息广播模式:ZAB协议消息广播过程使用的是一个原子广播协议,类似于一个二阶段提交,但是又有所不同,并非所有 Follower 节点都返回 Ack 才进行一致性事务完成,而是只需要半数以上即可提交完成一个事务广播。
Zookeeper 为分布式系统提供协调服务,能够有效地支持微服务架构的服务注册和发现机制。同时 Zookeeper 中提供的其他数据一致性解决方案,能够有力支撑微服务中分布式业务的开发。
服务注册与发现组件的对比以上介绍的三种服务注册与发现组件在业界都已经有了广泛的应用,在很多大公司的项目中都能看到它们的身影,比如 Zookeeper 在 Hadoop 体系中发挥了极其重要的分布式协调作用。下面将从特性方面比较他们的异同:
从软件的生态出发,Consul 是以服务发现和配置作为主要功能目标,附带提供了 Key/Value 存储,相对于 Etcd 和 Zookeeper 来讲业务范围较小,更适合于服务注册与发现。Etcd 和 Zookeeper 属于通用的分布式一致性存储系统,被应用于分布式系统的协调工作中,使用范围抽象,具体的业务场景需要开发人员自主实现,如服务发现、分布式锁等。Zookeeper 具备广大的周边生态,在分布式系统中得到了广泛的使用;而 Etcd 以简单易用的特性吸引了大量开发人员,在目前火热的 Kubernetes 中也有应用。仅从服务注册与发现组件的需求来看,选择 Consul 作为服务注册与发现中心能够取得更好的效果;如果系统存在其他分布式一致性协作需求,选择 Etcd 和 Zookeeper 反而能够提供更多的服务支持。
小结本文主要介绍了服务注册与发现的原理,以及常用的几种服务注册与发现组件介绍对比。服务注册与发现在微服务架构中是各个微服务之间的协调者,因此掌握服务注册与发现的基本原理,正确使用服务注册与发现组件是非常重要的一件事。在接下来的文章中,我们将基于 Consul 实现 Go 微服务的服务注册与发现。