前言
本文主要介绍Consul作为注册中心在『云』环境的实践与应用。开始本文介绍之前,首先会简单介绍注册中心基础知识以及相关理论,以便读者更好的理解,随后会重点介绍在『云』环境中使用Consul作为注册中心的实践经验。
注册中心介绍
在微服务架构流行之前,注册中心就已经出现在分布式架构的系统中,随着近些年微服务架构越来越受到开发者的青睐以及云原生理念逐步被开发者接受,注册中心作为微服务架构中最核心的基础设施之一,其重要性不言而喻。
什么是注册中心
在介绍什么是注册中心之前,我们先看一个现实中的例子,相信大家都是用过手机通讯录,我们以此为例:
- 当你想要给【同事A】打电话时,那么你首先在手机通讯录中找到【同事A】,然后通讯录【同事A】的名片中显示其对应的电话号码,可以通过拨打电话号码找到【同事A】;
- 当【同事A】更换了电话号码,并告诉你他的电话号码,你把电话号码保存进通讯录,后续你就可以通讯录方便查找到【同事A】电话号码了;
上述两个场景,其实跟微服务场景中的两个概念非常贴切:
- 服务发现:通过通讯录中【同事A】方便的查询到了其电话号码;
- 服务注册:我们把【同事A】的电话号码保存至通讯录中,方便后续基于【同事A】查询其电话号码;
相信大家都已经理解了这个现实场景,我们再对注册中心做以下说明,注册中心最本质的功能可以看成是一个函数:
# service-name服务名为查询参数,Result代表可用的 endpoints (ip:port) 列表为返回值
Result = F(service-name)
为什么需要注册中心我们还是以上面的例子为例,我相信在实际生活中应该不会有人会记住每个同事的电话号码,况且同事的电话号码可能会发生变化,因此通过这种方式会显得不切合实际,我们只需要记住同事的名字即可,通过同事的名字查询其对应电话号码。相信到这里读者已经发现为什么需要注册中心了。我们在回到分布式架构中,服务调用方只需要记住需要调用服务的逻辑名称即可,可以通过注册中心查询其逻辑名称对应的服务地址。在实际实践过程中还会发现很多问题,如下:
- 服务注册后,如何被及时发现;
- 服务宕机后,如何及时下线;
- 服务如何有效的水平扩展;
- 服务发现时,如何进行路由;
- 注册中心如何实现自身的高可用;
这里问题的解决都依赖于注册中心。简单看,注册中心的功能有点类似于DNS服务器或者负载均衡器,而实际上,注册中心作为微服务的基础组件,可能要更加复杂,也需要更多的灵活性和时效性。
主流注册中心
上面介绍了很多注册中心的基础知识,下面我们重点介绍下目前市面上的主流注册中心:
- Zookeeper:Yahoo公司开发的分布式协调系统,可用于注册中心,目前仍有很多公司使用其作为注册中心;
- Eureka:Netflix开源组件,可用于服务注册发现组件,被广大Spring Cloud开发者熟知;
- Consul: HashiCorp公司推出的产品,其可作为实现注册中心,也是本文介绍的重点;
- Etcd:Etcd官方将其定义为可靠的分布式KV存储;
.......
对于上述注册中心的各项对比,并不是本文的重点,相信各位读者都会根据各自的实际情况选择不同的注册中心,我们重点介绍Consul作为注册中心的实践与应用。
理论
分布式基础理论
相信很多熟悉分布式系统设计的读者都知道CAP理论,CAP理论告诉我们一个分布式系统不可能同时满足一致性(C: Consistency)、可用性(A: Availability)和分区容错性(P: Partition tolerance)。其中这三点主要描述了:
- 一致性:在分布式环境下,多个副本之间能够保持一致的特性,当系统在一致性条件下执行更新操作后,系统的数据还应保持一致性;
- 可用性:指的是系统提供的服务一直处于一个可用的状态;
- 分区容错性:指的是当分布式系统在遇到网络分区后,使得原有的分布式系统被隔离为孤立的区域,仍可以对外提供满足一致性和可用性的服务;
后来,又出现了BASE理论,BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致)三个短语的缩写,其中最终一致性指的是系统中的所有数据副本,在一段时间的同步后,最终能够达到一个一致的状态,因此最终一致性的本质是需要系统保证最终数据能够一致,而不是需要实时保证系统数据的强一致性。
一致性算法Raft
讲了这么多,我们主要为了引出分布式一致性算法。分布式一致性算法允许一组机器像一个整体一样工作,即使其中一些机器出现故障也能够继续工作。为了解决分布式一致性问题,在长期的探索研究中,涌现了一批经典的一致性协议和算法,其中比较著名的是两阶段提交协议、三阶段提交协议、Paxos、ZAB、Raft等。下面我们主要介绍Raft共识算法,其一开始就被设计成一个易于理解和实现的算法;Consul中也是使用Raft协议作为其一致性算法,其他一致性协议有兴趣的读者也可以查阅相关资料。为了提高可理解性,Raft将一致性算法分解为几个关键的模块,下面主要介绍两个重要模块:领导人选举(leader election)、日志复制(Lo