ميكروسيرفيسات بلغة Rust: من أين تبدأ ولا تصاب بالجنون

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

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

ابدأ الدورة

لماذا Rust هي خطوتك التالية في الميكروسيرفيسات؟

\n\n

لطالما كان عالم الميكروسيرفيسات مقسماً بين Java (مع Spring Boot الخاص بها)، Python (FastAPI، Django) و Go. لكن في العامين الماضيين، أصبح صوت Rust يُسمع أكثر فأكثر. لماذا؟ لأن Rust تقدم ما كان يبدو سابقاً بعيد المنال: أداء C++ وأمان الذاكرة - بدون جامع القمامة.

\n\n

إذا كنت تكتب بلغة Python، فأنت معتاد على سرعة التطوير. ولكن عندما يزداد الحمل، تبدأ Python في "التباطؤ". تحل Rust هذه المشكلة بشكل جذري: يمكن لميكروسيرفيس واحد بلغة Rust أن يحل محل 3-4 خدمات بلغة Python من حيث الأداء. وفي الوقت نفسه، لا ينهار الكود في وقت التشغيل مع NullPointerException.

\n\n

في هذه المقالة، لن نتنظّر. سنقوم بكتابة ميكروسيرفيس بلغة Rust من الصفر. سترى أن الأمر ليس مخيفاً، بل هو ممتع للغاية.

\n\n

تجهيز البيئة: ما تحتاج إلى تثبيته

\n\n

قبل كتابة الكود، دعنا نتأكد من أن لديك كل ما يلزم. إذا كنت مبتدئاً في Rust - لا تقلق، التثبيت يستغرق دقيقتين.

\n\n

1. تثبيت Rust

\n

أسهل طريقة هي من خلال المثبت الرسمي rustup:

\n\n
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
\n\n

بعد التثبيت، تحقق من الإصدار:

\n\n
rustc --version\ncargo --version
\n\n

2. اختيار المحرر

\n

أوصي باستخدام VS Code مع إضافة rust-analyzer. سيمنحك هذا الإكمال التلقائي، وإبراز الأخطاء، وإعادة الهيكلة "خارج الصندوق".

\n\n

3. Docker (للحاويات)

\n

تعيش الميكروسيرفيسات عادةً في حاويات. قم بتثبيت Docker Desktop أو Docker Engine. سنقوم ببناء الصورة في نهاية المقالة.

\n\n

اختيار الإطار: Actix-web مقابل Axum مقابل Rocket

\n\n

في عالم Rust، هناك ثلاثة أطر رئيسية لخوادم HTTP. إليك مقارنة موجزة بينها:

\n\n
    \n
  • Actix-web - الأسرع (حتى مليون طلب/ثانية). ناضج، مع العديد من الأمثلة. مثالي للإنتاج.
  • \n
  • Axum - حديث، من مبتكري Tokio. يتكامل بشكل أفضل مع النظام البيئي غير المتزامن (async).
  • \n
  • Rocket - الأكثر "ودية" من حيث بناء الجملة، لكنه أبطأ في التحديث.
  • \n
\n\n

في هذه المقالة، سنستخدم Actix-web، لأنه تم اختباره على مر السنين وله أكبر مجتمع. ولكن إذا كنت تريد مجموعة "عصرية" - فلا تتردد في استخدام Axum.

\n\n

أول ميكروسيرفيس: خدمة تقصير الروابط

\n\n

لكي لا نكون نظريين، سنكتب ميكروسيرفيس حقيقي - url-shortener. سيقبل عنوان URL طويلاً ويعيد عنواناً قصيراً.

\n\n

الخطوة 1. إنشاء المشروع

\n
cargo new url-shortener\ncd url-shortener
\n\n

الخطوة 2. إضافة التبعيات

\n

افتح Cargo.toml وأضف:

\n\n
[dependencies]\nactix-web = "4"\nserde = { version = "1", features = ["derive"] }\nserde_json = "1"\nuuid = { version = "1", features = ["v4"] }\ntokio = { version = "1", features = ["full"] }
\n\n

الخطوة 3. كتابة الكود

\n

استبدل محتوى src/main.rs بالكود التالي:

\n\n
use actix_web::{web, App, HttpServer, HttpResponse, Responder};\nuse serde::{Deserialize, Serialize};\nuse std::sync::Mutex;\nuse uuid::Uuid;\n\n// هيكل لتخزين الروابط في الذاكرة\nstruct AppState {\n    links: Mutex>,\n}\n\n#[derive(Serialize, Deserialize, Clone)]\nstruct Link {\n    id: String,\n    url: String,\n}\n\n#[derive(Deserialize)]\nstruct CreateLinkRequest {\n    url: String,\n}\n\n// POST /shorten — ينشئ رابطاً قصيراً\nasync fn shorten(data: web::Data<AppState>, body: web::Json<CreateLinkRequest>) -> impl Responder {\n    let new_link = Link {\n        id: Uuid::new_v4().to_string()[..8].to_string(), // نأخذ أول 8 أحرف من UUID\n        url: body.url.clone(),\n    };\n\n    let mut links = data.lin                

المدونات

توصيات الكتب