主题
Day 5 技术设计文档 — HTTP 支持
HTTP CONNECT 时序图
ServeHTTP 实现
go
func (server *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) {
if req.Method != "CONNECT" {
w.WriteHeader(http.StatusMethodNotAllowed)
return
}
conn, _, err := w.(http.Hijacker).Hijack()
// ... 发送 200 响应,然后交给 ServeConn
}Hijacker 是 http.ResponseWriter 的可选接口,允许从 HTTP 处理器中获取底层的 TCP 连接。
为什么用 CONNECT 而非 POST?
| 方式 | 优点 | 缺点 |
|---|---|---|
| CONNECT | 一次握手后持续复用连接;二进制高效 | 不是标准 REST 用法 |
| POST | 符合 REST 语义 | 每次请求建立新连接;HTTP 头开销大 |
RPC 场景追求低延迟和高吞吐,CONNECT 方式更合适。
调试页面
使用 html/template 渲染,遍历 serviceMap 展示:
- 服务名
- 方法名及参数类型
- 累计调用次数(
methodType.NumCalls())
路径默认为 /debug/minirpc。