Skip to content
This repository was archived by the owner on Jun 4, 2023. It is now read-only.
/ ttrpc-rust Public archive
forked from containerd/ttrpc-rust

Rust implementation of ttrpc (GRPC for low-memory environments)

License

Notifications You must be signed in to change notification settings

cloudkernels/ttrpc-rust

This branch is 158 commits behind containerd/ttrpc-rust:master.

Folders and files

NameName
Last commit message
Last commit date
Sep 7, 2022
Sep 14, 2022
Sep 7, 2022
Sep 7, 2022
Sep 14, 2022
Feb 24, 2021
Sep 14, 2022
Aug 14, 2019
Dec 19, 2019
Jun 7, 2022
Jul 17, 2020
Sep 7, 2022
Aug 10, 2022

Repository files navigation

ttrpc-rust

ttrpc-rust is a non-core subproject of containerd

ttrpc-rust is the Rust version of ttrpc. ttrpc is GRPC for low-memory environments.

The ttrpc compiler of ttrpc-rust ttrpc_rust_plugin is modified from gRPC compiler of gRPC-rs grpcio-compiler.

Usage

1. Generate with protoc command

To generate the sources from proto files:

  1. Install protoc from github.com/protocolbuffers/protobuf

  2. Install protobuf-codegen

cargo install --force protobuf-codegen
  1. Install ttrpc_rust_plugin from ttrpc-rust/compiler
cd ttrpc-rust/compiler
cargo install --force --path .
  1. Generate the sources:
$ protoc --rust_out=. --ttrpc_out=. --plugin=protoc-gen-ttrpc=`which ttrpc_rust_plugin` example.proto

2. Generate programmatically

API to generate .rs files to be used e. g. from build.rs.

Example code:

fn main() {
    protoc_rust_ttrpc::Codegen::new()
        .out_dir("protocols")
        .inputs(&[
            "protocols/protos/agent.proto",
        ])
        .include("protocols/protos")
        .rust_protobuf() // also generate protobuf messages, not just services
        .run()
        .expect("Codegen failed.");
}

async/.await

ttrpc-rust supports async/.await. By using async/.await you can reduce the overhead and resource consumption caused by threads.

Usage

1. Generate codes in async version

Currently we only support generating async codes by using ttrpc-codegen

    ttrpc_codegen::Codegen::new()
        .out_dir("protocols/asynchronous")
        .inputs(&protos)
        .include("protocols/protos")
        .rust_protobuf()
        .customize(Customize {
            async_all: true, // It's the key option.
            ..Default::default()
        })
        .run()
        .expect("Gen async codes failed.");

Provide customize option

  • async_all: generate async codes for both server and client
  • async_server: generate async codes for server
  • async_client: generate async codes for client

See more in example/build.rs

2. Write your implemention in async/.await's way

Please follow the guidlines in example/async-server.rs and example/async-client.rs

Run Examples

  1. Go to the directory

    $ cd ttrpc-rust/example
    
  2. Start the server

    $ cargo run --example server
    

    or

    $ cargo run --example async-server
    
  3. Start a client

    $ cargo run --example client
    

    or

    $ cargo run --example async-client
    

Notes: the version of protobuf

protobuf-codegen, ttrpc_rust_plugin and your code should use the same version protobuf. You will get following fail if use the different version protobuf.

27 | const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_8_0;
   |                                                 ^^^^^^^^^^^^^ help: a constant with a similar name exists: `VERSION_2_10_1`

The reason is that files generated by protobuf-codegen are compatible only with the same version of runtime

To fix this issue:

  1. Rebuild protobuf-codegen with new protobuf:
cd grpc-rs
cargo clean
cargo update
cargo install --force protobuf-codegen
  1. Rebuild ttrpc_rust_plugin with new protobuf:
cd ttrpc-rust/compiler
cargo clean
cargo update
cargo install --force --path .
  1. Build your project.

About

Rust implementation of ttrpc (GRPC for low-memory environments)

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Rust 98.7%
  • Other 1.3%