خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

چگونه یک وب سرور پایه HTTP در Rust بسازیم

بیاموزید که چگونه با استفاده از Rust’s Actix یا Rocket یک وب سرور سفارشی HTTP بسازید.

HTTP از معماری سرویس گیرنده-سرور برای اطلاعات و انتقال داده ها استفاده می کند. یکی از ویژگی های زبان های برنامه نویسی سمت سرور مانند Rust، توسعه سرورها و برنامه های مشتری برای تعامل با سرویس های مبتنی بر HTTP است.

Rust به دلیل ویژگی های ایمنی، عملکرد و قابلیت اطمینان آن برای ساخت سرورهای HTTP مناسب است. جعبه های شخص ثالث Rust مانند Actix و Rocket برای ساخت سرورهای وب پیچیده که می توانند ترافیک بالایی را مدیریت کنند، محبوب هستند.

چرا باید از Rust برای توسعه وب سرور HTTP استفاده کنید؟

Rust برای توسعه وب سرور محبوبیت پیدا کرده است زیرا برخی از ویژگی های این زبان دقیقاً ملزومات ساخت اکثر وب سرورها هستند.

استفاده از Rust به شما اطمینان می دهد که برنامه شما به طور موثر مقیاس می شود و زبان را برای ساخت برنامه های با کارایی بالا ایده آل می کند. در اینجا دلایل خاصی برای در نظر گرفتن استفاده از Rust برای وب سرور و سایر برنامه های سمت سرور آورده شده است.

عملکرد بالای Rust

عملکرد بالا یکی از دلایلی است که Rust انتخابی عالی برای ساخت وب سرورهای HTTP است. Rust دسترسی سطح پایینی به منابع سیستم از جمله حافظه و CPU را فراهم می کند و به شما امکان می دهد کدی بنویسید که با منابع کمتری نسبت به سایر زبان های سمت سرور سریعتر اجرا شود.

علاوه بر این، سیستم مالکیت Rust نیاز به جمع آوری زباله در زمان کامپایل را از بین می برد، که یکی از دلایل کندی برخی از زبان های سمت سرور است.

ایمنی و امنیت

سیستم مالکیت Rust برای مدیریت حافظه، زبان را برای توسعه وب سرور امن می کند. شما ارجاعات اشاره گر پوچ یا آویزان که می تواند منجر به نشت حافظه و سایر آسیب پذیری های امنیتی شود را تجربه نمی کنید.

سیستم مالکیت Rust از این خطاهای رایج جلوگیری می کند تا سرور و برنامه های شما را ایمن نگه دارد. Rust همچنین بر جلوگیری از سرریز بافر و سایر خطاهای مربوط به حافظه تمرکز دارد.

همزمانی

همزمانی توانایی اجرای چندین واحد از یک برنامه به صورت نامرتب بدون تأثیر بر خروجی است. خروجی یک برنامه همزمان باید با خروجی یک برنامه ناهمزمان یکسان باشد.

همزمانی می تواند به طور قابل توجهی بر عملکرد برنامه شما تأثیر بگذارد زیرا سرورها باید چندین درخواست را به طور همزمان مدیریت کنند. Rust پشتیبانی از همزیستی با یک مدل نخ سبک را فراهم می کند.

مطلب مرتبط:   6 روش پایتون برای کار با String Case

مزیت برنامه‌نویسی همزمان در Rust این است که سیستم مالکیت به شما امکان می‌دهد بدون نیاز به قفل و سایر موارد اولیه همگام‌سازی، کدهای امن بنویسید.

زنگ ابزار مدرن را فراهم می کند

کتابخانه استاندارد Rust و بسته‌های شخص ثالث در اکوسیستم Rust ابزار مدرنی را برای توسعه مؤثر وب سرور فراهم می‌کنند.

Cargo، مدیر بسته Rust، مدیریت وابستگی را ساده می کند و فرآیندها را ایجاد می کند. علاوه بر این، Rust از پشتیبانی عالی IDE با ابزارهایی مانند Rust Analyzer برخوردار است که تکمیل کد بدون درز، برجسته کردن خطا و سایر ویژگی ها را ارائه می دهد.

مروری بر کتابخانه های Actix و Rocket

