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

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

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

ابدأ الدورة

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 {

توصيات