|  |
| |
| A rust implementation of [gRPC], a high performance, open source, general |
| RPC framework that puts mobile and HTTP/2 first. |
| |
| [`tonic`] is a gRPC over HTTP/2 implementation focused on high performance, interoperability, and flexibility. This library was created to have first class support of async/await and to act as a core building block for production systems written in Rust. |
| |
| [](https://crates.io/crates/tonic) |
| [](https://docs.rs/tonic) |
| [](LICENSE) |
| |
| |
| [Examples] | [Website] | [Docs] | [Chat] |
| |
| ## Overview |
| |
| [`tonic`] is composed of three main components: the generic gRPC implementation, the high performance HTTP/2 |
| implementation and the codegen powered by [`prost`]. The generic implementation can support any HTTP/2 |
| implementation and any encoding via a set of generic traits. The HTTP/2 implementation is based on [`hyper`], |
| a fast HTTP/1.1 and HTTP/2 client and server built on top of the robust [`tokio`] stack. The codegen |
| contains the tools to build clients and servers from [`protobuf`] definitions. |
| |
| ## Features |
| |
| - Bi-directional streaming |
| - High performance async io |
| - Interoperability |
| - TLS backed by [`rustls`] |
| - Load balancing |
| - Custom metadata |
| - Authentication |
| - Health Checking |
| |
| ## Getting Started |
| |
| Examples can be found in [`examples`] and for more complex scenarios [`interop`] |
| may be a good resource as it shows examples of many of the gRPC features. |
| |
| If you're using [rust-analyzer] we recommend you set `"rust-analyzer.cargo.buildScripts.enable": true` to correctly load |
| the generated code. |
| |
| For IntelliJ IDEA users, please refer to [this](https://github.com/intellij-rust/intellij-rust/pull/8056) and enable |
| `org.rust.cargo.evaluate.build.scripts` |
| [experimental feature](https://plugins.jetbrains.com/plugin/8182-rust/docs/rust-faq.html#experimental-features). |
| |
| ### Rust Version |
| |
| `tonic`'s MSRV is `1.70`. |
| |
| ```bash |
| $ rustup update |
| $ cargo build |
| ``` |
| |
| ### Dependencies |
| |
| In order to build `tonic` >= 0.8.0, you need the `protoc` Protocol Buffers compiler, along with Protocol Buffers resource files. |
| |
| #### Ubuntu |
| |
| ```bash |
| sudo apt update && sudo apt upgrade -y |
| sudo apt install -y protobuf-compiler libprotobuf-dev |
| ``` |
| |
| #### Alpine Linux |
| |
| ```sh |
| sudo apk add protoc protobuf-dev |
| ``` |
| |
| #### macOS |
| |
| Assuming [Homebrew](https://brew.sh/) is already installed. (If not, see instructions for installing Homebrew on [the Homebrew website](https://brew.sh/).) |
| |
| ```zsh |
| brew install protobuf |
| ``` |
| |
| #### Windows |
| |
| - Download the latest version of `protoc-xx.y-win64.zip` from [HERE](https://github.com/protocolbuffers/protobuf/releases/latest) |
| - Extract the file `bin\protoc.exe` and put it somewhere in the `PATH` |
| - Verify installation by opening a command prompt and enter `protoc --version` |
| |
| ### Tutorials |
| |
| - The [`helloworld`][helloworld-tutorial] tutorial provides a basic example of using `tonic`, perfect for first time users! |
| - The [`routeguide`][routeguide-tutorial] tutorial provides a complete example of using `tonic` and all its |
| features. |
| |
| ## Getting Help |
| |
| First, see if the answer to your question can be found in the API documentation. |
| If the answer is not there, there is an active community in |
| the [Tonic Discord channel][chat]. We would be happy to try to answer your |
| question. If that doesn't work, try opening an [issue] with the question. |
| |
| [chat]: https://discord.gg/6yGkFeN |
| [issue]: https://github.com/hyperium/tonic/issues/new |
| |
| ## Project Layout |
| |
| - [`tonic`](https://github.com/hyperium/tonic/tree/master/tonic): Generic gRPC and HTTP/2 client/server |
| implementation. |
| - [`tonic-build`](https://github.com/hyperium/tonic/tree/master/tonic-build): [`prost`] based service codegen. |
| - [`tonic-types`](https://github.com/hyperium/tonic/tree/master/tonic-types): [`prost`] based grpc utility types |
| including support for gRPC Well Known Types. |
| - [`tonic-health`](https://github.com/hyperium/tonic/tree/master/tonic-health): Implementation of the standard [gRPC |
| health checking service][healthcheck]. Also serves as an example of both unary and response streaming. |
| - [`tonic-reflection`](https://github.com/hyperium/tonic/tree/master/tonic-reflection): A tonic based gRPC |
| reflection implementation. |
| - [`examples`](https://github.com/hyperium/tonic/tree/master/examples): Example gRPC implementations showing off |
| tls, load balancing and bi-directional streaming. |
| - [`interop`](https://github.com/hyperium/tonic/tree/master/interop): Interop tests implementation. |
| |
| ## Contributing |
| |
| :balloon: Thanks for your help improving the project! We are so happy to have |
| you! We have a [contributing guide][guide] to help you get involved in the Tonic |
| project. |
| |
| [guide]: CONTRIBUTING.md |
| |
| ## License |
| |
| This project is licensed under the [MIT license](LICENSE). |
| |
| ### Contribution |
| |
| Unless you explicitly state otherwise, any contribution intentionally submitted |
| for inclusion in Tonic by you, shall be licensed as MIT, without any additional |
| terms or conditions. |
| |
| |
| [gRPC]: https://grpc.io |
| [`tonic`]: https://github.com/hyperium/tonic |
| [`tokio`]: https://github.com/tokio-rs/tokio |
| [`hyper`]: https://github.com/hyperium/hyper |
| [`prost`]: https://github.com/tokio-rs/prost |
| [`protobuf`]: https://developers.google.com/protocol-buffers |
| [`rustls`]: https://github.com/rustls/rustls |
| [`examples`]: https://github.com/hyperium/tonic/tree/master/examples |
| [`interop`]: https://github.com/hyperium/tonic/tree/master/interop |
| [Examples]: https://github.com/hyperium/tonic/tree/master/examples |
| [Website]: https://github.com/hyperium/tonic |
| [Docs]: https://docs.rs/tonic |
| [Chat]: https://discord.gg/6yGkFeN |
| [routeguide-tutorial]: https://github.com/hyperium/tonic/blob/master/examples/routeguide-tutorial.md |
| [helloworld-tutorial]: https://github.com/hyperium/tonic/blob/master/examples/helloworld-tutorial.md |
| [healthcheck]: https://github.com/grpc/grpc/blob/master/doc/health-checking.md |
| [rust-analyzer]: https://rust-analyzer.github.io |