Rust’s Standard Library اکثر ابزارهایی را که برای ساخت سرورهای وب نیاز دارید، دارد. کتابخانه های شخص ثالث مانند Rocket و Actix ساخت برنامه های سمت سرور را با Rust ساده می کنند.

Actix و Rocket چارچوب‌های وب محبوب Rust هستند، اما کتابخانه‌ها در طراحی و ویژگی‌ها متفاوت هستند.

Rocket یک چارچوب وب سطح بالا است که بهره وری و سهولت استفاده را در اولویت قرار می دهد. Rocket انتزاعات و قندهای نحوی زیادی را برای ساخت برنامه های وب در Rust فراهم می کند. Rocket همچنین به دلیل تایپ قوی و طراحی شهودی API محبوب است.

برای شروع ساخت برنامه های وب در Rust می توانید Rocket را به عنوان وابستگی پروژه در فایل Cargo.toml خود اضافه کنید:

[dependencies]
rocket = "0.4.11"

از سوی دیگر، Actix-web یک چارچوب سطح پایین است که عملکرد و مقیاس پذیری را در اولویت قرار می دهد. Actix از یک مدل همزمانی مبتنی بر بازیگر استفاده می‌کند و I/O غیر مسدودکننده را ارائه می‌کند که بسته را برای ساخت برنامه‌های کاربردی وب ایده‌آل می‌کند.

Actix را به عنوان وابستگی پروژه در بخش وابستگی های فایل Cargo.toml خود اضافه کنید:

[dependencies]
actix-web = "4.3.1"

انتخاب یک کتابخانه برای پروژه شما به مشخصات پروژه، ویژگی های کتابخانه و تجربه شما با Rust و HTTP بستگی دارد.

ساخت یک وب سرور ساده در Rust

پس از ایجاد یک پروژه Rust و افزودن هر یک از چارچوب های Rocket یا Actix به وابستگی های پروژه خود در فایل Cargo.toml، آماده شروع ساخت وب سرور در Rust هستید.

مطلب مرتبط:   یک سرور جمینی در لینوکس بسازید و به وب که ممکن است بوده باشد بپیوندید

ساخت یک وب سرور ساده با Actix

پیش نمایش URL Actix GitHub

هنگام ساخت سرویس های وب در Rust می توانید از سریال ساز برای درخواست ها استفاده کنید.

Serde یک کتابخانه محبوب Rust برای سریال‌سازی و سریال‌زدایی داده‌ها بین انواع Rust و فرمت‌های داده مانند JSON، YAML و TOML است. Serde چارچوبی برای تعریف تبدیل داده بین ساختارهای داده Rust و نمایش های مربوطه در سایر قالب های داده ارائه می دهد.

در اینجا دستورالعمل اضافه کردن Serde به عنوان یک بسته شخص ثالث برای پروژه شما آمده است.

[dependencies]
serde = { version = "1.0.159" , features = ["derive"] }

هنگامی که Serde و Actix را به عنوان وابستگی های پروژه اضافه کردید، می توانید یک وب سرور اصلی را با Rust ایجاد کنید. در اینجا نحوه راه اندازی یک Hello World ساده آمده است! وب سروری که با Actix یک رشته برای مشتری می نویسد:

ابتدا ماژول ها و انواع لازم را از جعبه های actix_web و serde وارد کنید:

use actix_web::{get, web, App, HttpResponse, HttpServer, Responder};
use serde::{Deserialize, Serialize};

شما از serde برای سریال کردن یک پیام به مشتری با یک ساختار استفاده خواهید کرد. Serde ساختار را برای مشتری به JSON تبدیل می کند. در اینجا ساختار پیام آمده است:

#[derive(Debug, Serialize, Deserialize)]
struct Message {
    message: String,
}

اکنون می توانید تابع handler را برای نقطه پایانی تعریف کنید. در بالای عملکرد کنترلر خود، می توانید دکوراتورهایی را برای رفتارهای سفارشی اضافه کنید:

#[get("/")]
async fn hello() -> impl Responder {
    HttpResponse::Ok().json(Message {
        message: "Hello, World!".to_owned(),
    })
}

