ميكروسيرفيسات بلغة Rust: الهندسة المعمارية، الممارسة وأمثلة الكود

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

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

ابدأ الدورة
```html

مقدمة: لماذا Rust للخدمات المصغرة؟



أصبحت بنية الخدمات المصغرة (Microservices) المعيار للأنظمة الموزعة الحديثة. ومع ذلك، فإن اختيار لغة البرمجة لتنفيذ الخدمات المصغرة هو قرار حاسم. تقدم Rust مزيجًا فريدًا من أداء C/C++ وأمان الذاكرة، مما يجعلها مرشحًا مثاليًا للخدمات عالية التحميل.



في هذه المقالة، سنشرح كيفية بناء خدمة مصغرة باستخدام Rust مع أطر العمل الشائعة Actix-web و Tokio. ستتعرف على المبادئ المعمارية، والمعالجة غير المتزامنة للطلبات، وستحصل على أمثلة عملية للكود.



بنية الخدمة المصغرة في Rust



المبادئ الأساسية



عادةً ما تُبنى الخدمة المصغرة في Rust حول المكونات التالية:

  • خادم HTTP — معالجة الطلبات الواردة (Actix-web, Warp, Axum).
  • بيئة تشغيل غير متزامنة (Async Runtime) — إدارة التزامن (Tokio, async-std).
  • منطق الأعمال (Business Logic) — وحدات معزولة بحدود واضحة.
  • تخزين البيانات — التفاعل مع قاعدة البيانات عبر SQLx أو Diesel.
  • التفاعل بين الخدمات — HTTP/gRPC أو قوائم انتظار الرسائل (RabbitMQ, Kafka).


هيكل المشروع



الهيكل الموصى به لخدمة مصغرة في Rust:



my_microservice/├── Cargo.toml├── src/│   ├── main.rs          # نقطة الدخول، تشغيل الخادم│   ├── routes/          # تعريف المسارات│   ├── handlers/        # معالجات الطلبات│   ├── models/          # هياكل البيانات (DTO, الكيانات)│   ├── services/        # منطق الأعمال│   ├── repositories/    # طبقة الوصول إلى البيانات│   └── config/          # الإعدادات (env, ملفات)└── tests/               # اختبارات التكامل


مثال عملي: خدمة تقصير الروابط



لننظر في إنشاء خدمة مصغرة بسيطة لتقصير عناوين URL. ستستقبل الروابط الطويلة وتعيد معرفات قصيرة.



الخطوة 1: إعداد المشروع



أنشئ مشروع Cargo جديدًا وأضف التبعيات في Cargo.toml:



[package]name = "url-shortener"version = "0.1.0"edition = "2021"

[dependencies]actix-web = "4"actix-rt = "2"serde = { version = "1", features = ["derive"] }serde_json = "1"tokio = { version = "1", features = ["full"] }redis = { version = "0.23", features = ["tokio-comp"] }uuid = { version = "1", features = ["v4"] }dotenv = "0.15"env_logger = "0.10"log = "0.4"


الخطوة 2: نماذج البيانات



لنحدد هياكل الطلب والاستجابة:



// models/mod.rsuse serde::{Deserialize, Serialize};

#[derive(Debug, Deserialize)]pub struct CreateUrlRequest { pub url: String,}

#[derive(Debug, Serialize)]pub struct CreateUrlResponse { pub short_code: String, pub original_url: String,}

#[derive(Debug, Serialize)]pub struct ErrorResponse { pub error: String,}


الخطوة 3: طبقة الخدمة



لننفذ منطق الأعمال باستخدام Redis للتخزين:



// services/url_service.rsuse redis::AsyncCommands;use uuid::Uuid;

pub struct UrlService { redis_client: redis::Client,}

impl UrlService { pub fn new(redis_client: redis::Client) -> Self { Self { redis_client } }

pub async fn create_short_url(&self, original_url: &str) -> Result<String, String> { let short_code = Uuid::new_v4().to_string()[..8].to_string(); let mut conn = self.redis_client .get_multiplexed_async_connection() .await .map_err(|e| format!("Redis connection error: {}", e))?;

// نحفظ في Redis: المفتاح — short_code، القيمة — original_url conn.set_ex(&short_code, original_url, 86400) // TTL 24 ساعة .await .map_err(|e| format!("Redis ```

المدونات

توصيات الكتب