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.71 | Service1 | Centos 7.2 |
server(Follower) | 192.168.28.72 | Service2 | Centos 7.2 |
agent1 | 192.168.28.61 | Agent1 | Centos 7.2 |
agent2 | 192.168.28.62 | Agent2 | Centos 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参数)。
我们可以使用同样的方式吧agent2节点加入到集群,加入后ui显示如下:
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