参考文献:
https://www.hi-linux.com/posts/6132.html
https://www.tuicool.com/articles/M3QFven
http://dockone.io/article/300
1.Consul简介
Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。Consul是分布式的、高可用的、 可横向扩展的。它具备以下特性:
- 服务发现: Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。
- 健康检测: Consul的Client提供了健康检查的机制,可以通过用来避免流量被转发到有故障的服务上。
- Key/Value存储: 应用程序可以根据自己的需要使用Consul提供的Key/Value存储。 Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。
- 多数据中心: Consul支持开箱即用的多数据中心. 这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。
2.架构
特点:
- Consul Cluster由部署和运行了Consul Agent的节点组成。在Cluster中有两种角色:Server和 Client。
- Server和Client的角色和Consul Cluster上运行的应用服务无关, 是基于Consul层面的一种角色划分.
- Consul Server: 用于维护Consul Cluster的状态信息。 官方建议是: 至少要运行3个或者3个以上的Consul Server。 多个server之中需要选举一个leader, 这个选举过程Consul基于Raft协议实现. 多个Server节点上的Consul数据信息保持强一致性。在局域网内与本地客户端通讯,通过广域网与其他数据中心通讯。
- Consul Client: 只维护自身的状态, 并将HTTP和DNS接口请求转发给服务端。
3. 使用示例
3.1 部署启动Consul
- 在三台节点上部署consul服务,并启动服务:
节点部署方案如下:
node1 : server模式;
node2: server 模式;
node2: client 模式;
node1启动命令:
consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=n1 -bind=10.10.105.71 -dc=dc1
node2启动命令:
consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=n2 -bind=10.10.126.101 -ui-dir ./dist -dc=dc1
node3启动命令:(没有加-server 参数)
consul agent -data-dir /tmp/consul -node=n3 -bind=10.10.126.187 -dc=dc1
- 将node1加入到node2,构建两个server 节点的集群。在node1阿上执行:
consul join 10.10.126.101
- 确认集群状态:
consul members
Node Address Status Type Build Protocol DC
n2 10.10.126.101:8301 alive server 0.5.2 2 dc1
n1 10.10.105.71:8301 alive server 0.5.2 2 dc1
3.2 服务注册与发现
3.2.1 在consul配置文件中定义服务,进行注册
节点服务部署情况:
node1,node2:consul server 模式
node3 :consul client 模式
node2,node3:部署服务web3
步骤:
- 在node2,node3中添加consul agent配置文件,配置注册的服务。例如,在node3的的consul agent 配置目录下创建文件web3.json:(在部署服务的节点上,启动consul时,通过-config-dir来指定配置文件所在目录)
{
"service":{
"name":"web3",
"tags":[
"master"
],
"address":"127.0.0.1",
"port":10000,
"checks":[
{
"http":"http://localhost:10000/health",
"interval":"10s"
}
]
}
}
- 启动web3服务,保证上述注册配置中的checks通过;
- 启动node1,node2,node3上的consul服务。启动命令同上述场景中的启动命令,但是部署服务的节点加上-config-dir参数,指定配置目录。例如,node3的服务启动命令如下:
consul agent -data-dir /tmp/consul -node=n3 -bind=10.10.126.187 -dc=dc1 -config-dir=./con
- consul服务启动后,web3服务就可以被发现了。Consul提供了两种发现服务的方式,一种是通过HTTP API查看存在哪些服务;另外一种是通过consul agent内置的DNS服务来做。两者的差别在于后者可以根据服务check的实时状态动态调整available服务节点列表。我们这里也着重说明适用 DNS方式进行服务发现的具体步骤。在配置和部署完web3服务后,我们就可以通过DNS命令来查询服务的具体信息了。consul为服务编排的内置域名为 “NAME.service.consul",这样我们的web3的域名为:web3.service.consul。我们在n1通过dig工具来查看一 下,注意是在n1上,n1上并未定义和部署web3服务,但集群中服务的信息已经被同步到n1上了,信息是一致的:
$ dig @127.0.0.1 -p 8600 web3.service.consul SRV
; <<>> DiG 9.9.5-3-Ubuntu <<>> @127.0.0.1 -p 8600 web3.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6713
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;web3.service.consul. IN SRV
;; ANSWER SECTION:
web3.service.consul. 0 IN SRV 1 1 10000 n2.node.dc1.consul.
web3.service.consul. 0 IN SRV 1 1 10000 n3.node.dc1.consul.
;; ADDITIONAL SECTION:
n2.node.dc1.consul. 0 IN A 127.0.0.1
n3.node.dc1.consul. 0 IN A 127.0.0.1
;; Query time: 2 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Mon Jul 06 12:12:53 CST 2015
;; MSG SIZE rcvd: 219
3.2.2 通过HTTP API进行服务注册与发现
Consul提供RESTful HTTP API. API可对节点、服务、健康检查、配置等执行CRUD操作(CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete))。
- 启动consul 服务
- 定义服务文件,格式是JSON的。
{
"ID":"redis1",
"Name":"redis",
"Tags":[
"primary",
"v1"
],
"Address":"127.0.0.1",
"Port":8000,
"EnableTagOverride":false,
"Check":{
"DeregisterCriticalServiceAfter":"90m",
"Script":"/usr/local/bin/check_redis.py",
"HTTP":"http://localhost:5000/health",
"Interval":"10s",
"TTL":"15s"
}
}
- 通过API接口提交
curl --request PUT --data @redis.json http://127.0.0.1:8500/v1/agent/service/register
- 查询服务
curl http://localhost:8500/v1/catalog/service/redis
consul 与zookeeper 等其他系统的区别
consul 与zookeeper的区别:
我的理解是zookeeper是一个比较通用的分布式K/V框架。并不是开始的目标就是提供服务发现与注册的。只是我们可以基于它的分布式的一致性来实现这个功能,如在zookeeper 上创建某个目录,代表某个服务,然后提供该服务的节点将自己作为一个地址做为一个key /value 写到该目录下。形成目录树。需要使用该服务的机器获取目录数,就获取来提供服务的访问列表。
另外,也可以基于zookeeper 的特性做分布式全局ID。综上所述,我们都是基于Zookeeper 的原始k/v 存储特定做业务功能的构建。这些语义、使用场景是我们自己构建的。
但是,对于consul ,它的出发点就是 做服务注册与发现,因而也更加轻量级,且在服务注册与发现方面,也就功能比较丰富,如支持服务的主动check等。