Skip to content

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.Done channel 获取结果
  • Call():同步调用,内部调用 Go() 然后阻塞等待,支持 context.Context 超时

receive 循环

客户端创建后,后台启动一个 goroutine 持续读取服务端响应:

  1. 读取 Header,获取 Seq
  2. 从 pending map 中取出对应的 Call
  3. 读取 Body 填充 Reply
  4. 通过 call.Done 通知调用者

连接异常处理

当底层连接断开时,receive 循环退出并调用 terminateCalls,将错误传播给所有尚在等待的 Call。

关键代码

文件说明
client.goClient 结构体、Dial、Go、Call、receive
client_test.go同步/异步调用测试、超时测试

运行

bash
go run ./day3-client/example/
go test -v -run TestClient .