كيفية نشر تطبيق Rust؟
كانت Rust اللغة الأكثر إثارة للإعجاب في استطلاع StackOverflow للمطورين لأكثر من 4 سنوات بسبب الميزات المتعددة التي تقدمها لمتبنيها.
أنشأت موزيلا لغة Rust لتكون موثوقة وفعالة وصديقة للمطورين. يحتوي Rust على بنية مشابهة للغات مثل C++C و C التي يعتبر مطوروها الهدف الرئيسي للغة.
يركز Rust أيضًا على سلامة الذاكرة والتزامن مع النماذج التي تتجنب العثرات المرتبطة التي يواجهها المطورون الذين يستخدمون لغات أخرى.
ستتعلم كيفية إنشاء واجهات برمجة التطبيقات في Rust للاستفادة من مزايا هذه المقالة. ستتعلم من خلال صياغة تطبيق Rust وتعبئته في حاويات ونشره على خدمة التعبئة المجانية للحاويات في Back4app.
Contents
مزايا استخدام Rust
هناك العديد من المزايا التي ستجنيها من استخدام Rust في مشاريعك. إليك بعضاً من أهم هذه المزايا:
المستخلصات عديمة التكلفة
يوفر Rust تجريدات عالية المستوى دون فرض تكاليف وقت تشغيل إضافية. يلمح هذا إلى أن التجريدات التي تستخدمها في شيفرتك (الدوال، أو التكرارات، أو الأجناس) لا تجعل برامجك أبطأ.
يقوم المحول البرمجي Rust بتحسين التجريدات الخاصة بالشيفرة منخفضة المستوى المحولة يدويًا. يعمل Rust على سد الفجوة بين التحكم التعبيري المنخفض المستوى والدقيق في الأداء.
نهج التزامن الشجاع لسلامة الذاكرة في البرامج المتزامنة
يتّبع Rust “نهجًا لا يعرف الخوف” في التزامن يتميز بالسلامة والكفاءة. يستفيد نموذج التزامن في Rust من نموذج الملكية والتحقق من النوع لمنع سباقات البيانات في وقت التحويل البرمجي.
تمكّنك هذه الميزة من كتابة تطبيقات متعددة الخيوط دون عيوب تزامن الحالة المشتركة، مثل حالات الجمود وظروف السباق.
نظام النوع المتقدم ونموذج الملكية المتقدم
يعد نظام نوع Rust وقواعد ملكيته ميزتين فريدتين تساعدان على فرض أمان الذاكرة.
يستخدم نموذج الملكية مدقق الاقتراض للتأكد من أن لكل جزء من البيانات مالكًا واحدًا ويدير دورة حياتها لمنع حدوث مشكلات مثل المؤشرات المتدلية وتسريبات الذاكرة.
التوافق والتكامل عبر المنصات المختلفة
يعد Rust خيارًا رائعًا إذا كنت تتطلع إلى إنشاء تطبيقات متعددة المنصات. يمكنك كتابة شيفرة برمجية مرة واحدة وتجميعها على منصات متعددة دون تغييرات كبيرة على قاعدة الشيفرة الحالية.
تندمج لغة Rust بشكل جيد مع لغات البرمجة الأخرى، خاصةً لغة C، مما يجعلها مناسبة لتجميع الويب ومهام الأنظمة المدمجة.
حدود استخدام Rust
لا بد أن تواجه بعض الانتكاسات أثناء إنشاء تطبيقات على مستوى الإنتاج باستخدام Rust.
قد تشمل بعض هذه المشاكل منحنى التعلّم الحاد في Rust، وزمن التجميع الأطول بسبب الذاكرة وغيرها من الفحوصات، ونظامه البيئي الجديد والصغير.
هناك بعض العوائق التي قد تواجهها أثناء بناء منتجات على مستوى الإنتاج باستخدام Rust. إليك بعضًا منها:
منحنى التعلم لبرمجة Rust شديد الانحدار
مقارنةً باللغات الشائعة الأخرى (Go وPython وJavaScript وغيرها)، يستغرق إتقان لغة Rust وإنشاء تطبيقات على مستوى الإنتاج باستخدامها وقتًا كبيرًا.
هذا لا ينبغي أن يجعلك تبتعد عن استخدام Rust. عند إتقانك لـ Rust، ستصبح منتجًا حقًا في بناء التطبيقات ونشرها، وستحصل على جميع مزايا استخدام Rust.
برامج Rust لها وقت تجميع طويل
تؤدي عمليات التحقق من الذاكرة والتزامن في وقت التحويل البرمجي، إلى جانب عدة عوامل أخرى، إلى أوقات تجميع طويلة لبرامج Rust.
اعتمادًا على حجم التطبيق، قد تؤدي أوقات التجميع الطويلة إلى حدوث اختناقات في مراحل التطوير أو الإنتاج.
يحتوي Rust على نظام بيئي أصغر من المكتبات
تعتبر لغة Rust جديدة نسبيًا مقارنةً بالعديد من اللغات الشائعة الأخرى، وهناك نظام بيئي محدود من المكتبات التي يمكنك استخدامها.
لا تزال العديد من المكتبات (الصناديق) قيد الإنتاج، ويمكنك الاطلاع على مواقع الويب مثل AreWeWebYet للحصول على نظرة عامة على الصناديق الجاهزة للإنتاج التي يمكنك استخدامها لإنشاء تطبيقات الويب في Rust.
خيارات نشر Rust
يكتسب Rust بالفعل اعتمادًا واسعًا، لذلك هناك العديد من خيارات النشر التي يمكنك الاختيار من بينها لتطبيقاتك.
معظم خيارات نشر Rust هي منصات قائمة على IaaS أو CaaS. يمكنك اختيار أحدها بناءً على مواصفات مشروعك.
البنية التحتية كخدمة (IaaS) مثل AWS
يوفر لك موفرو البنية التحتية كخدمة (IaaS) البنية التحتية لنشر تطبيقاتك التي تعمل على أجهزة افتراضية على السحابة وإدارتها.
يمكنك استخدام الخدمات التي توفرها منصات IaaS لنشر تطبيقات Rust الخاصة بك على أجهزة افتراضية تعمل بأنظمة تشغيل مثل Linux وWindows وMacOS وغيرها من أنظمة التشغيل المدعومة من Rust.
فيما يلي قائمة بمنصات IaaS الشائعة:
- Amazon Web Services
- Digital Ocean
- Google Cloud
- Linode
- Microsoft Azure
الحاويات كخدمة مثل حاويات Back4app
يساعدك موفّرو خدمات الحاويات (CaaS) على تسهيل نشر تطبيقك باستخدام تقنيات الحاويات.
من أجل نشر تطبيقك على الأنظمة الأساسية التي تدعم استخدام الحاويات، ستقوم بتجميع تطبيقك وجميع تبعياته في حاوية معزولة.
الحاويات معزولة ومحمولة، ولكن عليك العمل ضمن حدود ميزات موفر خدمة CaaS.
يوفر بعض موفري IaaS وظائف CaaS. كما أن هناك منصات توفر وظائف CaaS المرنة فقط بمعزل عن غيرها.
فيما يلي قائمة ببعض منصات CaaS:
- Oracle Container Service
- Back4app
- Mirantix
- Docker Enterprise
عملية نشر تطبيق Rust
في هذا القسم، ستتعرف في هذا القسم على كيفية نشر تطبيق Rust الخاص بك على منصة Back4app’s CaaS الخاصة ب Back4app.
ما هو تطبيق Back4app؟
Back4app عبارة عن منصة سحابية يمكنك الاستفادة منها لإنشاء ونشر جميع أنواع خدمات الواجهة الخلفية للجوال والويب وأنواع التطبيقات الأخرى.
يوفر Back4app وكيل ذكاء اصطناعي يمكنك استخدامه لتبسيط نشر تطبيقك على المنصة. يمكنك استخدامه لإدارة مستودعات GitHub الخاصة بك، ونشر التعليمات البرمجية على السحابة بسهولة، وإدارة تطبيقاتك قيد التشغيل.
على خوادم Back4app الخلفية، يمكن نشر الحاويات المخصصة وتشغيلها عبر وظيفة CaaS.
باستخدام صور الحاوية الخاصة بك، يمكنك توسيع منطق تطبيقك دون القلق بشأن الحفاظ على بنية الخادم الخاص بك.
البناء والنشر
يجب أن يكون لديك Rust مثبتًا على حاسوبك لمتابعة هذا البرنامج التعليمي. يمكنك زيارة صفحة تثبيتات Rust لمعرفة خيارات التثبيت المختلفة المتاحة.
بمجرد تثبيت Rust، قم بإنشاء جلسة طرفية ونفّذ هذا الأمر لتهيئة مشروع Rust جديد
mkdir back4app-rust-deployment && cd back4app-rust-deployment && cargo init
عند تشغيل الأمر، يجب أن ترى ملف cargo.toml
في الدليل الجديد الذي أنشأته للتو. ستستخدم cargo.toml
لإدارة التبعيات.
بعد ذلك، أضف هذه التوجيهات إلى قسم [التبعيات]
في ملف Cargo.toml
الخاص بك لتثبيت هذه التبعيات عند إنشاء تطبيقك.
[dependencies]
actix-web = "4.0"
serde = { version = "1.0", features = ["derive"] }
serde_derive = { version = "1.0" }
serde_json = "1.0"
lazy_static = "1.4"
يوفر صندوق أكتيكس-ويب
التوجيه ووظائف أخرى متعلقة ب HTTP، وتوفر صناديق serde
و serde_derive
و serde_derive
و serde_json
وظائف لعمليات JSON المختلفة، ويوفر الصندوق lazy_static
تخزين البيانات في الذاكرة لواجهة برمجة التطبيقات في وقت التشغيل.
أضف هذه الواردات في أعلى ملف [main.rs] (<http://main
.rs>):
use serde::{Serialize, Deserialize};
use actix_web::{web, App, HttpServer, HttpResponse, Error};
use std::sync::Mutex;
extern crate lazy_static;
use lazy_static::lazy_static;
يمكنك استخدام بنية لتحديد بنية البيانات لواجهة برمجة التطبيقات الخاصة بك بناءً على الحقول التي تحتاجها. فيما يلي هيكل يصور شخصًا بمعرف واسم مستخدم وبريد إلكتروني.
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Person {
pub id: i32,
pub username: String,
pub email: String,
}
إن #[اشتقاق (
Serialize،
Deserialize، Debugize، Clone)]
هي تطبيقات لصندوق serde_derive
لبُنية الشخص
للوصول إلى دواله واستخدامها.
إليك كيفية استخدام الصندوق الكسول_الثابت
لإعداد مخزن بيانات في الذاكرة لواجهة برمجة التطبيقات الخاصة بك استنادًا إلى نوع هيكل الشخص
:
lazy_static! {
static ref DATA_STORE: Mutex<Vec<Person>> = Mutex::new(Vec::new());
}
لقد أنشأت مخزنًا مشتركًا مهيئًا بشكل كسول وآمنًا للسنين لهيكل الأشخاص. ستستخدمه في دوال المعالج لتخزين البيانات واسترجاعها.
وظيفة معالج POST المعالج
تقبل دالة معالج طلب POST تمثيل JSON لهيكل الشخص
كمدخل لك. ثم تقوم بإرجاع استجابة HTTP وخطأ إلى العميل عند الطلب.
أضف كتلة التعليمات البرمجية هذه إلى ملف [main.rs] ()
لتنفيذ وظيفة معالج طلب POST.
async fn create_person(new_person: web::Json<Person>) -> Result<HttpResponse, Error> {
let mut data_store = DATA_STORE.lock().unwrap();
let new_id = data_store.len() as i32 + 1;
let mut person = new_person.into_inner();
person.id = new_id;
data_store.push(person.clone());
Ok(HttpResponse::Ok().json(person))
}
دالة إنشاء_شخص
هي دالة غير متزامنة تصل إلى مخزن البيانات المشتركة، وتُنشئ معرّفًا جديدًا لهيكل الشخص،
وتحوّل تمثيل JSON Person
إلى هيكل، وتدفعه إلى مخزن البيانات.
بعد نجاح الطلب، تزوّد الدالة العميل بالبيانات التي تم إدخالها في قاعدة البيانات مع رمز الحالة 200.
وظيفة معالج GET
هنا توضّح دالة معالج GET قراءة جميع البيانات في مخزن البيانات وإعادتها إلى العميل بصيغة JSON.
أضف هذه الكتلة البرمجية إلى مشروعك لتنفيذ دالة معالج GET
async fn get_people() -> Result<HttpResponse, Error> {
let data_store = DATA_STORE.lock().unwrap();
let people: Vec<Person> = data_store.clone();
Ok(HttpResponse::Ok().json(people))
}
دالة get_people
هي دالة غير متزامنة تصل إلى مخزن البيانات وتكتب المحتوى إلى العميل كاستجابة.
عند نجاح الطلب، تستجيب الدالة برمز الحالة 200
للعميل مع جميع البيانات الموجودة في مخزن البيانات.
وظيفة معالج PUT
يجب أن تقوم دالة معالج طلب PUT بتحديث إدخال في مخزن البيانات استنادًا إلى حقل من الكائن.
إليك كيفية تنفيذ دالة معالج PUT لواجهة برمجة التطبيقات الخاصة بك:
async fn update_person(
id: web::Path<i32>,
person_update: web::Json<Person>,
) -> Result<HttpResponse, Error> {
let mut data_store = DATA_STORE.lock().unwrap();
if let Some(person) = data_store.iter_mut().find(|p| p.id == *id) {
*person = person_update.into_inner();
Ok(HttpResponse::Ok().json("Person updated successfully"))
} else {
Ok(HttpResponse::NotFound().json("Person not found"))
}
}
تأخذ دالة تحديث_الشخص
المعرف والإدخال الجديد من الطلب. ثم تتنقل عبر مخزن البيانات وتستبدل الإدخال بالإدخال الجديد إذا كان موجودًا.
وظيفة معالج الحذف
ستأخذ دالة الطلب DELETE وسيطة واحدة؛ حقل المعرف من الطلب الذي تم إجراؤه. عند تشغيل الدالة ستحذف الإدخال الذي يحتوي على المعرف من مخزن البيانات.
أضف هذا التنفيذ لدالة معالج الحذف إلى برنامجك.
// DELETE
pub async fn delete_person(id: web::Path<i32>) -> Result<HttpResponse, Error> {
let mut data_store = DATA_STORE.lock().unwrap();
if let Some(index) = data_store.iter().position(|p| p.id == *id) {
data_store.remove(index);
Ok(HttpResponse::Ok().json("Deleted successfully"))
} else {
Ok(HttpResponse::NotFound().json("Person not found"))
}
}
تقوم الدالة حذف_الشخص
بحذف الإدخال الذي يحمل المعرف المحدد من مخزن البيانات. اعتمادًا على حالة العملية، تقوم الدالة بإرجاع سلسلة ورمز حالة للعميل.
ربط وظائف المعالج بالمسارات
بعد تحديد نقاط النهاية، ستحتاج إلى تعيين المسارات إلى دوال المعالج للوصول إلى وظائف دوال المعالج.
إليك كيفية تعيين المسارات إلى دوال المعالج:
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.route("/person", web::post().to(create_person))
.route("/people", web::get().to(get_people))
.route("/person/{id}", web::put().to(update_person))
.route("/person/{id}", web::delete().to(delete_person))
})
.bind("0.0.0.0:8000")?
.run()
.await
}
الدالة الرئيسية
هي دالة غير متزامنة تقوم بإعداد الخادم بعد تعيين المسارات إلى دوال المعالج.
تُنشئ الدالة HttpServer::new
خادم HTTP، وتُنشئ الدالة App::new()
مثيل تطبيق جديد، وتُعيِّن الدالة المسار
مسارات إلى دالة المعالج.
تحدد دالة الربط
عنوان التطبيق الجديد، وتقوم دالة التشغيل
بتشغيل التطبيق.
تحويل تطبيقات Rust إلى حاويات باستخدام Docker
Docker هي أكثر تقنيات الحاويات شيوعًا في السوق. يمكنك تجميع تطبيقات Rust في حاويات باستخدام Docker لإمكانية نقلها ونشرها على Back4app ببضع نقرات.
نفّذ هذا الأمر لإنشاء ملف Dockerfile جديد في مشروعك:
touch Dockerfile
افتح ملف Dockerfile وأضف تعليمات الإنشاء هذه إلى ملف Dockerfile:
# Use Rust Nightly as the base image
FROM rustlang/rust:nightly
# Set the working directory inside the container
WORKDIR /usr/src/myapp
# Copy the current directory contents into the container
COPY . .
# Build the application
RUN cargo build --release
# Expose port 8000
EXPOSE 8000
# Define the command to run the application
CMD ["./target/release/back4app-rust-deployment"]
تحدد هذه الإرشادات الصورة الأساسية وتعليمات الإنشاء لتعبئة تطبيق Rust الخاص بك في حاوية باستخدام Docker.
فيما يلي تفصيل لمحتويات ملف Dockerfile:
- يُحدد التوجيه
FROM rustlang/rust:nightly
الصورة الأساسية لملف Dockerfile. يسحب Docker هذه الصورة من المستودع ويبني برامجك عليها. - يقوم التوجيه
WORKDIR /usr/src/myapp
بتعيين دليل العمل لتطبيقك داخل الحاوية. - يقوم التوجيه
COPY .
بنسخ كل محتوى دليل العمل الخاص بك إلى دليل العمل الحالي للحاوية. - يقوم التوجيه
RUN cargo build --release
بتنفيذ الأمر الخاص ببناء تطبيقك في الحاوية. - يُعرّض التوجيه
EXPOSE 8000
المنفذ8000
من الحاوية للطلبات الواردة. - يقوم
CMD ["./target/release/back4app-rust-deployment"]
بتشغيل البرنامج (الملف القابل للتنفيذ من عملية الإنشاء).
بمجرد كتابة ملف Dockerfile، يمكنك المتابعة لنشر الحاوية على خدمة حاويات Back4app.
نشر حاوية على تطبيق Back4App
تحتاج إلى إنشاء حساب على Back4app لنشر الحاويات.
فيما يلي خطوات إنشاء حساب Back4app.
- قم بزيارة موقع Back4app الإلكتروني
- انقر على زر التسجيل في الزاوية العلوية اليمنى من الصفحة.
- أكمل نموذج التسجيل وأرسله لإنشاء الحساب.
الآن بعد أن قمت بإنشاء حساب Back4app بنجاح، قم بتسجيل الدخول وانقر على زر New APP
الموجود في الزاوية العلوية اليمنى من الصفحة المقصودة.
ستظهر لك خيارات لاختيار الطريقة التي تريد إنشاء تطبيقك بها. اختر خيار الحاوية كخدمة
.
الآن، قم بربط حساب Github الخاص بك بحساب Back4app الخاص بك وقم بتهيئة الوصول إلى المستودعات في حسابك أو مشروع معين.
اختر التطبيق الذي تريد نشره (التطبيق من هذا البرنامج التعليمي) وانقر فوق تحديد.
عند النقر فوق تحديد، سينقلك الزر إلى صفحة حيث يمكنك ملء معلومات حول تطبيقك، بما في ذلك اسم الفرع والدليل الجذر ومتغيرات البيئة.
تبدأ عملية النشر تلقائياً,
النشر باستخدام عميل الذكاء الاصطناعي Back4app
لتعزيز سير عمل التطوير الخاص بك، يمكنك أيضًا نشر تطبيقك باستخدام وكيل Back4app AI، كما ترى في الصورة أدناه:
اتبع هذا الرابط لتثبيت تطبيق حاوية Back4app في حسابك على GitHub، واتبع الخطوات الواردة في الصورة أعلاه لتهيئته.
عند الانتهاء من إعداد التطبيق، يمكنك متابعة نشر تطبيقك مع وكيل الذكاء الاصطناعي.
اتبع الرابط المتوفر لمراقبة تقدم نشر تطبيقك.
الخاتمة
لقد تعلمتَ كيفية إنشاء تطبيق Rust في حاوية Docker ونشره على Back4app.
يعد نشر تطبيقاتك على Back4app طريقة رائعة لتبسيط إدارة البنية التحتية الخلفية.
يوفر Back4App أدوات قوية لإدارة بياناتك وتوسيع نطاق تطبيقك ومراقبة أدائه.
إنه خيار ممتاز للمطورين الذين يتطلعون إلى إنشاء تطبيقات رائعة بدلاً من إدارة الخوادم.