Skip to content

Day 4 — 服务注册与反射调用(Service)

学习目标

通过 Go 的反射机制(reflect 包)实现服务的自动注册和方法调用,让用户只需定义普通的 Go 结构体和方法,即可暴露为 RPC 服务。

核心概念

RPC 方法签名规范

一个合法的 RPC 方法必须满足:

go
func (t *T) MethodName(args ArgType, reply *ReplyType) error
  • 方法必须是导出的(大写字母开头)
  • 恰好 3 个入参(receiver + args + reply)
  • 恰好 1 个返回值(error)
  • args 和 reply 的类型必须是导出的或内置类型
  • reply 必须是指针类型

反射注册流程

  1. newService(rcvr) 提取 receiver 的类型名作为服务名
  2. registerMethods() 遍历所有方法,筛选满足签名规范的方法
  3. 将合法方法存入 map[string]*methodType

与 Server 集成

Server 的 findService("Service.Method") 解析出服务名和方法名,从 serviceMap 中查找对应的 service 和 methodType。

关键代码

文件说明
service.goservice、methodType、反射注册与调用
service_test.go注册测试、方法调用测试

运行

bash
go run ./day4-service/example/
go test -v -run TestNewService .
go test -v -run TestMethodType .