跳到正文

HTTP 服务与中间件 ​

  • 状态:未准备
  • 适用方向:Go 全栈 / Go 后端
  • 最近复习:待填写
  • 下次复习:待安排

一句话回答 ​

Go HTTP 服务由路由把请求交给 Handler,中间件包装处理链;上线要同时管理请求校验、超时、连接复用、日志与优雅退出。

原理解释 ​

net/http 的核心接口是 ServeHTTP(ResponseWriter, *Request)。日志、request ID、recovery、鉴权可作为包装层;包装顺序决定谁能观察错误、拒绝请求是否仍被记录。Gin 的 Next 执行后续链,Abort 阻止后续处理但不让当前函数自动 return;不能照搬其他框架语义。

服务端设置 ReadHeaderTimeout 等边界,并限制请求体大小。客户端复用 http.Client/Transport,避免每次新建连接池;处理完关闭 Body,HTTP/1.x 想复用连接通常还需适当读完响应。不要为复用而无界读取不可信大响应。

正常退出先停止接新流量,再用带期限的 Server.Shutdown 等待在途 HTTP 请求;后台 worker、消息消费者和已劫持的 WebSocket 连接需单独通知、等待和关闭。

场景与边界 ​

写响应头后不能随意改状态码;同一个 ResponseWriter 不应被无协调地并发写入。HTTP/2 可多路复用,不能概括成所有协议都“一连接一请求”。普通接口的统一短写超时也可能截断 SSE 等流式响应。

项目中的应用 ​

沿 EinoTalk Gin 接口与 SimulSpeak httpapi核对中间件顺序、请求预算和断连清理。

常见追问 ​

  • 超时一定停业务吗? 要看下游是否响应取消;超时响应不保证计算和数据库操作停止。
  • 日志记录什么? 请求标识、路由、状态码、耗时和错误分类,避免记录完整 token 与敏感载荷。
  • 重试放哪? 由调用策略统一管理,限制次数与总预算,确认幂等,避免每层重试放大流量。

参考资料 ​

理解机制,讲清取舍,用复盘检验掌握。