Tonic Rust: دليل شامل مع أمثلة عملية

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

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

ابدأ الدورة

ما هي مكتبة Tonic ولماذا تحتاجها؟

Tonic هي مكتبة حديثة وعالية الأداء لبناء خوادم وعملاء gRPC بلغة Rust. تعتمد على إطار العمل غير المتزامن Tokio وإطار HTTP/2 Hyper، مما يضمن أقصى أداء وتوافق كامل مع معيار gRPC.

المزايا الرئيسية لـ Tonic:

  • غير متزامن أصلي — يعتمد بالكامل على async/await بدون حظر
  • أمان الأنواع — توليد الكود من ملفات proto أثناء الترجمة
  • دعم جميع أنماط gRPC — unary، server streaming، client streaming، bidirectional streaming
  • التكامل مع بيئة Rust — يعمل مع Tokio وTower وHyper وغيرها من الحزم الشهيرة
  • الأداء — من أسرع أطر عمل gRPC المتاحة

تُستخدم المكتبة في بيئات الإنتاج من قبل شركات مثل Discord وMicrosoft وAmazon وغيرها الكثير. Tonic مثالية لبناء الخدمات المصغرة وبوابات API وأي أنظمة موزعة تتطلب تواصلاً فعالاً بين الخدمات.

تثبيت Tonic

للعمل مع Tonic، ستحتاج إلى تثبيت عدة تبعيات. أضفها إلى ملف Cargo.toml الخاص بك:

[dependencies]
tonic = "0.12"
prost = "0.13"
tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }

[build-dependencies]
tonic-build = "0.12"

شرح التبعيات:

  • tonic — المكتبة الأساسية للعمل مع gRPC
  • prost — مولد كود Protocol Buffers للغة Rust
  • tokio — بيئة التشغيل غير المتزامنة
  • tonic-build — تُستخدم أثناء مرحلة البناء لترجمة ملفات .proto

ستحتاج أيضاً إلى تثبيت protoc — مترجم Protocol Buffers. على Ubuntu/Debian:

sudo apt install protobuf-compiler

على macOS:

brew install protobuf

على Windows، قم بتنزيل الملف الثنائي من المستودع الرسمي وأضفه إلى PATH.

بداية سريعة: Hello World باستخدام gRPC

لنقم بإنشاء خدمة بسيطة تستقبل اسماً وتعيد تحية.

الخطوة 1. أنشئ ملف proto/helloworld.proto:

syntax = "proto3";

package helloworld;

service Greeter {
    rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
    string name = 1;
}

message HelloReply {
    string message = 1;
}

الخطوة 2. أنشئ ملف build.rs في جذر المشروع:

fn main() -> Result<(), Box> {
    tonic_build::compile_protos("proto/helloworld.proto")?;
    Ok(())
}

الخطوة 3. قم بتنفيذ الخادم (src/server.rs):

use tonic::{transport::Server, Request, Response, Status};
use hello_world::greeter_server::{Greeter, GreeterServer};
use hello_world::{HelloRequest, HelloReply};

pub mod hello_world {
    tonic::include_proto!("helloworld");
}

#[derive(Default)]
pub struct MyGreeter;

#[tonic::async_trait]
impl Greeter for MyGreeter {
    async fn say_hello(
        &self,
        request: Request,
    ) -> Result, Status> {
        let name = request.into_inner().name;
        let reply = HelloReply {
            message: format!("Hello, {}!", name),
        };
        Ok(Response::new(reply))
    }
}

#[tokio::main]
async fn main() -> Result<(), Box> {
    let addr = "[::1]:50051".parse()?;
    let greeter = MyGreeter::default();

    Server::builder()
        .add_service(GreeterServer::new(greeter))
        .serve(addr)
        .await?;

    Ok(())
}

الخطوة 4. قم بإنشاء العميل

توصيات