TL;DR

クライアントとサーバ間のネットワーク処理を、柔軟かつ簡単に扱えるようにする Rust のクレート。axum で採用されている。

なぜ必要か

HTTP サーバを作るには、タイムアウトやレートリミット、認証、ロードバランシングなど、多くの共通処理が必要になる。tower はこれらを Service と Layer という抽象単位にまとめ、プラグインのように差し込めるようにする。この抽象単位をミドルウェアと呼ぶ。

仕組み

tower::Service

任意の Request を受け取り、任意の Response を返すことだけが定義されたトレイトである。ロギングや認証、リトライのためのミドルウェアは、この Service として実装する。

tower::Layer

tower::Service を包むデコレータのトレイトである。複数の Service で実行したい処理を登録できる。名前のとおり、何層にも重ねて 1 つの処理の基盤を作れる。

関連

出典