服务发现的一个重要作用就是提供一个可用的服务列表,为此,agent提供了一个简单的服务定义格式用来声明服务的可用性,还有健康检测的可用性。健康检测被认为是应用层面的服务检测,一个服务发现既可以通过配置文件来定义,也可以在agent运行时通过HTTP API接口来定义。
服务定义的格式类似如下:
{
"service": {
"name": "redis",
"tags": ["master"],
"port": 8000,
"check": {
"script": "/usr/local/bin/check_redis.py",
"interval": "10s"
}
}
}
一个服务的定义必须包含name变量,id、tags、port、check等变量都是可选择的,如果name变量没有设置,则id变量必须设置,在每个节点上的所有的服务的id都必须是唯一的,所以在name冲突的时候,唯一的id可以用来提供分辨信息。
tags对于consul来说是一个模糊的列表值,一般用来区别出master和slave节点、不同的版本号、服务的级别等等。port可以使面向服务的体系结构配置变得简单。一个服务可以和一个健康检测关联起来,这是一个很好的功能,可以使web负载均衡器有好的移除failed节点。健康检测是和DNS接口紧密集成的,如果一个健康监测失败了,或者node在系统层面有检测失败,DNS接口将会在任何服务查询时忽略该节点。
关于check的定义更多的信息在这里,check必须是script或者TTL类型的,如果是script类型,则script和interval变量必须被提供,如果是TTL类型,则ttl变量必须被提供。check的名称默认和service的一样。在配置好服务之后,可以在命令行通过指定-config-file或者-config-dir来指定配置文件的路径,所有的配置文件必须以.json结尾。配置文件修改后,可以给agent发送一个SIGHUP信号来update。当然服务也可以通过HTTP API接口来动态注册。