微服务架构系列 - 注册中心篇:Consul 简介与启动流程

- 1 min

微服务架构系列(二十)

Consul 简介

我们前面已经介绍过,Go Micro 默认的注册中心是 mdns,这个是由 Micro 官方自己基于 Go 语言实现的组件。mDNS 是多播 DNS(Multicast DNS)的缩写,是一个零配置的网络服务,不需要 DNS 服务器,也不需要 /etc/hosts 之类的文件,即可在局域网内通过广播实现资源的查询,Go Micro 中的 mdns 组件正式基于这一原理实现服务的注册与发现。

但是 mDNS 这种机制决定了 mdns 只能用作本地局域网的服务发现解决方案,如果是部署到线上的话,需要基于 Go Micro 内置的 consul 组件,该组件基于 Consul Server 作为注册中心,通过 API 与其进行通信实现服务的注册与发现。

注:此外,Go Micro 还支持 gossipmemory 这两个组件作为注册中心,gossip 是一个零依赖注册中心,使用 SWIM 协议来广播服务信息,适用于 P2P 网络;memory 提供的则是基于内存的注册中心,不适用于线上分布式架构。在这四种 Go Micro 框架内置的注册中心组件中,适用于生产环境部署的只有 consul

下面我们就来简单介绍下 Consul。

Consul 是由 HashiCorp 基于 Go 语言开发的,对服务发现、配置和分段提供完整支持的 Service Mesh 解决方案,HashiCorp 这家公司有很多知名产品,比如 Vagrant,还有前面提到的 Go Micro 内置的另外两个注册中心组件 mdnsgossip 也是基于 HashiCorp 公司的开源库进行开发的。

书归正传,Consul 是一个分布式高可用的系统,提供的服务发现、健康检查、配置(KV存储)和分段功能可以被独立使用,比如我们在 Go Micro 微服务这里使用的主要是服务发现功能,也可以被组合起来使用以便构建完整的 Service Mesh。

每个提供服务给 Consul 的节点都运行了一个 Consul 代理(我们之前通过 consul agent -dev 启动的就是 Consul 的代理),服务注册和发现时这些代理不是必须的,它们主要的作用是对服务节点进行健康检查(也可以代理对 Consul Server 的访问,如果部署的是 Consul Server 集群的话)。

服务节点注册信息保存在 Consul Server 中,每个代理可以和一个或多个 Consul Server 进行交互,在整个微服务架构中,Consul Server 作为注册中心承担着服务注册与发现任务,作用异常重要,如果出现问题,则服务注册和发现将不能完成,服务调用失败,因此,在生产环境中,我们会部署一个 Consul Server 集群(3到5台 Consul 服务器),集群会通过分布式一致性协议(基于 Paxos 的 Raft 算法)选举一个领袖并进行数据的同步,当一台机器挂掉,会选举新的领袖,从而提供了系统的可用性。

启动 Consul 代理

关于 Consul 的安装我们前面已经演示过,这里我们重点介绍下 Consul 代理并通过它来演示服务注册与发现的流程。

Consul 代理是 Consul 的核心,完成 Consul 的安装后,必须运行代理(Consul Agent),代理可用于处理服务注册、健康检查、服务查询等,微服务集群中的每台机器上都要运行代理。

代理通常运行为两种模式:serverclient,前者运行在 Consul Server 上,主要参与维护集群状态,承担着额外的责任,保证数据的一致性和可用性,后者运行在部署微服务的节点机器上,用于与服务器节点进行交互实现服务注册、查询和健康检查,相对而言较为轻量级。

此外,我们在前面演示时使用的是 dev 模式,即开发模式,顾名思义,这种模式只能用于开发环境,用来快速启动一个单节点的 Consul,不会持久化任何状态,一旦关闭,所有数据都会消失:

img

下面我们对其中的几个字段做一些说明:

通过这些启动日志可以看到,开发模式下 Consul 代理以 server 模式运行,并且声明作为集群的领袖,同时把自己标记为一个健康的成员。

此时,打开另一个终端窗口,运行 consul members 即可查看 Consul 集群中的所有成员,目前只有一个(后面演示 Consul 集群搭建是会看到更多):

img

要停止 Consul 代理,可以在在代理运行窗口通过 Ctrl+C 实现。

下一篇,我们将演示基于 Consul 作为注册中心的服务节点注册、删除与查询流程。

rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora