gRPC in Rust: Die Bibliotheken Tonic und Grpc-rs mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

gRPC für Rust: Bibliotheken und Beispiele

\n\n

gRPC ist ein von Google entwickeltes Hochleistungs-Framework für entfernte Prozeduraufrufe (RPC). Es verwendet Protocol Buffers (protobuf) zur Datenserialisierung und HTTP/2 als Transportprotokoll. Dank strenger Typisierung, bidirektionalem Streaming und geringer Latenz ist gRPC zum Standard für Microservice-Architekturen geworden. Im Rust-Ökosystem gibt es zwei Hauptbibliotheken für die Arbeit mit gRPC: Tonic und grpc-rs. In diesem Artikel werden wir ihre Besonderheiten untersuchen und praktische Beispiele geben.

\n\n

1. Tonic – modern und asynchron

\n

Tonic ist die beliebteste gRPC-Bibliothek für Rust. Sie basiert auf tokio und hyper, ist vollständig asynchron und lässt sich hervorragend in das Rust-Ökosystem integrieren. Tonic unterstützt alle vier gRPC-Aufruftypen: Unary, Server-Streaming, Client-Streaming und bidirektionales Streaming.

\n\n

Installation und Einrichtung

\n

Fügen Sie die Abhängigkeiten in Cargo.toml hinzu:

\n
[dependencies]\ntonic = "0.12"\nprost = "0.13"\ntokio = { version = "1", features = ["full"] }\n\n[build-dependencies]\ntonic-build = "0.12"
\n\n

Definition des protobuf-Dienstes

\n

Erstellen Sie eine Datei proto/hello.proto:

\n
syntax = "proto3";\n\npackage hello;\n\nservice Greeter {\n    rpc SayHello (HelloRequest) returns (HelloReply);\n}\n\nmessage HelloRequest {\n    string name = 1;\n}\n\nmessage HelloReply {\n    string message = 1;\n}
\n\n

Kompilierung von protobuf

\n

Geben Sie in build.rs Folgendes an:

\n
fn main() -> Result<(), Box<dyn std::error::Error>> {\n    tonic_build::compile_protos("proto/hello.proto")?;\n    Ok(())\n}
\n\n

Implementierung des Servers

\n

Beispiel eines einfachen gRPC-Servers mit Tonic:

\n
use tonic::{transport::Server, Request, Response, Status};\nuse hello::greeter_server::{Greeter, GreeterServer};\nuse hello::{HelloRequest, HelloReply};\n\npub mod hello {\n    tonic::include_proto!("hello");\n}\n\n#[derive(Default)]\npub struct MyGreeter;\n\n#[tonic::async_trait]\nimpl Greeter for MyGreeter {\n    async fn say_hello(\n        &self,\n        request: Request<HelloRequest>,\n    ) -> Result<Response<HelloReply>, Status> {\n        let name = request.into_inner().name;\n        let reply = HelloReply {\n            message: format!("Hallo, {}!", name),\n        };\n        Ok(Response::new(reply))\n    }\n}\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    let addr = "[::1]:50051".parse()?;\n    let greeter = MyGreeter::default();\n\n    Server::builder()\n        .add_service(GreeterServer::new(greeter))\n        .serve(addr)\n        .await?;\n\n    Ok(())\n}
\n\n

Client

\n
use hello::greeter_client::GreeterClient;\nuse hello::HelloRequest;\n\npub mod hello {\n    tonic::include_proto!("hello");\n}\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    let mut client = GreeterClient::connect("http://[::1]:50051").await?;\n\n    let request = tonic::Request::new(HelloRequest {\n        name: "Welt".into(),\n    });\n\n    let response = client.say_hello(request).await?;\n    println!("Serverantwort: {}", response.into_inner().message);\n    Ok(())\n}
\n\n

2. grpc-rs – eine ausgereifte Alternative

\n

grpc-rs ist eine Bibliothek des TiKV-Teams, die auf der C-Bibliothek gRPC Core basiert. Sie bietet maximale Kompatibilität mit dem offiziellen gRPC C-Framework, erfordert jedoch die Installation von Systemabhängigkeiten (cmake, protobuf). grpc-rs unterstützt synchrone und asynchrone Aufrufe, ist aber in der Benutzerfreundlichkeit Tonic unterlegen.

\n\n

Beispiel eines Servers mit grpc-rs

\n
use grp                    

Empfehlungen