主题
Day 3 — 客户端与调用封装(Client)
学习目标
实现一个支持异步和同步调用的 RPC 客户端,具备并发安全和连接异常处理能力。
核心概念
Call 结构体
每一次 RPC 调用被封装为一个 Call:
go
type Call struct {
Seq uint64 // 序列号
ServiceMethod string // "Service.Method"
Args interface{} // 入参
Reply interface{} // 出参(指针)
Error error // 错误信息
Done chan *Call // 完成通知
}两种调用方式
- Go():异步调用,立即返回
*Call,通过call.Donechannel 获取结果 - Call():同步调用,内部调用
Go()然后阻塞等待,支持context.Context超时
receive 循环
客户端创建后,后台启动一个 goroutine 持续读取服务端响应:
- 读取 Header,获取 Seq
- 从 pending map 中取出对应的 Call
- 读取 Body 填充 Reply
- 通过
call.Done通知调用者
连接异常处理
当底层连接断开时,receive 循环退出并调用 terminateCalls,将错误传播给所有尚在等待的 Call。
关键代码
| 文件 | 说明 |
|---|---|
client.go | Client 结构体、Dial、Go、Call、receive |
client_test.go | 同步/异步调用测试、超时测试 |
运行
bash
go run ./day3-client/example/
go test -v -run TestClient .