Jan Tattermusch | f389e52 | 2018-06-12 17:26:31 +0200 | [diff] [blame] | 1 | # gRPC Concepts Overview |
| 2 | |
| 3 | Remote Procedure Calls (RPCs) provide a useful abstraction for building |
| 4 | distributed applications and services. The libraries in this repository |
| 5 | provide a concrete implementation of the gRPC protocol, layered over HTTP/2. |
| 6 | These libraries enable communication between clients and servers using any |
| 7 | combination of the supported languages. |
| 8 | |
| 9 | |
| 10 | ## Interface |
| 11 | |
Jan Tattermusch | de4e531 | 2018-06-20 21:42:33 +0200 | [diff] [blame] | 12 | Developers using gRPC start with a language agnostic description of an RPC service (a collection |
| 13 | of methods). From this description, gRPC will generate client and server side interfaces |
| 14 | in any of the supported languages. The server implements |
Jan Tattermusch | f389e52 | 2018-06-12 17:26:31 +0200 | [diff] [blame] | 15 | the service interface, which can be remotely invoked by the client interface. |
| 16 | |
| 17 | By default, gRPC uses [Protocol Buffers](https://github.com/google/protobuf) as the |
| 18 | Interface Definition Language (IDL) for describing both the service interface |
| 19 | and the structure of the payload messages. It is possible to use other |
| 20 | alternatives if desired. |
| 21 | |
| 22 | ### Invoking & handling remote calls |
| 23 | Starting from an interface definition in a .proto file, gRPC provides |
| 24 | Protocol Compiler plugins that generate Client- and Server-side APIs. |
| 25 | gRPC users call into these APIs on the Client side and implement |
| 26 | the corresponding API on the server side. |
| 27 | |
| 28 | #### Synchronous vs. asynchronous |
| 29 | Synchronous RPC calls, that block until a response arrives from the server, are |
| 30 | the closest approximation to the abstraction of a procedure call that RPC |
| 31 | aspires to. |
| 32 | |
| 33 | On the other hand, networks are inherently asynchronous and in many scenarios, |
| 34 | it is desirable to have the ability to start RPCs without blocking the current |
| 35 | thread. |
| 36 | |
| 37 | The gRPC programming surface in most languages comes in both synchronous and |
| 38 | asynchronous flavors. |
| 39 | |
| 40 | |
| 41 | ## Streaming |
| 42 | |
| 43 | gRPC supports streaming semantics, where either the client or the server (or both) |
| 44 | send a stream of messages on a single RPC call. The most general case is |
Jan Tattermusch | de4e531 | 2018-06-20 21:42:33 +0200 | [diff] [blame] | 45 | Bidirectional Streaming where a single gRPC call establishes a stream in which both |
Jan Tattermusch | f389e52 | 2018-06-12 17:26:31 +0200 | [diff] [blame] | 46 | the client and the server can send a stream of messages to each other. The streamed |
| 47 | messages are delivered in the order they were sent. |
| 48 | |
| 49 | |
| 50 | # Protocol |
| 51 | |
| 52 | The [gRPC protocol](doc/PROTOCOL-HTTP2.md) specifies the abstract requirements for communication between |
| 53 | clients and servers. A concrete embedding over HTTP/2 completes the picture by |
| 54 | fleshing out the details of each of the required operations. |
| 55 | |
| 56 | ## Abstract gRPC protocol |
| 57 | A gRPC call comprises of a bidirectional stream of messages, initiated by the client. In the client-to-server direction, this stream begins with a mandatory `Call Header`, followed by optional `Initial-Metadata`, followed by zero or more `Payload Messages`. The server-to-client direction contains an optional `Initial-Metadata`, followed by zero or more `Payload Messages` terminated with a mandatory `Status` and optional `Status-Metadata` (a.k.a.,`Trailing-Metadata`). |
| 58 | |
| 59 | ## Implementation over HTTP/2 |
| 60 | The abstract protocol defined above is implemented over [HTTP/2](https://http2.github.io/). gRPC bidirectional streams are mapped to HTTP/2 streams. The contents of `Call Header` and `Initial Metadata` are sent as HTTP/2 headers and subject to HPACK compression. `Payload Messages` are serialized into a byte stream of length prefixed gRPC frames which are then fragmented into HTTP/2 frames at the sender and reassembled at the receiver. `Status` and `Trailing-Metadata` are sent as HTTP/2 trailing headers (a.k.a., trailers). |
| 61 | |
| 62 | ## Flow Control |
| 63 | gRPC uses the flow control mechanism in HTTP/2. This enables fine-grained control of memory used for buffering in-flight messages. |