Ich höre oft den Begriff "Middleware" im Zusammenhang mit Ruby on Rails. Was genau ist das? Können Sie konkrete Beispiele nennen?
Antworten
Zu viele Anzeigen?Middleware bezieht sich auf Rack, die Standard-Ruby-API für Webanwendungen. Da Rails-Anwendungen heutzutage Rack-Anwendungen sind, gelten sie für beide.
Rack-Middleware ist alles zwischen den Anwendungsservern (Webrick, Thin, Unicorn, Passenger, ...) und der eigentlichen Anwendung, wie z.B. Ihrer Rails-Anwendung. Es ist die Pipeline zwischen dem Webanwendungsserver und der Anwendung selbst.
Die Eingabe für eine Rack-Anwendung ist eine "Umgebung", die alle Details der HTTP-Anfrage (und mehr) enthält. Die Ausgabe ist eine HTTP-Antwort. Middleware-Schichten sind wie Filter die den Eingang, den Ausgang oder beides verändern können. Rails verwendet Middleware, um einige seiner Funktionen zu implementieren (Abfrage-Caching, Cookie-Speicher, http-Methodenerweiterung), aber Sie können auch eigene hinzufügen.
Rack-Middleware ist ein effektiver Weg, um einfaches webbezogenes Verhalten in Webanwendungen wiederzuverwenden, die Rack verwenden, unabhängig vom zugrunde liegenden Framework. Wenn ein Teil Ihrer Anwendung fügt Funktionalität hinzu, ist aber nicht für eine HTTP-Antwort verantwortlich ist es als Rack-Middleware zu betrachten.
Einige Beispiele für Maßnahmen, die Sie umsetzen könnten, sind Rack-Middleware umfassen:
- HTTP-Caching (serverseitig und clientseitig)
- Protokollierung
- Authentifizierung
- Überwachung
- HTTP-Header-Filterung
Siehe auch diese SO-Frage .
Stellen Sie sich vor, Sie möchten einen Caching-Dienst einrichten. Dieser Caching-Dienst wäre anwendungsunabhängig, so dass Sie ihn mit vielen Anwendungen nutzen könnten. Sie würden auch gerne viele verschiedene Webserver unterstützen.
Ist Ihnen aufgefallen, dass es sich quasi in der Mitte zwischen Server und Framework befindet? Das ist ein Beispiel für Middleware. Es handelt sich nicht um Anwendungslogik und auch nicht um Low-Level-Netzwerke, sondern um einen Dienst, der irgendwo dazwischen liegt. Einige Beispiele sind QoS (Quality of Service), Sicherheit, Caching, ...
Es wäre schön, wenn Ihr Dienst alle n der beliebten (und einiger nicht so beliebter) Server (Thin, Webrick). Wenn Sie sie alle unterstützen würden, könnten mehr Menschen Ihre wunderbare Software nutzen. Sie können sich vorstellen, dass die Umsetzung dieses Vorhabens sehr mühsam wäre, da Sie jeden Server mit speziellem serverspezifischen Code unterstützen müssten.
Das ist aber nur die Hälfte des Problems, denn es gibt auch eine Reihe von Web-Frameworks. Rails ist der 500 Pfund schwere Gorilla, aber es gibt auch andere Frameworks, wie Merb und Sinatra . Diese in Ihrem Caching-Dienst zu unterstützen ist eine weitere m verschiedene Dinge zu unterstützen. Jetzt unterstützen Sie n x m verschiedene Wege. Wie ärgerlich.
Eingabe Gestell . Rack sitzt zwischen den Frameworks und den Servern und bietet Ihnen eine Schnittstelle, auf der Sie Ihren Caching-Server programmieren können. Wenn die Server und Frameworks Rack unterstützen, und das tun die meisten, muss Ihr Dienst nur die Rack-Schnittstelle unterstützen und Sie erhalten Unterstützung für alle Frameworks und Dienste, die Rack unterstützt. (Es ist ein bisschen so, als würde man Latex nach dvi kompilieren und dann das dvi in ps, pdf, .... umwandeln). Sie brauchen keinen Konverter von Merb nach WEBrick und einen weiteren von Sinata nach Thin. Wenn Ihr Caching-Dienst Rack unterstützt, sind Sie von den Unterschieden isoliert.
Mit dieser "schmalen Taille", in der m-Frameworks alle zusammenkommen, bevor sie sich auf n-Server zwischen der Anwendung und dem Server verzweigen, können Sie auch sehen, wie es einen guten Platz bietet, um Funktionen wie Routing, Protokollierung, statisches Serving, das die Langsamkeit Ihres interpretierten Frameworks umgeht, usw. hinzuzufügen.
Rails-Middleware ermöglicht es Ihnen, Anfragen oder Antworten abzufangen, bevor sie Rails erreichen, und sie zu ändern. (Sie befinden sich in der Mitte zwischen Rack und Rails). Zum Beispiel können Sie jede Antwort, die einen "image/png" Mime-Type zurückgibt, mit einem Wasserzeichen versehen, bevor sie an Rack weitergegeben wird. Oder Sie können Anfragen herausfiltern, die Sie aus irgendeinem Grund nicht mögen (unautorisiert, ohne Header) und sie gar nicht erst zu Rails durchlassen. Oder Sie können einer eingehenden Anfrage einen Header hinzufügen, bevor Sie sie an Rails weiterleiten. Oder man kann die von Rails kommende Antwort nehmen, und wenn sie "text/html" ist, kann man html komprimieren (Leerzeichen entfernen usw.), bevor man sie an die Ausgabe weitergibt. (Ich habe damit experimentiert in http://github.com/maxim/html_press )
Diese kleinen Anwendungen sind reichlich vorhanden und werden als "Middleware" eingebunden.
Erläuterung für einen 4-Jährigen:
Erinnern Sie sich an das Spiel: "Chinesisches Flüstern" (keine rassistische Absicht - so hieß das Spiel zu meiner Zeit tatsächlich). Sie wollen Ihrem Freund oder Ihrer Freundin, der oder die am anderen Ende der Leitung sitzt, eine besondere Nachricht übermitteln. Aber Sie können es ihm oder ihr nicht direkt sagen: Sie müssen Ihre Nachricht von Person zu Person weitergeben, bis sie ihn oder sie schließlich erreicht.
Aber in den meisten Fällen werden Sie feststellen, dass die Nachricht auf ihrem Weg durch die Kette geändert wird, bis sie den Endpunkt erreicht. Zum Beispiel:
- Absender : "Du wirst dich immer an den Tag erinnern, an dem du fast Captain Jack Sparrow gefangen hast."
- Person 1 - geht weiter: "Du wirst dich immer an den Tag erinnern, an dem du fast Captain Jack Sparrow gefangen hast."
- Person 2 - geht weiter: "Du wirst dich immer an den Tag erinnern, an dem du fast Captain Jack Sparrow gefangen hast."
- Person 3 - geht weiter: "Du wirst dich an den Tag erinnern, an dem du Captain Jack Sparrow gefangen hast."
- Person 4 - geht weiter: "Du wirst dich an Captain Jack Sparrow erinnern."
- Endgültige Nachricht erhalten : "Erinnern"
Middleware sind im Grunde die Leute, die zwischen Ihnen, dem Absender der Nachricht, und der endgültigen Nachricht, die empfangen wurde, stehen: Haben Sie bemerkt, wie sie die Nachricht ändern oder filtern können? Das ist es, worum es bei Middleware in einer Nussschale geht. Zugegeben, die Anologie ist überstrapaziert, aber ich hoffe, dass sie Ihnen eine Grundlage bietet, auf der Sie die eher technischen Antworten oben verstehen können.