Skip to content

Day 2 — 服务端基础架构(Server)

学习目标

实现一个高并发的 TCP RPC 服务端,能够接收连接、解析请求、并发处理、有序响应。

核心概念

服务端生命周期

  1. Accept 循环:持续监听新连接,每个新连接启动一个 goroutine 处理
  2. ServeConn:读取连接上的 Option(JSON),校验 MagicNumber,创建对应的 Codec
  3. serveCodec:在单个连接上循环读取请求,每个请求启动一个 goroutine 并发处理
  4. handleRequest:调用服务方法,发送响应

并发模型

连接 1 ──> goroutine: serveCodec ──> readRequest ──> goroutine: handleRequest 1
                                 ──> readRequest ──> goroutine: handleRequest 2
                                 ──> readRequest ──> goroutine: handleRequest 3

连接 2 ──> goroutine: serveCodec ──> ...

关键同步机制:

  • sync.Mutex (sending):保证同一连接上的响应有序发送,避免多个 goroutine 交叉写入
  • sync.WaitGroup:等待所有请求处理完毕后才关闭 Codec

invalidRequest 哨兵值

当读取请求出错时,仍需向客户端发送错误响应(否则客户端会一直等待)。invalidRequest 是一个空的 struct{},作为错误响应的占位 body。

关键代码

文件说明
server.goServer 结构体、Accept、ServeConn、请求处理链
server_test.go注册测试、并发请求测试

运行

bash
go run ./day2-server/example/
go test -v -run TestServer .