TL;DR
クライアントとサーバ間のネットワーク処理を、柔軟かつ簡単に扱えるようにする Rust のクレート。axum で採用されている。
なぜ必要か
HTTP サーバを作るには、タイムアウトやレートリミット、認証、ロードバランシングなど、多くの共通処理が必要になる。tower はこれらを Service と Layer という抽象単位にまとめ、プラグインのように差し込めるようにする。この抽象単位をミドルウェアと呼ぶ。
仕組み
tower::Service
任意の Request を受け取り、任意の Response を返すことだけが定義されたトレイトである。ロギングや認証、リトライのためのミドルウェアは、この Service として実装する。
tower::Layer
tower::Service を包むデコレータのトレイトである。複数の Service で実行したい処理を登録できる。名前のとおり、何層にも重ねて 1 つの処理の基盤を作れる。