Ruby on Rails の文脈で「ミドルウェア」という言葉をよく耳にします。正確には何ですか?具体例を挙げていただけますか?
5 に答える
ミドルウェアは、Web アプリケーション用の標準 Ruby API である Rack に関連しています。最近の Rails アプリケーションは Rack アプリケーションであるため、両方に適用されます。
Rack ミドルウェアは、アプリケーション サーバー (Webrick、Thin、Unicorn、Passenger など) と実際のアプリケーション (Rails アプリケーションなど) の間のすべてです。これは、Web アプリケーション サーバーとアプリケーション自体の間のパイプラインです。
Rack アプリケーションへの入力は、すべての HTTP 要求の詳細 (およびその他) を含む「環境」です。出力は HTTP 応答です。ミドルウェア層は、入力、出力、またはその両方を変更できるフィルターのようなものです。Rails はミドルウェアを使用して一部の機能(クエリ キャッシング、Cookie ストア、http メソッドの拡張)を実装していますが、独自の機能を追加することもできます。
Rack ミドルウェアは、基礎となるフレームワークに関係なく、Rack を使用する Web アプリケーション全体で単純な Web 関連の動作を再利用する効果的な方法です。アプリケーションの一部が機能を追加するが、HTTP 応答を担当しない場合、それは Rack ミドルウェアと見なされます。
Rack ミドルウェアとして実装できるものの例としては、次のものがあります。
- HTTP キャッシング (サーバー側とクライアント側)
- ロギング
- 認証
- モニタリング
- HTTP ヘッダー フィルタリング
この SO questionも参照してください。
キャッシング サービスを作成するとします。このキャッシュ サービスはアプリに依存しないため、多くのアプリケーションで使用できます。多くの異なる Web サーバーもサポートしたいと考えています。
サーバーとフレームワークの中間にあることに注意してください。ミドルウェアの一例です。これはアプリケーション ロジックではなく、実際には低レベルのネットワークのものでもありませんが、その間のどこかでサービスを提供します。例としては、QoS (サービス品質)、セキュリティ、キャッシングなどがあります。
あなたのサービスが人気のある (そしてあまり人気のない) サーバー (シン、webrick) のn 個すべてをサポートしていれば、それは素晴らしいことです。あなたがそれらをサポートすれば、より多くの人があなたの素晴らしいソフトウェアを使用できるようになります. これを実現するのは非常に困難であることがわかります。各サーバーを特別なサーバー固有のコードでサポートする必要があります。
多くの Web フレームワークもあるからです。Rails は 500 ポンドのゴリラですが、他にも Merb やSinatraなどのフレームワークがあります。キャッシング サービスでこれらをサポートすることは、サポートすべき別のことです。これで、 nxmの異なるパスがサポートされます。なんという引きずり。
ラックに入ります。Rack はフレームワークとサーバーの間に位置し、キャッシュ サーバーをコーディングするためのインターフェイスを提供します。サーバーとフレームワークがラックをサポートしている場合、ほとんどの場合、サービスはラック インターフェイスをサポートするだけでよく、ラックがサポートするすべてのフレームワークとサービスのサポートを受けることができます。(これは、dvi にラテックス コンパイルしてから、dvi を ps、pdf などに変換するのに少し似ています)。Merb から WEBrick へのコンバーターや、Sinata から Thin への別のコンバーターは必要ありません。キャッシング サービスがラックをサポートしている場合、違いから隔離されます。
アプリとサーバーの間の n サーバーに分岐する前に m フレームワークがすべて集まるこの「狭いウエスト」により、ルーティング、ログ記録、サーバーをバイパスする静的サービスなどの機能を追加するのに適した場所を提供する方法もわかります。解釈されたフレームワークの遅さなど。
Rails ミドルウェアを使用すると、Rails に到達する前にリクエストまたはレスポンスをキャッチして変更することができます。(あなたはラックとレールの中間にいます)。たとえば、「image/png」という MIME タイプを返すすべての応答を取得し、サービスのためにラックに移動させる前に透かしを追加できます。または、何らかの理由で気に入らないリクエスト (許可されていない、ヘッダーがない) を除外して、それらがレールにヒットしないようにすることもできます。または、Rails に渡す前に受信リクエストにヘッダーを追加することもできます。または、レールからの応答を受け取ることができます。それが「text/html」の場合は、出力に渡す前に html を圧縮 (空白などを削除) できます。( http://github.com/maxim/html_pressで実験していました)
これらの小さなアプリはたくさんあり、「ミドルウェア」としてプラグインされています。
CodeRackを見てみると、いくつかの可能性を理解するのに役立ちます。Ruby on Rails のコンテキストでよく耳にするミドルウェアとはどういうものですか?