核心类
newAttempt ;
创建
- 核心调用的是 Invoke 方法,具体实现要看grpc.ClientConn中
- grpc.ClientConn中实现了Invoke方法,在call.go文件中,详情都在invoke中
- newClientStream 封装clientStream(传入调用包、调用方法,压缩、解压等其他选项)
- 调用newAttemptLocked,从cc.blockingpicker.pick,获取transport
- 创建csAttempt,调用负载均衡器的pick方法 ,获取传输。
调用csAttempt.newStream();创建stream流
调用
调用csAttemp.t.sendMsg发送消息; 将创建的
- 调用sendMessage
- 校验连接是否关闭
- hdr, payload, data, err := prepareMsg(m, cs.codec, cs.cp, cs.comp) ,压缩,解压之类的,加上header
- 校验payload 的大小
- a.t.Write.. 发送数据
- 写到controlBuf中。
- 调用clientStream.RecvMsg();
- csAttempt.recvMsg();调用回stream reader的Read方法,从reciverBuffer中读
- 调用recv,recvAndDecompress,解压缩。
- c.Unmarshal(d, m) 解码。
PS : transport 处理 data frame时候,会根据frame获取 活跃的stream;然后将 data传入到stream.buf中;s.buf.put(m)
