核心类

clientStream ;

newAttempt ;

创建

  1. 核心调用的是 Invoke 方法,具体实现要看grpc.ClientConn中
  2. grpc.ClientConn中实现了Invoke方法,在call.go文件中,详情都在invoke中
  3. newClientStream 封装clientStream(传入调用包、调用方法,压缩、解压等其他选项)
  4. 调用newAttemptLocked,从cc.blockingpicker.pick,获取transport
  5. 创建csAttempt,调用负载均衡器的pick方法 ,获取传输。
  6. 调用csAttempt.newStream();创建stream流

    调用

  7. 调用csAttemp.t.sendMsg发送消息; 将创建的

  8. 调用sendMessage
    1. 校验连接是否关闭
    2. hdr, payload, data, err := prepareMsg(m, cs.codec, cs.cp, cs.comp) ,压缩,解压之类的,加上header
    3. 校验payload 的大小
    4. a.t.Write.. 发送数据
    5. 写到controlBuf中。
  9. 调用clientStream.RecvMsg();
  10. csAttempt.recvMsg();调用回stream reader的Read方法,从reciverBuffer中读
  11. 调用recv,recvAndDecompress,解压缩。
  12. c.Unmarshal(d, m) 解码。

PS : transport 处理 data frame时候,会根据frame获取 活跃的stream;然后将 data传入到stream.buf中;s.buf.put(m)