netrpc源码阅读
目录
netrpc源码阅读
Client.go
核心结构体:
-
Call:主要表示调用RPC过程中的信息
-
Client:主要负责RPC客户端
-
gobClientCodec:主要负责调用RPC具体实现方法
核心接口:
- ClientCodec
重点:
- ClientCodec接口规定了在调用过程最主要的几个具体步骤:
WriteRequest()
、ReadResponseHeader()
、ReadResponseBody()
、Close()
; - Client封装了RPC客户端未暴露的主要的两个动作即
send()
、input()
,分别是发送操作和接收操作,利用互斥锁保证线程安全,其循环接收response且若出现错误则终结掉所有Call结构体,需要其中对于Call结构体的处理。而Client暴露的Go()
和Call()
就是其客户端库的入口,实质上是同步进行操作而异步进行请求具体方法返回其call信息,且区别主要在于前者多了一个done通道可以进行异步通信操作,Call()
实质上也是对于Go()
方法的调用; NewClientWith()
方法即客户端初始化其中包含了NewClientWithCodec()
,默认以gobClientCodec方式作为RPC调用具体实现方法,且初始化时协程开启进行input()
函数进行接收;DailHTTP()
方法和Dial()
方法即客户端网络处理,前者包含了DialHTTPPath()
方法即以HTTP协议进行通信,且默认为HTTP1.0协议,后者可以连接其特殊网络地址;
Server.go
核心结构体:
- Request/Response:主要负责请求返回涉及rpc的信息
- Server:主要负责RPC服务端
- gobServerCodec:主要负责调用RPC具体实现方法
- methodType/service:主要表示调用方法和注册服务的信息
核心接口:
- ServerCodec
重点:
isExportedOrBuiltinType()
方法判断类型是否为导出还是内置的,反射方法调用中需要保证其类型和方法为可导出的;- Server封装了其服务端主要的方法,涉及到
Register()
、ServerConn()
、ServerCode()
、ServerRequest()
、ServerResponse()
、Accepct()
、ServerHTTP()
等; Register()
方法及RegisterName()
方法都是主要作用为注册服务,其中注册的服务中的参数格式和参数类型都有相关要求,涉及到参数个数、参数类型、参数是否可导出等,主要是利用反射获取相关信息进行判断;ServeCodec()
方法和ServeRequest()
方法就是接收处理请求,将得到的信息进行相应的Call操作,前者为循环接收及异步调用,且保证阻塞直至所有Call调用完成,后者则为一次性调用且为同步调用;- 请求中的信息需要先进行解码后,经过处理后再编码发送其返回信息,其中
call()
就是处理过程中的核心方法,涉及invoke服务方法并编码进行返回; ServeHTTP()
方法处理其服务端的网络连接,注册初始化服务端连接相关信息,进行HTTP1.0协议的通信;