Rust で基本的な HTTP Web サーバーを構築する方法

Rust で基本的な HTTP Web サーバーを構築する方法
あなたのような読者は、MUO のサポートを支援します。当サイトのリンクを使用して購入すると、アフィリエイト手数料が発生する場合があります。 続きを読む。

HTTP は、情報とデータの転送にクライアント/サーバー アーキテクチャを利用します。 Rust のようなサーバー側プログラミング言語の機能の 1 つは、HTTP ベースのサービスとやり取りするためのサーバーとクライアント アプリを開発することです。





Rust は、その安全性、パフォーマンス、および信頼性の機能により、HTTP サーバーの構築に適しています。 Actix や Rocket などの Rust のサードパーティ クレートは、高トラフィックを処理できる洗練された Web サーバーの構築に人気があります。





今日のメイク動画 スクロールしてコンテンツを続ける

HTTP Web サーバーの開発に Rust を使用する必要があるのはなぜですか?

Rust の機能の一部は、ほとんどの Web サーバーを構築するための要件とまったく同じであるため、Rust は Web サーバー開発で人気を博しています。





Rust を使用すると、アプリケーションを効率的にスケーリングできるため、この言語は高性能アプリの構築に最適です。 Web サーバーやその他のサーバー側アプリケーションに Rust を使用することを検討する具体的な理由を次に示します。

Rustの高性能

高いパフォーマンスは、Rust が HTTP Web サーバーの構築に優れた選択肢である理由の 1 つです。 Rust は、メモリや CPU などのシステム リソースへの低レベル アクセスを提供し、他のサーバー側言語よりも少ないリソースでより高速に実行されるコードを記述できるようにします。



さらに、Rust の所有権システムにより、コンパイル時のガベージ コレクションが不要になります。これは、一部のサーバー側言語が遅い理由の 1 つです。

安全性と保安

Rust のメモリ管理の所有権システムにより、この言語は Web サーバー開発用に安全になります。メモリ リークやその他のセキュリティの脆弱性につながる可能性のある null またはダングリング ポインター参照は発生しません。





Rustの所有権システム これらの一般的なエラーを防ぎ、サーバーとアプリを安全に保ちます。 Rust は、バッファ オーバーフローやその他のメモリ関連のエラーの防止にも重点を置いています。

同時実行

並行性とは、出力に影響を与えることなく、プログラムの複数のユニットを順不同で実行する機能です。並行プログラムの出力は、非同期プログラムの出力と同じでなければなりません。





誰かがInstagramであなたをブロックしたかどうかをどうやって知るのですか

サーバーは複数のリクエストを同時に処理する必要があるため、同時実行はアプリケーションのパフォーマンスに大きな影響を与える可能性があります。 Rust は、軽量スレッド モデルとの共存をサポートします。

Rust での並行プログラミングのソースは、所有権システムにより、ロックやその他の同期プリミティブを必要とせずにスレッドセーフなコードを記述できることです。

Rust は最新のツールを提供します

Rust 標準ライブラリと Rust エコシステムのサードパーティ パッケージ 効果的な最新のツールを提供する ウェブサーバー開発 .

Rust のパッケージ マネージャーである Cargo は、依存関係の管理を簡素化し、プロセスを構築します。さらに、Rust は、シームレスなコード補完、エラーの強調表示、およびその他の機能を提供する Rust Analyzer などのツールを備えた優れた IDE サポートを備えています。

Actix ライブラリと Rocket ライブラリの概要

Rust の標準ライブラリには、Web サーバーを構築するために必要なユーティリティのほとんどが含まれています。次のようなサードパーティのライブラリ ロケット アクティックス Rust を使用してサーバー側アプリケーションの構築を簡素化します。

アクティックス ロケット は一般的な Rust Web フレームワークですが、ライブラリの設計と機能は異なります。

Rocket は、生産性と使いやすさを優先する高レベルの Web フレームワークです。 Rocket は、Rust で Web アプリを構築するための多くの抽象化とシンタックス シュガーを提供します。 Rocket は、強力な型付けと直感的な API 設計でも人気があります。

プロジェクトの依存関係としてロケットを追加できます charge.toml Rust で Web アプリの構築を開始するには、次のファイルを使用します。

 [dependencies] 
rocket = "0.4.11"

一方、Actix-web は、パフォーマンスとスケーラビリティを優先する低レベルのフレームワークです。 Actix は、アクター ベースの同時実行モデルを活用し、非ブロッキング I/O を提供するため、このパッケージはパフォーマンスの高い Web アプリケーションの構築に最適です。

