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 还支持
gossip
和memory
这两个组件作为注册中心,gossip 是一个零依赖注册中心,使用 SWIM 协议来广播服务信息,适用于 P2P 网络;memory 提供的则是基于内存的注册中心,不适用于线上分布式架构。在这四种 Go Micro 框架内置的注册中心组件中,适用于生产环境部署的只有consul
。
下面我们就来简单介绍下 Consul。
Consul 是由 HashiCorp 基于 Go 语言开发的,对服务发现、配置和分段提供完整支持的 Service Mesh 解决方案,HashiCorp 这家公司有很多知名产品,比如 Vagrant,还有前面提到的 Go Micro 内置的另外两个注册中心组件 mdns
和 gossip
也是基于 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),代理可用于处理服务注册、健康检查、服务查询等,微服务集群中的每台机器上都要运行代理。
代理通常运行为两种模式:server
或 client
,前者运行在 Consul Server 上,主要参与维护集群状态,承担着额外的责任,保证数据的一致性和可用性,后者运行在部署微服务的节点机器上,用于与服务器节点进行交互实现服务注册、查询和健康检查,相对而言较为轻量级。
此外,我们在前面演示时使用的是 dev
模式,即开发模式,顾名思义,这种模式只能用于开发环境,用来快速启动一个单节点的 Consul,不会持久化任何状态,一旦关闭,所有数据都会消失:
下面我们对其中的几个字段做一些说明:
Node Name
是代理的唯一名称,默认情况下是主机名称,可以通过 -node
选项进行指定;Datacenter
是代理被配置运行的数据中心,默认值是 dc1
,可以通过 -datacenter
选项指定;Server
表明代理以 server 还是 client 模式运行,true
表示 server 模式;Client Addr
表示提供给客户端接口的代理地址,默认是本地 IP 地址,可以通过 -http-addr
选项进行指定;Cluster Addr
用于集群中 Consul 代理间通信的地址和端口集。通过这些启动日志可以看到,开发模式下 Consul 代理以 server
模式运行,并且声明作为集群的领袖,同时把自己标记为一个健康的成员。
此时,打开另一个终端窗口,运行 consul members
即可查看 Consul 集群中的所有成员,目前只有一个(后面演示 Consul 集群搭建是会看到更多):
要停止 Consul 代理,可以在在代理运行窗口通过 Ctrl+C 实现。
下一篇,我们将演示基于 Consul 作为注册中心的服务节点注册、删除与查询流程。