gRPC في Rust: مكتبات Tonic و Grpc-rs مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

gRPC لـ Rust: المكتبات والأمثلة

\n\n

gRPC هو إطار عمل عالي الأداء للاستدعاء عن بُعد للإجراءات (RPC)، طورته Google. يستخدم Protocol Buffers (protobuf) لتسلسل البيانات و HTTP/2 للنقل. بفضل الكتابة الصارمة، والبث ثنائي الاتجاه، وزمن الوصول المنخفض، أصبح gRPC معيارًا للهندسة المعمارية للخدمات المصغرة. في نظام Rust البيئي، هناك مكتبتان رئيسيتان للعمل مع gRPC: Tonic و grpc-rs. في هذه المقالة، سنشرح ميزاتهما ونقدم أمثلة عملية.

\n\n

1. Tonic — حديث وغير متزامن

\n

Tonic هي مكتبة gRPC الأكثر شعبية لـ Rust. وهي مبنية على tokio و hyper، وهي غير متزامنة بالكامل وتتكامل بشكل ممتاز مع نظام Rust البيئي. تدعم Tonic جميع أنواع استدعاءات gRPC الأربعة: الاستدعاءات الأحادية، والبث من الخادم، والبث من العميل، والبث ثنائي الاتجاه.

\n\n

التثبيت والإعداد

\n

أضف التبعيات إلى Cargo.toml:

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

تعريف خدمة protobuf

\n

أنشئ ملف 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

بناء protobuf

\n

في build.rs حدد:

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

تنفيذ الخادم

\n

مثال لخادم gRPC بسيط على 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!("مرحبًا، {}!", 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

العميل

\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: "العالم".into(),\n    });\n\n    let response = client.say_hello(request).await?;\n    println!("رد الخادم: {}", response.into_inner().message);\n    Ok(())\n}
\n\n

2. grpc-rs — بديل ناضج

\n

grpc-rs هي مكتبة من فريق TiKV، مبنية على مكتبة gRPC Core بلغة C. توفر أقصى درجات التوافق مع إطار عمل gRPC C الرسمي، ولكنها تتطلب تثبيت تبعيات النظام (cmake, protobuf). تدعم grpc-rs الاستدعاءات المتزامنة وغير المتزامنة، ولكنها أقل سهولة في الاستخدام مقارنة بـ Tonic.

\n\n

مثال خادم على grpc-rs

\n
use grp                    

توصيات