Actix をプロジェクトの依存関係として追加します 依存関係 あなたのセクション charge.toml ファイル:

 [dependencies] 
actix-web = "4.3.1"

プロジェクトのライブラリの選択は、プロジェクトの仕様、ライブラリの機能、および Rust と HTTP の経験によって異なります。

Rust でシンプルな Web サーバーを構築する

Rust プロジェクトを作成し、Rocket または Actix フレームワークのいずれかをプロジェクトの依存関係に追加した後、 charge.toml ファイルが完成したら、Rust で Web サーバーの構築を開始する準備が整いました。

Actix で簡単な Web サーバーを構築する

  Actix GitHub URL プレビュー

Rust で Web サービスを構築するときに、要求にシリアライザーを使用できます。

Serde は、JSON、YAML、TOML などの Rust 型とデータ形式の間でデータをシリアル化および逆シリアル化するための一般的な Rust ライブラリです。 Serde は、Rust データ構造と他のデータ形式の対応する表現との間のデータ変換を定義するためのフレームワークを提供します。

プロジェクトのサードパーティ パッケージとして Serde を追加するためのディレクティブを次に示します。

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

Serde と Actix をプロジェクトの依存関係として追加したら、Rust を使用して基本的な Web サーバーを生成できます。簡単な設定方法はこちら 「こんにちは世界」 Actix を使用してクライアントに文字列を書き込む Web サーバー:

まず、必要なモジュールとタイプを actix_web 箱:

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

使用します 構造体を使用してクライアントへのメッセージをシリアル化します。 Serde は、構造体をクライアントの JSON に変換します。メッセージの構造体は次のとおりです。

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

エンドポイントのハンドラー関数を定義できるようになりました。ハンドラー関数の先頭に、カスタム動作のデコレーターを追加できます。

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

こんにちは handler 関数は GET リクエストを処理します。関数は、 返事 からの特性 アクティックス パッケージ。

json の方法 HttpResponse::Ok() type は構造体インスタンスを受け取ります 内部で処理し、クライアントに応答を返します。

エンドポイントを定義したら、サーバー インスタンスを起動し、エンドポイントをルートにマウントできます。

子供にタイプするように教える方法
 #[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 関数は新しいサーバー インスタンスです。の 主要 関数が開始され、サーバーは こんにちは ハンドラー関数と新しいアプリ インスタンス。の 練る メソッドはサーバーを指定された URL にバインドし、 走る 関数はサーバーを実行します。

  Actix エンドポイントのテスト結果

Rocket で簡単な Web サーバーを構築する

  ロケット URL プレビュー

Rocket は最小限に抑えられているため、Web サーバー以外の依存関係なしに単純な Web サーバーをセットアップできます。 ロケット 木枠。

を使用して簡単なサーバーをセットアップする方法は次のとおりです。 「こんにちは世界」 ロケットを使用するエンドポイント:

まず、サーバーに必要な依存関係をインポートします。

 #![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 の実験的機能を有効にします。の #[マクロ使用] 属性は、からマクロをインポートします ロケット モジュール。

リクエストに応じて HTML を提供するハンドラ関数を次に示します。

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

こんにちは世界 関数は、HTML 静的文字列を返します。 コンテンツ::Html 関数。

サーバーの構成構造体宣言は次のとおりです (Rocket フレームワークの規則)。

 struct Config { 
    port: u16,
}

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

サーバーを実行すると、 /ポート ポートステータスのエンドポイント。

最後に、サーバー インスタンスを作成します。 発火 関数。構成を追加し、ルートをマウントして、サーバーを起動します。

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

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

構成 変数はのインスタンスです 設定 構造体。の 発火 関数はサーバー インスタンスを開始します。 管理 メソッドがサーバーに構成を追加し、 マウント メソッドは、ハンドラー関数をベース ルートにマウントします。最後に、 発売 メソッドはサーバーを起動して、指定されたポートでリッスンします。

WASM を使用して Rust で強力な Web アプリケーションを構築できます

WebAssembly (WASM) は、ブラウザやその他のデバイスで実行するために設計されたバイナリ命令形式です。 WASM は、Rust のような高レベルのプログラミング言語がコンパイル ターゲットとして使用できる低レベルのバイトコード形式を提供します。

WASM を使用すると、Rust コードを最も一般的なブラウザーで実行できるバイナリ形式にコンパイルできます。 WASM は、フルスタック Web アプリを含む堅牢な Web アプリケーションを Rust で構築するための可能性の世界を開きます。