gRPC

gRPC 是 Google 基于 HTTP/2 以及 protobuf 的,要了解 gRPC 协议,只需要知道 gRPC 是如何在 HTTP/2 上面传输就可以了

gRPC 通常有四种模式,unary,client streaming,server streaming 以及 bidirectional streaming,对于底层 HTTP/2 来说,它们都是 stream,并且仍然是一套 request + response 模型

Request

gRPC 的 request 通常包含 Request-Headers, 0 或者多个 Length-Prefixed-Message 以及 EOS

Request-Headers 直接使用的 HTTP/2 headers,在 HEADERS 和 CONTINUATION frame 里面派发。定义的 header 主要有 Call-Definition 以及 Custom-Metadata。Call-Definition 里面包括 Method(其实就是用的 HTTP/2 的 POST),Content-Type 等。而 Custom-Metadata 则是应用层自定义的任意 key-value,key 不建议使用 grpc- 开头,因为这是为 gRPC 后续自己保留的

Length-Prefixed-Message 主要在 DATA frame 里面派发,它有一个 Compressed flag 用来表示该 message 是否压缩,如果为 1,表示该 message 采用了压缩,而压缩算法定义在 header 里面的 Message-Encoding 里面。然后后面跟着四字节的 message length 以及实际的 message

EOS(end-of-stream) 会在最后的 DATA frame 里面带上了 END_STREAM 这个 flag。用来表示 stream 不会在发送任何数据,可以关闭了

Response

Response 主要包含 Response-Headers,0 或者多个 Length-Prefixed-Message 以及 Trailers。如果遇到了错误,也可以直接返回 Trailers-Only。

  • Response-Headers
    • HTTP-Status // 通常的 HTTP 200,301,400
    • Content-Type
    • Custom-Metadata
  • Trailers-Only
    • HTTP-Status
    • Content-Type
    • Trailers
  • Trailers
    • Status // gRPC 的 status
    • 0 或者多个 Custom-Metadata

如果在最后收到的 HEADERS frame 里面,带上了 Trailers,并且有 END_STREAM 这个 flag,那么就意味着 response 的 EOS

Protobuf

gRPC 的 service 接口是基于 protobuf 定义的,我们可以非常方便的将 service 与 HTTP/2 关联起来

  • Path : /Service-Name/{method name}
  • Service-Name :?( {proto package name} "." ) {service name}
  • Message-Type : {fully qualified proto message name}
  • Content-Type : "application/grpc+proto"

你可能感兴趣的:(gRPC)