Skip to content

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
}

Hijackerhttp.ResponseWriter 的可选接口,允许从 HTTP 处理器中获取底层的 TCP 连接。

为什么用 CONNECT 而非 POST?

方式优点缺点
CONNECT一次握手后持续复用连接;二进制高效不是标准 REST 用法
POST符合 REST 语义每次请求建立新连接;HTTP 头开销大

RPC 场景追求低延迟和高吞吐,CONNECT 方式更合适。

调试页面

使用 html/template 渲染,遍历 serviceMap 展示:

  • 服务名
  • 方法名及参数类型
  • 累计调用次数(methodType.NumCalls()

路径默认为 /debug/minirpc