consul 服务注册发现以及与nginx联动

1.Consul介绍

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。使用起来也较为简单。

2.Consul 安装

Consul 用 golang实现,因此具有天然的可移植性,安装包仅包含一个可执行文件,方便部署。

下载地址:https://www.consul.io/downloads.html

下载完成后,按照如下命令进行安装

[root@service1 ~]# unzip consul_1.0.0_linux_amd64.zip
[root@service1 ~]# mv consul /usr/bin/

安装完成进行验证

[root@service1 ~]# consul -v
Consul v1.0.0
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

3.环境介绍

四台服务器

IP地址主机名操作系统
server(Leader)192.168.28.71Service1Centos 7.2
server(Follower)192.168.28.72Service2Centos 7.2
agent1192.168.28.61Agent1Centos 7.2
agent2192.168.28.62Agent2Centos 7.2

4.建立集群

要想利用Consul提供的服务实现服务的注册与发现,我们需要建立Consul Cluster。在Consul方案中,每个提供服务的节点上都要部署和运行Consul的agent,所有运行Consul agent节点的集合构成Consul Cluster。Consul agent有两种运行模式:Server和Client。这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上 的应用服务无关。以Server模式运行的Consul agent节点用于维护Consul集群的状态,官方建议每个Consul Cluster至少有3个或以上的运行在Server mode的Agent,Client节点不限。

1、启动一个server

[root@service1 ~]# consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=n1 -bind=192.168.28.71 -ui

参数说明:

-server:集群启动为service

-bootstrap-expect:期待加入service节点的数量

-data-dir:数据目录

-node:节点名称,集群中每个节点名称需唯一

-bind:指定一个consul运行时的监听地址

-ui:启动时启动ui

2、启动一个agent

[root@service2 ~]# consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=n2 -bind=192.168.28.72 -ui

3、通过consul members查看当前agent状态,可以看出server1和server2启动后并不知道其他节点的存在。

[root@service1 ~]# consul members
Node  Address             Status  Type    Build  Protocol  DC   Segment
n1    192.168.28.71:8301  alive   server  1.0.0  2         dc1  

4、使用consul join命令触发Cluster bootstrap过程,将192.168.28.72服务器加入当前集群中

[root@service1 ~]# consul members
Node  Address             Status  Type    Build  Protocol  DC   Segment
n1    192.168.28.71:8301  alive   server  1.0.0  2         dc1  
n2    192.168.28.72:8301  alive   server  1.0.0  2         dc1  

5、join后,两台主机互相知道了对方,并进行了leader election过程,server1被选举为leader,server2为follower

[root@service1 ~]# consul info
……
	protocol_version_max = 3
	protocol_version_min = 0
	snapshot_version_max = 1
	snapshot_version_min = 0
	state = Leader
	term = 35
……

server2查看结果

[root@service2 ~]# consul info
……
	protocol_version_max = 3
	protocol_version_min = 0
	snapshot_version_max = 1
	snapshot_version_min = 0
	state = Follower
	term = 2
……

到这里server1和server2就成为了dc1这个数据中心consul cluster的两个节点,而且是用来维护集群状态的server node。Server1被选举为leader,server2是follower。

5.服务注册与发现

我们建立Consul Cluster是为了实现服务的注册和发现。Consul支持两种服务注册的方式,一种是通过Consul的服务注册HTTP API,由服务自身在启动后调用API注册自己,另外一种则是通过在配置文件中定义服务的方式进行注册。Consul文档中建议使用后面一种方式来做服务 配置和服务注册。

5.1.准备工作

服务准备,我已经在agent1和agent2安装了两台web服务器,提供web服务,我现在就把它注册到consul server上。

[root@service1 ~]# curl http://192.168.28.61:10000
service1
[root@service1 ~]# curl http://192.168.28.62:10000
service2
[root@service1 ~]# curl http://192.168.28.61:10000/health
ok
[root@service1 ~]# curl http://192.168.28.62:10000/health
ok

5.2.服务注册

Consul agent在启动时可以通过-config-dir来指定配置文件所在目录,比如以agent1为例,我们可以如此启动agent1:

[root@agent1 ~]# consul agent -data-dir /tmp/consul -node=n3 -bind=192.168.28.61 -config-dir=./conf

这样在./conf下的所有配置文件扩展名为.json的文件都会被consul agent作为配置文件读取

我们在agent1的consul agent的配置文件目录下创建server1.json文件。

{
  "service": {
    "name": "service1",
    "tags": ["master"],
    "address": "192.168.28.61",
    "port": 10000,
    "checks": [
      {
        "http": "http://localhost:10000/health",
        "interval": "10s"
      }
    ]
  }
}

这个配置就是我们在agent1节点上为service1这个服务做的服务定义,定义中包含,name、address、port,还包含一个服务检测的配置,这里我们每隔10秒对服务进行一次健康检查。

上述操作完成之后,我们只需要在service1节点把agent1节点加入集群,agent1就可以自动把服务注册到集群。

我们可以通过集群提供的web页面来查看注册到的服务。(web页面访问端口为8500,需要在server启动时指定ui参数)。

consul-ui-1

我们可以使用同样的方式吧agent2节点加入到集群,加入后ui显示如下:

consul-ui-2

5.3.服务发现

Consul提供了两种发现服务的方式,一种是通过HTTP API查看存在哪些服务;另外一种是通过consul agent内置的DNS服务来做。两者的差别在于后者可以根据服务check的实时状态动态调整available服务节点列表。

在agent1和agent2配置和部署完service1服务后,我们就可以通过DNS命令来查询服务的具体信息了。consul为服务编排的内置域名为 “NAME.service.consul”,这样我们的service1的域名为:service1.service.consul。我们在service1通过dig工具来查看一 下,注意是在service1上,service1上并未定义和部署web3服务,但集群中服务的信息已经被同步到n1上了,信息是一致的。

[root@service1 ~]# dig @127.0.0.1 -p 8600 service1.service.consul SRV

; DiG 9.9.4-RedHat-9.9.4-37.el7 @127.0.0.1 -p 8600 service1.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADERHEADER