gRPC für Rust: Bibliotheken und Beispiele
\n\ngRPC 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\n1. Tonic – modern und asynchron
\nTonic 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.
Installation und Einrichtung
\nFügen Sie die Abhängigkeiten in Cargo.toml hinzu:
[dependencies]\ntonic = "0.12"\nprost = "0.13"\ntokio = { version = "1", features = ["full"] }\n\n[build-dependencies]\ntonic-build = "0.12"\n\nDefinition des protobuf-Dienstes
\nErstellen Sie eine Datei proto/hello.proto:
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\nKompilierung von protobuf
\nGeben Sie in build.rs Folgendes an:
fn main() -> Result<(), Box<dyn std::error::Error>> {\n tonic_build::compile_protos("proto/hello.proto")?;\n Ok(())\n}\n\nImplementierung des Servers
\nBeispiel eines einfachen gRPC-Servers mit Tonic:
\nuse 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\nClient
\nuse 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\n2. grpc-rs – eine ausgereifte Alternative
\ngrpc-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\nBeispiel eines Servers mit grpc-rs
\nuse grp Auch in der Bibliothek
SFML für C++: vollständiger Leitfaden mit Beispielen
Observation Swift: Komplettleitfaden mit Beispielen
Maschinelles Lernen mit PHP: Überblick über Bibliotheken zur ML-Integration
PDF-Berichterstellung in Rust: Die Bibliothek printpdf