官方文档:https://www.consul.io/docs
参考资料:https://deepzz.com/post/the-consul-of-discovery-and-configure-services.html
consul 关键特性
- 服务发现:支持服务发现,可以通过 DNS 或 HTTP 的方式获取服务信息
- 健康检查:支持健康检查,如 web 状态码或 cpu 使用率
- K/V 存储:支持键/值对存储
- 多数据中心:支持多数据中心,开箱即用
- WEB UI:支持 WEB UI,一目了然
consul 术语
- node:节点,运行 consul 服务,可以指定名字和 ID
- agent:consul 中的核心程序,以守护进程的方式在各个节点运行,有 client 和 server 启动模式。每个 agent 维护一套服务和注册发现以及健康信息。
- client:agent 以 client 模式启动的节点。不保存数据,直接把请求向 server 转发。
- server:agent 以 server 模式启动的节点,负责 Raft、维护会员信息、注册服务、健康检查等功能。
- server leader:服务器 server 的领导者。一旦 leader 宕机,会从剩下的 server 中选举一个新的 leader
consul 架构图:
操作 consul
consul 除了提供 CLI 命令行接口外,还提供了一套完整的 Restful 风格的 HTTP API 接口。
命令行操作
完整的命令文档在这里:https://www.consul.io/commands
catalog 命令
可以查看所有的数据中心、节点、服务等,支持的子类别有:
- datacenters:数据中心
- nodes:节点
- services:服务
示例:
查看所有数据中心:
$ consul catalog datacenters
dc1
dc2
dc3
查看能提供特定服务的所有节点:
$ consul catalog nodes -service=redis
Node ID Address DC
worker-01 1b662d97 10.4.5.31 dc1
worker-02 d407a592 10.4.4.158 dc1
查看某个节点的所有服务:
$ consul catalog services -node=worker-01
consul
postgres
agent 命令
consul agent
命令是 consul 的核心,文档:https://www.consul.io/docs/agent。例如,启动一个 agent:
$ consul agent -data-dir=/tmp/consul
其他常用命令
- members:列出当前集群中的所有节点
- kv:键值对存储功能,子命令有:
- put:存储
- get:查看
- delete:删除
- export:导出数据为 JSON 格式,可以用于 import
- import:从 JSON 格式导入数据
HTTP API 操作
Consul 的 HTTP API 文档:https://www.consul.io/api-docs。注意所有 API 操作都需要加版本号,目前是 v1
,例如 curl http://127.0.0.1:8500/v1/catalog/services
查看所有的服务
agent API
注册服务
使用 HTTP 的 PUT 方法调用 http://yourIP:8500/v1/agent/service/register 可以注册服务。
curl 示例:
curl -X PUT -d "@./demo1.json" http://127.0.0.1:8500/v1/agent/service/register
示例 JSON 文件 demo1.json
:
{
"ID": "demo1",
"Name": "demo1",
"Tags": [
"primary"
],
"Address": "127.0.0.1",
"Port": 8888,
"Check": {
"HTTP": "http://127.0.0.1:8888",
"Interval": "5s"
}
}
查看服务状态:
$ curl http://127.0.0.1:8500/v1/catalog/service/demo1
[
{
"ID": "ee33ea14-4412-6209-fc5b-8d47dc28cb26",
"Node": "84d60a3bcd39",
"Address": "172.17.0.3",
"Datacenter": "dc1",
"TaggedAddresses": {
"lan": "172.17.0.3",
"lan_ipv4": "172.17.0.3",
"wan": "172.17.0.3",
"wan_ipv4": "172.17.0.3"
},
"NodeMeta": {
"consul-network-segment": ""
},
"ServiceKind": "",
"ServiceID": "demo1",
"ServiceName": "demo1",
"ServiceTags": [
"primary"
],
"ServiceAddress": "127.0.0.1",
"ServiceTaggedAddresses": {
"lan_ipv4": {
"Address": "127.0.0.1",
"Port": 8888
},
"wan_ipv4": {
"Address": "127.0.0.1",
"Port": 8888
}
},
"ServiceWeights": {
"Passing": 1,
"Warning": 1
},
"ServiceMeta": {},
"ServicePort": 8888,
"ServiceEnableTagOverride": false,
"ServiceProxy": {
"MeshGateway": {},
"Expose": {}
},
"ServiceConnect": {},
"CreateIndex": 813,
"ModifyIndex": 813
}
]
catalog API
可以查看数据中心、节点、服务,可以注册和解除注册服务。完整示例和参数说明见官网:https://www.consul.io/api/catalog.html
查看
查看所有信息:
$ curl http://127.0.0.1:8500/v1/catalog/datacenters
$ curl http://127.0.0.1:8500/v1/catalog/nodes
$ curl http://127.0.0.1:8500/v1/catalog/services
查看具体服务:
$ curl http://127.0.0.1:8500/v1/catalog/service/myService
注册实体 /catalog/register
通过 HTTP 的 PUT 方法发送 JSON 数据到这个接口,即可注册。但是这里太底层了,通常用 agent 来代替。
解除注册实体 /catalog/unregister
同上
其他常用 API
两种方式查看集群成员
ubuntu@VM-38-ubuntu:~/$ curl http://127.0.0.1:8500/v1/agent/members
[
{
"Name": "84d60a3bcd39",
"Addr": "172.17.0.3",
"Port": 8301,
"Tags": {
"acls": "0",
"build": "1.8.4:12b16df3",
"dc": "dc1",
"ft_fs": "1",
"id": "ee33ea14-4412-6209-fc5b-8d47dc28cb26",
"port": "8300",
"raft_vsn": "3",
"role": "consul",
"segment": "",
"vsn": "2",
"vsn_max": "3",
"vsn_min": "2",
"wan_join_port": "8302"
},
"Status": 1,
"ProtocolMin": 1,
"ProtocolMax": 5,
"ProtocolCur": 2,
"DelegateMin": 2,
"DelegateMax": 5,
"DelegateCur": 4
}
]
ubuntu@VM-38-ubuntu:~/$ sudo docker exec -t consul2 consul members
Node Address Status Type Build Protocol DC Segment
84d60a3bcd39 172.17.0.3:8301 alive server 1.8.4 2 dc1 <all>
注册服务
consul 支持两种服务发现的方式:
通过 HTTP API 方式,这种方式需要额外编程,适用于不安装 consul agent 的情况,文档地址。
通过 consul agent 配置的方式,agent 启动的时候会读取一个配置文件目录,通过配置进行服务的发现,文档地址。