TL;DR
2 つの意味がある。もとは、OS とアプリケーションの間に入るソフトウェアのこと。Web フレームワークでは、リクエストを受け取ってからレスポンスを返すまでの共通処理を、層状に差し込む仕組みを指す。
なぜ必要か
Wikipedia によると、OS とアプリケーションの間に入るミドルウェアは、OS の機能を拡張したり、アプリケーションに共通する機能をまとめたりする。
Web フレームワークのミドルウェアも、共通処理をまとめるためのものである。tower のドキュメントによると、タイムアウト、レートリミット、ロードバランシングといった処理を、ネットワークのクライアントやサーバに再利用できる形で追加できる。
仕組み
Wikipedia によると、Web フレームワークのミドルウェアは、HTTP リクエストからコントローラに至るまでと、コントローラから HTTP レスポンスを返すまでの共通処理を層状に追加する。処理への到達時と返却時の両方に関われることと、層として重ねられることが特徴である。
tower では、内側の Service を包み、その前後に振る舞いを足す Service をミドルウェアと呼ぶ。Layer は、ある Service を受け取って別の Service を返すもので、ミドルウェアを組み合わせるのに使う。
例
OS とアプリケーションの間に入るミドルウェアには、データベース管理システム、Web サーバ、アプリケーションサーバ、メッセージ通信の基盤などがある。Web フレームワークでは、Django、Laravel、ASP.NET Core などがミドルウェアの仕組みを持つ。Mocket では、use_middleware で関数をミドルウェアとして登録する。