1. 什么是Consul?
Consul 有很多组件,对于整体来说,它是一个服务发现和服务配置的工具,它提供了一下特性:
- 服务发现
- 健康检查
- KV存储
- 多数据中心
2.安装Consul
以下是在 CentOS 系统上操作
下载
wget https://releases.hashicorp.com/consul/1.1.0/consul_1.1.0_linux_amd64.zip
查看版本
consul -vConsul v1.1.0Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)
3.启动 Agent
使用dev模式启动。
$ consul agent -dev==> Starting Consul agent...==> Consul agent running! Version: 'v1.1.0' Node ID: 'a94cdf4f-e36d-9bef-927c-61c1d14500cd' Node name: 'bogon' Datacenter: 'dc1' (Segment: '') Server: true (Bootstrap: false) Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, DNS: 8600) Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302) Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false==> Log data will now stream in as it occurs: 2018/06/23 00:03:45 [DEBUG] agent: Using random ID "a94cdf4f-e36d-9bef-927c-61c1d14500cd" as node ID 2018/06/23 00:03:45 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:a94cdf4f-e36d-9bef-927c-61c1d14500cd Address:127.0.0.1:8300}] 2018/06/23 00:03:45 [INFO] serf: EventMemberJoin: bogon.dc1 127.0.0.1 2018/06/23 00:03:45 [INFO] serf: EventMemberJoin: bogon 127.0.0.1 2018/06/23 00:03:45 [INFO] agent: Started DNS server 127.0.0.1:8600 (udp) 2018/06/23 00:03:45 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: "") 2018/06/23 00:03:45 [INFO] consul: Adding LAN server bogon (Addr: tcp/127.0.0.1:8300) (DC: dc1) 2018/06/23 00:03:45 [INFO] consul: Handled member-join event for server "bogon.dc1" in area "wan" 2018/06/23 00:03:45 [INFO] agent: Started DNS server 127.0.0.1:8600 (tcp) 2018/06/23 00:03:45 [INFO] agent: Started HTTP server on 127.0.0.1:8500 (tcp) 2018/06/23 00:03:45 [INFO] agent: started state syncer 2018/06/23 00:03:45 [WARN] raft: Heartbeat timeout from "" reached, starting election 2018/06/23 00:03:45 [INFO] raft: Node at 127.0.0.1:8300 [Candidate] entering Candidate state in term 2 2018/06/23 00:03:45 [DEBUG] raft: Votes needed: 1 2018/06/23 00:03:45 [DEBUG] raft: Vote granted from a94cdf4f-e36d-9bef-927c-61c1d14500cd in term 2. Tally: 1 2018/06/23 00:03:45 [INFO] raft: Election won. Tally: 1 2018/06/23 00:03:45 [INFO] raft: Node at 127.0.0.1:8300 [Leader] entering Leader state 2018/06/23 00:03:45 [INFO] consul: cluster leadership acquired 2018/06/23 00:03:45 [DEBUG] consul: Skipping self join check for "bogon" since the cluster is too small 2018/06/23 00:03:45 [INFO] consul: member 'bogon' joined, marking health alive 2018/06/23 00:03:45 [INFO] consul: New leader elected: bogon 2018/06/23 00:03:45 [DEBUG] agent: Skipping remote check "serfHealth" since it is managed automatically 2018/06/23 00:03:45 [INFO] agent: Synced node info 2018/06/23 00:03:46 [DEBUG] agent: Skipping remote check "serfHealth" since it is managed automatically 2018/06/23 00:03:46 [DEBUG] agent: Node info in sync 2018/06/23 00:03:46 [DEBUG] agent: Node info in sync
4. 查看集群成员
在另外一个终端使用 consul members
, 可以查看集群成员信息。
$ consul membersNode Address Status Type Build Protocol DC Segmentbogon 127.0.0.1:8301 alive server 1.1.0 2 dc1
也可以通过HTTP API 来查看Consul成员信息
$ curl localhost:8500/v1/catalog/nodes[ { "ID": "a94cdf4f-e36d-9bef-927c-61c1d14500cd", "Node": "bogon", "Address": "127.0.0.1", "Datacenter": "dc1", "TaggedAddresses": { "lan": "127.0.0.1", "wan": "127.0.0.1" }, "Meta": { "consul-network-segment": "" }, "CreateIndex": 5, "ModifyIndex": 6 }]
5.服务注册
定义一个服务步骤
$ sudo mkdir /etc/consul.d
定义一个服务名为web, 运行端口为80
$ echo '{"service": {"name": "web", "tags": ["rails"], "port": 80}}' \ | sudo tee /etc/consul.d/web.json
重启agent,并制定配置目录
$ consul agent -dev -config-dir=/etc/consul.d==> Starting Consul agent...... [INFO] agent: Synced service 'web'...
下面通过HTTP API的方式来查询服务
$ curl http://localhost:8500/v1/catalog/service/web[ { "ID": "68530a9c-2434-9a80-32ac-e4e455086655", "Node": "bogon", "Address": "127.0.0.1", "Datacenter": "dc1", "TaggedAddresses": { "lan": "127.0.0.1", "wan": "127.0.0.1" }, "NodeMeta": { "consul-network-segment": "" }, "ServiceID": "web", "ServiceName": "web", "ServiceTags": [ "rails" ], "ServiceAddress": "", "ServiceMeta": {}, "ServicePort": 80, "ServiceEnableTagOverride": false, "CreateIndex": 6, "ModifyIndex": 6 }]
同时也可以通过下面的HTTP API 来查询服务的健康状况
$ curl 'http://localhost:8500/v1/health/service/web?passing'[ { "Node": { "ID": "68530a9c-2434-9a80-32ac-e4e455086655", "Node": "bogon", "Address": "127.0.0.1", "Datacenter": "dc1", "TaggedAddresses": { "lan": "127.0.0.1", "wan": "127.0.0.1" }, "Meta": { "consul-network-segment": "" }, "CreateIndex": 5, "ModifyIndex": 6 }, "Service": { "ID": "web", "Service": "web", "Tags": [ "rails" ], "Address": "", "Meta": null, "Port": 80, "EnableTagOverride": false, "CreateIndex": 6, "ModifyIndex": 6 }, "Checks": [ { "Node": "bogon", "CheckID": "serfHealth", "Name": "Serf Health Status", "Status": "passing", "Notes": "", "Output": "Agent alive and reachable", "ServiceID": "", "ServiceName": "", "ServiceTags": [], "Definition": {}, "CreateIndex": 5, "ModifyIndex": 5 } ] }]
更新服务
可以通过修改配置文件和发送SIGHUP
到agent, 更新服务的信息。