consul 入门

一、基本操作

  1. 启动 consul
1
2
3
4
5
6
7
$ consul agent -dev
# 开启 WEB UI
$ consul agent -dev -ui
# 指定服务目录
$ consul agent -dev -config-dir=$HOME/local/etc/consul.d
# 或加在指定配置文件
$ consul agent -dev -config-file=$HOME/local/etc/consul.d/nginx.json
  1. 查看cluster中的成员
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ consul members [-detailed]
# 输出信息包括服务的状态、类型、版本、协议等的
# Node Address Status Type Build Protocol DC Segment
# apollo 127.0.0.1:8301 alive server 1.3.0 2 dc1 <all>

# consul members 的输出是根据 gossip protocol,具有最终一致性。即该命令的看到为当前服务所看到的结果
# 若要强一致性则需要调用 HTTP API
$ curl localhost:8500/v1/catalog/nodes
# [
# {
# "ID": "d0c2076f-64ab-8c0e-0457-fe5c55c53472",
# "Node": "apollo",
# "Address": "127.0.0.1",
# "Datacenter": "dc1",
# "TaggedAddresses": {
# "lan": "127.0.0.1",
# "wan": "127.0.0.1"
# },
# "Meta": {
# "consul-network-segment": ""
# },
# "CreateIndex": 9,
# "ModifyIndex": 10
# }
# ]
  1. DNS 查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ dig @127.0.0.1 -p 8600 apollo.node.consul
#
# ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-10.P2.fc28 <<>> @127.0.0.1 -p 8600 apollo.node.consul
# ; (1 server found)
# ;; global options: +cmd
# ;; Got answer:
# ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45647
# ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2
# ;; WARNING: recursion requested but not available
# 启动 consul
# ;; OPT PSEUDOSECTION:
# ; EDNS: version: 0, flags:; udp: 4096
# ;; QUESTION SECTION:
# ;apollo.node.consul. IN A
#
# ;; ANSWER SECTION:
# apollo.node.consul. 0 IN A 127.0.0.1
#
# ;; ADDITIONAL SECTION:
# apollo.node.consul. 0 IN TXT "consul-network-segment="
#
# ;; Query time: 0 msec
# ;; SERVER: 127.0.0.1#8600(127.0.0.1)
# ;; WHEN: Mon Nov 12 22:29:14 CST 2018
# ;; MSG SIZE rcvd: 99
#
  1. 关闭服务

可以直接通过Ctrl + C优雅退出服务。在关闭服务的时候,若优雅退出,则 Consul 会通知其他成员该节点状态已离开 left,当一个成员离开的时候,该服务的状态检查会从 catalog 中移除;若通过强制结束该节点,则其他服务检测到该结点的状态为 failed,且它的健康状态被标记为 critical,不会从集群中移除, Consul 会自动重新连接已失败的节点,以便在服务恢复后重新连接。

二、注册服务

  1. 定义服务
1
2
3
4
5
6
7
8
9
$ sudo mkdir /etc/consul.d
$ cat nginx.json
{
"service": {
"name": "web",
"tags": ["nginx"],
"port": 80
}
}
  1. 查询服务
1
2
3
4
5
6
7
8
9
# DNS API
# 通过服务名字 [TAG.]NAME.service.consul,默认情况下在 consul 命名空间下,也可以配置
$ dig @127.0.0.1 -p 8600 web.service.consul
# 也可以获取服务/端口
$ dig @127.0.0.1 -p 8600 web.service.consul SRV
# 还可以根据 tag 定位服务
$ dig @127.0.0.1 -p 8600 nginx.web.service.consul SRV
# HTTP API
$ curl http://127.0.0.1:8500/v1/catalog/service/web
  1. 更新服务

可以发送通过 SIGHUP 信号给服务重新加载服务配置。

三、连接服务

四、健康检查

五、KV数据

除了提供服务发现、集成健康检查意外,Consul 还提供了一种便捷地使用 KV Store 的方法。可以通过 CLI 和 HTTP API 两种方式。 注:1. 值的大小不能大于512KB ; 2. 更新多个键,可以考虑使用事务。

  1. 增加
1
2
3
4
$ consul kv get mysql/port
Error! No key exists at: mysql/port
$ consul kv put mysql/port 3306
Success! Data written to: mysql/port
  1. 读取
1
2
3
4
5
6
7
8
9
10
11
12
$ consul kv get mysql/port
3306
$ consul kv get -detailed mysql/port
# CreateIndex 134
# Flags 0
# Key mysql/port
# LockIndex 0
# ModifyIndex 134
# Session -
# Value 3306
# 获取所有KV
$ consul kv get -recurse
  1. 更新
1
2
3
4
5
6
7
8
$ consul kv put mysql/port 3307
Success! Data written to: mysql/port
# 原子更新 [Check-And-Set] -cas
$ consul kv put -cas -modify-index=123 foo bar
Success! Data written to: foo

$ consul kv put -cas -modify-index=123 foo bar
Error! Did not write to foo: CAS failed
  1. 删除
1
2
$ consul kv delete mysql/port
$ consul kv delete -recurse mysql