gRPC لـ Rust: المكتبات وأمثلة الاستخدام
gRPC هو إطار عمل عالي الأداء لاستدعاء الإجراءات عن بُعد (RPC)، طورته Google. يستخدم Protocol Buffers (protobuf) لتسلسل البيانات و HTTP/2 للنقل. في نظام Rust البيئي، المكتبات الرئيسية للعمل مع gRPC هي tonic و grpc-rs. في هذه المقالة، سنستعرض بالتفصيل كلتا المكتبتين، إمكانياتهما، ونقدم أمثلة عملية على الكود.
لماذا gRPC في Rust؟
Rust هي لغة برمجة نظامية تركز على أمان الذاكرة والأداء. يتيح gRPC على Rust إنشاء:
- خدمات مصغرة عالية التحميل
- خدمات دفق في الوقت الفعلي
- تطبيقات عميل-خادم عبر المنصات
- التكامل مع البنية التحتية الحالية لـ gRPC
المكتبات الرئيسية
1. Tonic - الخيار الحديث والموصى به
Tonic هي مكتبة gRPC غير متزامنة، مبنية على tokio و hyper. تحظى بدعم نشط من المجتمع وتُعتبر المعيار لـ gRPC في Rust.
مزايا tonic:
- دعم كامل لـ gRPC (التيارات الأحادية، من الخادم، من العميل، والثنائية الاتجاه)
- توليد الكود عبر
tonic-buildبناءً على ملفات.proto - التكامل مع
tokio(بيئة تشغيل غير متزامنة) - دعم TLS، موازنة التحميل، والمعترضات
- مجتمع نشط ووثائق جيدة
2. grpc-rs - بديل من PingCAP
grpc-rs هي غلاف Rust لمكتبة gRPC Core بلغة C. تُستخدم في مشروع TiKV. مناسبة للحالات التي تتطلب أقصى توافق مع كومة gRPC C الأصلية.
ميزات grpc-rs:
- غلاف فوق gRPC Core (مكتبة C)
- دعم جميع أنواع استدعاءات gRPC
- سحر أقل - تحكم أكثر
- يتطلب تثبيت
protocوcmake - شعبية أقل مقارنة بـ tonic
توصية: بالنسبة لمعظم المشاريع الجديدة، اختر tonic. يجب استخدام grpc-rs إذا كنت بحاجة إلى التكامل مع كود C الحالي لـ gRPC.
إعداد مشروع مع tonic
أنشئ مشروعًا جديدًا:
cargo new grpc-examplecd grpc-exampleأضف التبعيات في Cargo.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 {