consul服务注册与发现

Summary

以下所做操作是基于<<consul之集群搭建>>中的环境.

192.168.1.101(consul-client01)是一个consul client节点, 服务与发现操作都在其上进行.

服务注册

  1. 需要在服务(应用)所在的节点注册服务,该节点角色一般是client.
  2. 你在那个节点注册服务,那该服务会被自动识别为来自该节点。
  • 配置文件做服务定义

在节点consul配置目录下建立一个服务定义文件.

这个服务文件的大意是:注册了一个名称是web,运行在8080端口的服务。并且定义了一个健康检查.

$ vim /opt/consul/conf/web.json

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"service": {
"name": "web",
"tags": [
"master"
],
"port": 8080,
"check": {
"http": "http://127.0.0.1:8080",
"interval": "10s"
}
}
}

通过consul reload进行热注册

以下命令可以这样理解, consul二进制命令联系本地consul的http api让其加载配置文件.

1
$ consul reload --http-addr=192.168.1.101:8500

用Python启动一个SimpleHTTPServer ,作为健康检查的接口.

1
$ python -m SimpleHTTPServer 8080

此时可在“http://192.168.1.4:8500/ui”看到, ==在节点consul-client01下==出现一个名称是“web”的服务.

  • 调用HTTP API进行定义

建立一个服务定义文件,格式是JSON的.

less /tmp/redis.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"ID": "redis1",
"Name": "redis",
"Tags": [
"primary",
"v1"
],
"Address": "127.0.0.1",
"Port": 8090,
"Check": {
"http": "http://127.0.0.1:8090",
"Interval": "5s"
}
}

通过API接口提交,和“/tmp/redis.json”同目录执行如下命令.

1
curl --request PUT --data @redis.json http://192.168.1.101:8500/v1/agent/service/register

此时可在“http://192.168.1.4:8500/ui”看到, ==在节点consul-client01下==出现一个名称是“redis”的服务.

  • 注册服务时指定的参数

还有其它参数,请见官网!

a) 例1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"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"
}
}

服务发现

  • 使用DNS API查看

对于DNS API,服务的DNS名称是NAME.service.consul,
默认所有的DNS名称都是在consul名称空间下,当然这个是可配置的,
service子域名告诉Consul我们正在查询服务,并且NAME就是要查询的服务的名称。

a) 使用DNS API的方式查看服务对应的IP

1
$ dig @192.168.1.101 -p 8600  web.service.consul

b)使用DNS API来获取完整的地址/端口的SRV记录

1
$ dig @192.168.1.101 -p 8600 web.service.consul SRV

c) 使用DNS API结合tag来过滤服务

基于标记的服务查询的格式是TAG.NAME.service.consul。 这里以查询Consul中所有含”master”标记的web服务为例:

1
dig @192.168.1.101 -p 8600  master.web.service.consul
  • 使用HTTP API查看

a) 查询指定的服务信息

不管服务health check 是否failing,都会返回.

1
curl http://192.168.1.101:8500/v1/catalog/service/web | python -m json.tool

b)查看健康的服务, 可能在多个节点都有名叫web的服务,如下返回所有健康的web服务信息。

注意:该URL最后的参数是serviceName

1
curl http://192.168.1.101:8500/v1/health/service/web?passing | python -m json.tool

c) 查看服务健康状态

1
curl http://192.168.1.101:8500/v1/health/service/web | python -m json.tool

d) 查询所有服务

1
curl http://192.168.1.101:8500/v1/catalog/services | python -m json.tool

服务注销

==执行如下语句,则会删除192.168.1.101:8500这个节点先前注册的“web”服务,其它节点注册的“web”服务是不会被删除的.==
注意:URL最后的参数是serviceID, 如你在注册时没有指定serviceID, 则其等于服务名.

1
curl --request PUT http://192.168.1.101:8500/v1/agent/service/deregister/web

服务维护

让服务处于维护模式

1
curl --request PUT  http://192.168.1.4:8500/v1/agent/service/maintenance/prod-cloudiya-com?enable=true

解除服务维护模式

1
curl --request PUT  http://192.168.1.4:8500/v1/agent/service/maintenance/prod-cloudiya-com?enable=false

注:prod-cloudiya-com是service id.