gRPC لـ Rust: المكتبات والأمثلة
\n\ngRPC هو إطار عمل عالي الأداء للاستدعاء عن بُعد للإجراءات (RPC)، طورته Google. يستخدم Protocol Buffers (protobuf) لتسلسل البيانات و HTTP/2 للنقل. بفضل الكتابة الصارمة، والبث ثنائي الاتجاه، وزمن الوصول المنخفض، أصبح gRPC معيارًا للهندسة المعمارية للخدمات المصغرة. في نظام Rust البيئي، هناك مكتبتان رئيسيتان للعمل مع gRPC: Tonic و grpc-rs. في هذه المقالة، سنشرح ميزاتهما ونقدم أمثلة عملية.
\n\n1. Tonic — حديث وغير متزامن
\nTonic هي مكتبة gRPC الأكثر شعبية لـ Rust. وهي مبنية على tokio و hyper، وهي غير متزامنة بالكامل وتتكامل بشكل ممتاز مع نظام Rust البيئي. تدعم Tonic جميع أنواع استدعاءات gRPC الأربعة: الاستدعاءات الأحادية، والبث من الخادم، والبث من العميل، والبث ثنائي الاتجاه.
التثبيت والإعداد
\nأضف التبعيات إلى Cargo.toml:
[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:
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 حدد:
fn main() -> Result<(), Box<dyn std::error::Error>> {\n tonic_build::compile_protos("proto/hello.proto")?;\n Ok(())\n}\n\nتنفيذ الخادم
\nمثال لخادم gRPC بسيط على 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!("مرحبًا، {}!", 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العميل
\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: "العالم".into(),\n });\n\n let response = client.say_hello(request).await?;\n println!("رد الخادم: {}", response.into_inner().message);\n Ok(())\n}\n\n2. grpc-rs — بديل ناضج
\ngrpc-rs هي مكتبة من فريق TiKV، مبنية على مكتبة gRPC Core بلغة C. توفر أقصى درجات التوافق مع إطار عمل gRPC C الرسمي، ولكنها تتطلب تثبيت تبعيات النظام (cmake, protobuf). تدعم grpc-rs الاستدعاءات المتزامنة وغير المتزامنة، ولكنها أقل سهولة في الاستخدام مقارنة بـ Tonic.
\n\nمثال خادم على grpc-rs
\nuse grp