主题
Day 2 — 服务端基础架构(Server)
学习目标
实现一个高并发的 TCP RPC 服务端,能够接收连接、解析请求、并发处理、有序响应。
核心概念
服务端生命周期
- Accept 循环:持续监听新连接,每个新连接启动一个 goroutine 处理
- ServeConn:读取连接上的
Option(JSON),校验 MagicNumber,创建对应的 Codec - serveCodec:在单个连接上循环读取请求,每个请求启动一个 goroutine 并发处理
- 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.go | Server 结构体、Accept、ServeConn、请求处理链 |
server_test.go | 注册测试、并发请求测试 |
运行
bash
go run ./day2-server/example/
go test -v -run TestServer .