تابع hello handler درخواست های GET را مدیریت می کند. تابع نوعی را برمی گرداند که ویژگی Responder را از بسته Actix پیاده سازی می کند.

متد json از نوع HttpResponse::Ok() یک نمونه ساختاری را می گیرد که Serde در زیر هود مدیریت می کند و پاسخ را به مشتری برمی گرداند.

پس از تعریف نقطه پایانی، می‌توانید یک نمونه سرور را راه‌اندازی کنید و نقطه پایانی را روی یک مسیر قرار دهید.

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().service(hello))
        .bind("127.0.0.1:8080")?
        .run()
        .await
}

تابع HttpServer::new یک نمونه سرور جدید است. عملکرد اصلی شروع می شود و سرور تابع hello handler را با نمونه برنامه جدید نصب می کند. متد bind سرور را به URL مشخص شده متصل می کند و تابع run سرور را اجرا می کند.

result-from-testing-the-Actix-endpoint

ساخت یک وب سرور ساده با موشک

پیش نمایش URL موشک

Rocket مینیمالیستی است، بنابراین می توانید یک وب سرور ساده بدون هیچ گونه وابستگی به غیر از جعبه راکت راه اندازی کنید.

مطلب مرتبط:   8 پورت آسیب پذیر که باید هنگام پنتست بررسی شوند

در اینجا نحوه راه اندازی یک سرور ساده با Hello World آورده شده است! نقطه پایانی با استفاده از Rocket:

ابتدا وابستگی های لازم را برای سرور خود وارد کنید.

#![feature(proc_macro_hygiene, decl_macro)]

#[macro_use]
extern crate rocket;

// imports from the Rocket crate
use rocket::response::content;
use rocket::State;

ویژگی #![feature(proc_macro_hygiene, decl_macro)] ویژگی‌های آزمایشی Rust را برای چارچوب Rocket فعال می‌کند. ویژگی #[macro_use] ماکروها را از ماژول موشک وارد می‌کند.

در اینجا یک تابع کنترل کننده است که در صورت درخواست HTML را ارائه می دهد:

#[get("/")]
fn hello_world() -> content::Html<&'static str> {
    content::Html("<h1>Hello, world!</h1>")
}

تابع hello_world یک رشته استاتیک HTML با تابع content::Html برمی گرداند.

در اینجا یک اعلان ساختار پیکربندی برای سرور آمده است (روشن چارچوب موشک):

struct Config {
    port: u16,
}

#[get("/port")]
fn port(config: State<Config>) -> String {
    format!("Server running on port {}", config.port)
}

هنگامی که سرور را اجرا می کنید، می توانید برای وضعیت پورت به نقطه پایانی /port درخواست دهید.

در نهایت، شما یک نمونه سرور با عملکرد ignite ایجاد خواهید کرد. تنظیمات را اضافه کنید، مسیرها را سوار کنید و سرور را راه اندازی کنید:

fn main() {
    let config = Config { port: 8000 };

    rocket::ignite()
        .manage(config)
        .mount("/", routes![hello_world, port])
        .launch();
}

متغیر config نمونه ای از ساختار Config است. تابع ignite یک نمونه سرور را راه‌اندازی می‌کند، روش مدیریت پیکربندی را به سرور اضافه می‌کند، و روش mount عملکرد هندلر را روی مسیرهای پایه نصب می‌کند. در نهایت، روش راه اندازی سرور را برای گوش دادن در پورت مشخص شده راه اندازی می کند.

شما می توانید برنامه های وب قدرتمند در Rust با WASM بسازید

WebAssembly (WASM) یک فرمت دستورالعمل باینری است که برای اجرا در مرورگرها و سایر دستگاه ها طراحی شده است. WASM یک قالب بایت کد سطح پایین ارائه می دهد که زبان های برنامه نویسی سطح بالاتر مانند Rust می توانند از آن به عنوان هدف کامپایل استفاده کنند.

با WASM، می توانید کد Rust خود را به فرمت باینری که اکثر مرورگرهای محبوب می توانند اجرا کنند، کامپایل کنید. WASM دنیایی از امکانات را برای ساخت برنامه های وب قوی در Rust باز می کند، از جمله برنامه های وب تمام پشته.