给 Python Web 服务加一个健康检查接口:只用标准库返回 JSON
【摘要】 很多小服务不需要引入框架,但运维仍然需要一个简单可靠的办法判断它是不是还活着。本文用 Python 标准库给服务加一个健康检查接口,访问 127.0.0.1:8000/health 时返回 JSON,不做业务逻辑,不查数据库。 设计原则第一,健康检查只回答进程是否正常响应,不要把它变成业务接口。第二,成功返回 200,失败路径返回 404 或 500,让调用方只看状态码就能判断。第三,响应体...
很多小服务不需要引入框架,但运维仍然需要一个简单可靠的办法判断它是不是还活着。本文用 Python 标准库给服务加一个健康检查接口,访问 127.0.0.1:8000/health 时返回 JSON,不做业务逻辑,不查数据库。
设计原则
第一,健康检查只回答进程是否正常响应,不要把它变成业务接口。第二,成功返回 200,失败路径返回 404 或 500,让调用方只看状态码就能判断。第三,响应体尽量小,只包含状态字段,方便日志和监控解析。
最小实现
import json
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
class Handler(BaseHTTPRequestHandler):
def _send(self, code, payload):
body = json.dumps(payload, ensure_ascii=False).encode("utf-8")
self.send_response(code)
self.send_header("Content-Type", "application/json; charset=utf-8")
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
def do_GET(self):
if self.path == "/health":
self._send(200, {"status": "ok"})
else:
self._send(404, {"status": "not_found"})
def log_message(self, format, *args):
pass
if __name__ == "__main__":
ThreadingHTTPServer(("127.0.0.1", 8000), Handler).serve_forever()
运行与验证
把上面代码保存为 health_server.py,运行 python3 health_server.py,然后在另一终端用 curl 访问 127.0.0.1:8000/health,预期得到状态码 200 和 {“status”: “ok”}。访问其他路径时,预期得到 404 和 {“status”: “not_found”}。
常见问题
端口已被占用时先确认是不是旧进程没有退出,不要直接换一个随机端口绕过问题。健康检查返回 200 不代表业务完全正常,它只证明服务进程在响应;数据库或下游异常需要另外的业务探针。生产环境不要把健康检查绑定到所有网卡并公开访问,应结合防火墙或内网访问控制,只允许监控来源访问。
小结
一个好的健康检查接口应该简单、稳定、可预期:固定路径、固定状态码、固定 JSON 结构。先把这个接口做对,后续再接入监控告警或负载均衡的健康检查,都会容易很多。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)