> For the complete documentation index, see [llms.txt](https://book.gxd88.cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.gxd88.cn/chapter1/jian-kang-jian-ce-jie-kou-gui-fan.md).

# 1.3 健康检测接口规范

健康检查接口用来判定运行在某一个节点上的服务是否可用，负载均衡或者是监控服务会通过对这个接口返回结果判定是否分配流量或者报警。

健康检查接口最关键的在于HTTP返回代码，如果200代表一切正常，如果不是200则说明该节点上的服务是完全不可用的，附加的信息只是为了辅助诊断造成服务不可用的根源。代码不是200的情况分成两大类，第一类是接口检查代码运行完毕之后发现有问题的，这个时候返回的是503，同时有附加的不可用的具体内容，通过返回的信息来直接定位问题根源；第二类是健康检查接口根本就运行不了的（比如说服务死掉，端口占满导致代码发起不了检查等等），这种情况返回的代码可能是0或者其他不是200的代码。不管是哪种类型的不可用在负载均衡或者监控程序看来结果都是一样的：负载均衡不再给节点分配流量，报警程序发出警告信息。

## 健康检查接口执行内容

下面端口检查项目列表不是每一个都是必须的，选择是否实现的依据在于看检查项目存在问题的时候会不会造成服务不可用，如果答案是会，那就需要做检查，如果不会，就可以跳过不检查。

* 内部关键对象初始化检查
* 数据库可达性检查，包括Redis, Memcache, MongoDB, MySQL等等
* 其他所依赖的基础服务的可达性检查，队列等等服务
* 关键数据表或者数据内容检查
* 调用第三方服务的可用性检查

## 接口统一路径为：{ip}:{port}/{prefix}/healthcheck

## 接口返回HTTP代码

* 接口一切正常返回为：200
* 接口健康检查接口有问题返回为：503

## 返回信息

返回信息为json格式，包含如下内容：

* status: 返回状态，为OK或者ERROR
* message: 不健康信息的内容
* name: 服务/接口名称
* host: 运行服务的主机名
* ip: 主机IP地址

正常返回示例：

`curl`[`http://xxx.xxx.xxx/healthcheck`](http://xxx.xxx.xxx/wehealthcheck)

```
< HTTP/1.1 200
< Date: Mon, 23 Jan 2017 05:29:53 GMT
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Encoding
<
{
  "status": "OK",              // 返回状态 OK 或者 ERROR
  "message": "",               // 返回错误消息内容
  "name": "app_01",            // 服务/接口名称
  "host": "xxx.xxx.xxx",       // 运行服务的主机名
  "ip": "10.0.0.0"             // 主机IP地址
}
```

错误返回示例：

```
< HTTP/1.1 503
< Date: Mon, 23 Jan 2017 05:31:13 GMT
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Encoding
<
{
  "status": "ERROR",              // 返回状态 OK 或者 ERROR
  "message": "获取MySQL连接失败",   // 返回错误消息内容
  "name": "app_01",               // 服务/接口名称
  "host": "xxx.xxx.xxx",          // 运行服务的主机名
  "ip": "10.0.0.0"                // 主机IP地址
}
```
