Rust के लिए gRPC: लाइब्रेरी और उदाहरण
gRPC एक उच्च-प्रदर्शन वाला रिमोट प्रोसीजर कॉल (RPC) फ्रेमवर्क है, जिसे Google द्वारा विकसित किया गया है। यह डेटा सीरियलाइजेशन के लिए Protocol Buffers (protobuf) और ट्रांसपोर्ट के लिए HTTP/2 का उपयोग करता है। Rust इकोसिस्टम में gRPC के साथ काम करने के लिए मुख्य लाइब्रेरी tonic और grpc-rs हैं। इस लेख में हम दोनों लाइब्रेरी, उनकी क्षमताओं का विस्तार से अध्ययन करेंगे और व्यावहारिक कोड उदाहरण देंगे।
Rust में gRPC क्यों?
Rust एक सिस्टम प्रोग्रामिंग भाषा है जो मेमोरी सुरक्षा और प्रदर्शन पर ध्यान केंद्रित करती है। Rust पर gRPC आपको निम्नलिखित बनाने की अनुमति देता है:
- उच्च-लोड वाले माइक्रोसर्विसेज
- रियल-टाइम स्ट्रीमिंग सेवाएं
- क्रॉस-प्लेटफॉर्म क्लाइंट-सर्वर एप्लिकेशन
- मौजूदा gRPC इंफ्रास्ट्रक्चर के साथ एकीकरण
मुख्य लाइब्रेरी
1. Tonic — आधुनिक और अनुशंसित विकल्प
Tonic एक एसिंक्रोनस gRPC लाइब्रेरी है, जो tokio और hyper पर आधारित है। इसे समुदाय द्वारा सक्रिय रूप से समर्थित किया जाता है और इसे Rust में gRPC के लिए मानक माना जाता है।
tonic के लाभ:
- gRPC का पूर्ण समर्थन (यूनरी, सर्वर, क्लाइंट और द्विदिश स्ट्रीम)
.protoफ़ाइलों के आधार परtonic-buildके माध्यम से कोड जनरेशनtokio(एसिंक्रोनस रनटाइम) के साथ एकीकरण- TLS, लोड बैलेंसिंग और इंटरसेप्टर का समर्थन
- सक्रिय समुदाय और अच्छा दस्तावेज़ीकरण
2. grpc-rs — PingCAP का विकल्प
grpc-rs C gRPC Core लाइब्रेरी के ऊपर एक Rust रैपर है। इसका उपयोग TiKV प्रोजेक्ट में किया जाता है। यह उन मामलों के लिए उपयुक्त है जहां मूल gRPC C स्टैक के साथ अधिकतम संगतता की आवश्यकता होती है।
grpc-rs की विशेषताएं:
- gRPC Core (C लाइब्रेरी) के ऊपर रैपर
- सभी प्रकार के gRPC कॉल का समर्थन
- कम "मैजिक" — अधिक नियंत्रण
protocऔरcmakeकी स्थापना की आवश्यकता- tonic की तुलना में कम लोकप्रियता
सिफारिश: अधिकांश नए प्रोजेक्ट के लिए tonic चुनें। grpc-rs का उपयोग करें यदि आपको मौजूदा gRPC C कोड के साथ एकीकरण की आवश्यकता है।
tonic के साथ प्रोजेक्ट सेटअप
एक नया प्रोजेक्ट बनाएं:
cargo new grpc-examplecd grpc-exampleCargo.toml में निर्भरताएं जोड़ें:
[dependencies]tonic = "0.11"prost = "0.12"tokio = { version = "1", features = ["full"] }
[build-dependencies]tonic-build = "0.11"proto/hello.proto फ़ाइल बनाएं:
syntax = "proto3";
package hello;
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply);}
message HelloRequest { string name = 1;}
message HelloReply { string message = 1;}बिल्ड कॉन्फ़िगर करें — build.rs बनाएं:
fn main() -> Result<(), Box<dyn std::error::Error>> { tonic_build::compile_protos("proto/hello.proto")?; Ok(())}tonic पर सर्वर का उदाहरण
src/server.rs बनाएं:
use tonic::{transport::Server, Request, Response, Status};use hello::greeter_server::{Greeter, GreeterServer};use hello::{HelloRequest, HelloReply};
pub mod hello { tonic::include_proto!("hello");}
#[derive(Default)]pub struct MyGreeter;
#[tonic::async_trait]impl Greeter for MyGreeter { async fn say_hello( &self, request: Request<HelloRequest>, ) -> Result<Response<HelloReply>, Status> { let name = request.into_inner().name; let reply = HelloReply {