Was ist der Unterschied zwischen OpenResty und NGINX?
API7.ai
September 9, 2022
Die Vorteile von OpenResty sind offensichtlich. Bevor wir uns detailliert damit befassen, lassen Sie uns kurz den Entwicklungsprozess von OpenResty durchgehen, was Ihnen helfen wird, den folgenden Inhalt besser zu verstehen.
Entwicklungsprozess von OpenResty
OpenResty wurde nicht wie andere Entwicklungssprachen von Grund auf neu entwickelt, sondern basiert auf ausgereiften Open-Source-Komponenten – NGINX und LuaJIT. OpenResty wurde 2007 geboren, aber seine erste Version wählte nicht Lua, sondern Perl, was viel mit der technischen Vorliebe des Autors zu tun hat.
Die Leistung von Perl war jedoch weit davon entfernt, die Anforderungen zu erfüllen, daher wurde Perl in der zweiten Version durch Lua ersetzt. Dennoch spielt Perl in den offiziellen Projekten von OpenResty immer noch eine wichtige Rolle. OpenResty-Ökosystemprojekte werden mit Perl erstellt, wie z.B. Testframeworks, Linter, CLI usw. Wir werden sie später Schritt für Schritt vorstellen.
Da die hohe Leistung und die dynamischen Vorteile von OpenResty sehr gut für die Anforderungen des CDN-Geschäfts geeignet sind, wurde OpenResty schnell zum technischen Standard für CDN. Darüber hinaus begann OpenResty durch die reichhaltigen lua-resty-*
-Bibliotheken, sich allmählich vom Schatten von NGINX zu lösen und sein eigenes Ökosystem zu bilden, das in API-Gateways, Soft-WAFs und anderen Bereichen weit verbreitet ist.
Ich sage oft, dass OpenResty eine weit verbreitete Technologie ist, aber keine populäre Technologie, was widersprüchlich klingt. Was bedeutet das?
Es ist weit verbreitet, weil OpenResty heute der weltweit fünftgrößte Webserver ist.
Es ist nicht populär, weil der Anteil der Nutzung von OpenResty zum Aufbau von Geschäftssystemen nicht hoch ist. Die meisten Benutzer verwenden OpenResty, um eingehenden Datenverkehr zu verarbeiten, und sie dringen nicht tief in das Geschäft ein. Daher ist die Nutzung von OpenResty natürlich nur ein oberflächlicher Geschmack, und es reicht aus, um die aktuellen Anforderungen zu erfüllen. Dies hängt natürlich auch damit zusammen, dass OpenResty keine ausgereiften Webframeworks und Ökosysteme wie Java und Python hat.
Nachdem ich so viel gesagt habe, werde ich mich als nächstes darauf konzentrieren, einige Punkte vorzustellen, an denen das Open-Source-Projekt OpenResty lobenswert und lernenswert ist.
Highlights von OpenResty
Detaillierte Dokumentation und Testfälle
Ja, Dokumentation und Tests sind entscheidende Indikatoren dafür, ob ein Open-Source-Projekt zuverlässig ist, sogar noch vor Codequalität und Leistung.
Die Dokumentation von OpenResty ist sehr detailliert, und der Autor hat jeden Punkt, der beachtet werden muss, in der Dokumentation festgehalten. Meistens müssen wir nur die Dokumentation sorgfältig durchlesen, um das Problem, auf das wir stoßen, zu lösen, ohne zu googeln oder den Quellcode zu durchsuchen. Der Einfachheit halber bietet OpenResty auch ein Befehlszeilentool, restydoc
, das Ihnen helfen soll, die Dokumentation über die Shell anzuzeigen und Unterbrechungen im Codierungsprozess zu vermeiden.
Es gibt jedoch nur ein oder zwei verfügbare Code-Snippets in der Dokumentation, und es gibt keine vollständigen und komplexen Beispiele. Wo kann man solche Beispiele finden?
Für OpenResty ist es natürlich das /t
-Verzeichnis, das alle Testfälle enthält. Jeder Testfall umfasst die vollständige NGINX-Konfiguration und Lua-Code sowie die Testeingabe- und erwartete Ausgabedaten. Das Testframework von OpenResty unterscheidet sich jedoch vollständig von anderen Assertion-basierten Testframeworks, was ich später in einem speziellen Kapitel vorstellen werde.
Synchrones Nicht-Blockieren
Coroutine ist eine neue Funktion, die viele Skriptsprachen in den letzten Jahren hinzugefügt haben, um die Leistung zu verbessern. Aber sie sind nicht perfekt implementiert, einige sind syntaktischer Zucker, und einige erfordern explizite Schlüsselwortdeklarationen.
OpenResty unterstützt Coroutine seit dem ersten Tag und implementiert ein synchrones nicht-blockierendes Programmiermodell. Dies ist wichtig, weil Programmierer auch Menschen sind, und der Code sollte besser mit den Denkgewohnheiten des Menschen übereinstimmen. Explizite Rückrufe und asynchrone Schlüsselwörter unterbrechen das Denken und erschweren das Debugging.
Was ist also synchrones Nicht-Blockieren? Lassen Sie uns zuerst über synchron sprechen. Das ist sehr einfach: sequentiell gemäß dem Code ausführen. Zum Beispiel der folgende Pseudocode:
local res, err = query-mysql(sql)
local value, err = query-redis(key)
In der gleichen Anfrage, wenn wir auf das Abfrageergebnis von MySQL warten müssen, bevor wir mit der Abfrage von Redis fortfahren können, ist das synchron; wenn wir nicht auf die Rückkehr von MySQL warten müssen und wir mit der Abfrage von Redis fortfahren können, dann ist das asynchron. Für OpenResty sind die meisten Operationen synchron. Nur APIs, die mit Hintergrund-Timern zusammenhängen, wie ngx.timer
, sind asynchrone Operationen.
Was Nicht-Blockieren betrifft, ist dies ein Konzept, das leicht mit asynchron verwechselt wird. Wenn wir hier von Blockieren sprechen, meinen wir das Blockieren des Betriebssystem-Threads. Schauen wir uns das obige Beispiel weiter an und nehmen an, dass die Abfrage von MySQL 1s
dauert. Wenn in dieser 1s
die Ressourcen des Betriebssystems (CPU) im Leerlauf sind und dumm auf die Rückkehr warten, ist das blockierend; wenn die CPU die Gelegenheit nutzt, um andere Verbindungsanfragen zu verarbeiten, ist das nicht-blockierend. Nicht-Blockieren ist auch der Schlüssel zur Realisierung hoher Parallelitäten wie C10K und C100K.
Das Konzept des synchronen Nicht-Blockierens ist wesentlich. Meiner Meinung nach sollte dieses Konzept jedoch nicht durch Analogie verstanden werden, da eine unangemessene Analogie Sie wahrscheinlich noch mehr verwirrt.
In OpenResty kann der obige Pseudocode direkt synchrones Nicht-Blockieren erreichen, ohne explizite Schlüsselwörter. Es zeigt sich hier wieder, dass die Vereinfachung der Nutzung für Entwickler eines der Konzepte von OpenResty ist.
Dynamik
Ein großer Vorteil von OpenResty, der noch nicht vollständig ausgeschöpft wurde, ist seine Dynamik.
Traditionelle Webserver wie NGINX erfordern, dass wir die Konfigurationsdatei auf der Festplatte ändern und sie neu laden, um wirksam zu werden, wenn Änderungen auftreten, da sie keine APIs zur Steuerung des Laufzeitverhaltens bieten. Daher hat NGINX in Mikrodiensten, die häufige Änderungen erfordern, viele Versuche unternommen, aber nichts hat sich verbessert. Und das plötzliche Auftauchen von Envoy mit der dynamischen Steuerungs-API von xDS stellt eine erhebliche Bedrohung durch Dimensionsreduktionsangriffe für NGINX dar.
Im Gegensatz zu NGINX und Envoy wird OpenResty von der Skriptsprache Lua gesteuert, und Dynamik ist der natürliche Vorteil von Lua. Zum Beispiel können wir durch die Lua-API, die im lua-nginx-module
-Modul in OpenResty bereitgestellt wird, Routen, Upstreams, SSL-Zertifikate, Anfragen, Antworten usw. dynamisch steuern. Noch weiter können wir die Verarbeitungslogik des Geschäfts ändern, ohne OpenResty neu zu starten, nicht beschränkt auf die Lua-API, die von OpenResty bereitgestellt wird.
Hier ist eine ausgezeichnete Analogie, um Ihnen zu helfen, das oben Gesagte über Dynamik zu verstehen. Stellen Sie sich einen Webserver einfach als ein Auto vor, das auf der Autobahn fährt, NGINX muss anhalten, um Reifen zu wechseln und die Farbe zu ändern; Envoy kann Reifen und Farben während der Fahrt ändern; und OpenResty kann zusätzlich zu den erstgenannten Fähigkeiten auch in einen SUV verwandelt werden, ohne anzuhalten.
Nachdem man diese magische Fähigkeit beherrscht hat, hat sich der Kompetenz- und Vorstellungskreis von OpenResty auf andere Bereiche wie Serverless und Edge Computing erweitert.
Was sollte gelernt werden?
Nachdem wir so viele wichtige Funktionen von OpenResty besprochen haben, was sollten wir lernen? Ich bevorzuge es, mich auf die Hauptlinie zu konzentrieren, anstatt sich an Kleinigkeiten festzuhalten, damit wir ein Wissenssystem mit einem klaren Kontext aufbauen können.
Sie müssen wissen, dass kein Kurs, egal wie umfassend er ist, alle Probleme abdecken kann und Ihnen nicht direkt helfen kann, jeden Bug und jede Ausnahme online zu lösen.
Zurück zum Studium von OpenResty, meiner Meinung nach sollten Sie, wenn Sie OpenResty gut lernen wollen, die folgenden acht Schlüsselpunkte verstehen:
- Synchrones nicht-blockierendes Programmiermodell
- Rolle der verschiedenen Request/Response-Phasen
- Unterschiede zwischen LuaJIT und Lua
- OpenResty-API und umgebende Bibliotheken
- Coroutine und Cosocket
- Unit-Test-Framework und Leistungstest-Tools
- Flammendiagramm und umgebende Toolchain
- Leistungsoptimierung
Diese Punkte sind in unserem Studium wesentlich, und ich werde sie in jedem Kapitel separat besprechen. Im Lernprozess hoffe ich jedoch, dass Sie von einem Fall auf andere schließen und einige Kapitel nach Ihren Interessen und Ihrem Hintergrund vertiefen können.
Wenn Sie ein Anfänger mit OpenResty sind, können Sie dem Fortschritt des Kurses folgen, OpenResty in Ihrer Umgebung installieren und den Beispielcode ausführen und ändern. Denken Sie daran, Ihr Fokus liegt darauf, das Gesamtbild von OpenResty zu verstehen, nicht an einem einzelnen Wissenspunkt hängen zu bleiben. Natürlich können Sie uns jederzeit im Live-Chat kontaktieren, wenn Sie Fragen haben.
Wenn Sie OpenResty in Ihrem Projekt verwenden, ist das großartig! Ich glaube jedoch, dass Sie, wenn Sie die Kapitel über LuaJIT und Leistungsoptimierung lesen, mehr Resonanz und praktische Anwendungen haben werden und die Leistungsverbesserung vor und nach der Optimierung in Ihrem Projekt sehen werden.
Darüber hinaus, wenn Sie Code zu OpenResty und umgebenden Bibliotheken beitragen möchten, ist die größte Hürde nicht, die Prinzipien von OpenResty zu verstehen oder NGINX-C-Module zu schreiben, sondern Testfälle und Code-Spezifikationen. Ich habe zu viele OpenResty-Mitarbeiter (mich eingeschlossen) gesehen, die Testfälle und Code-Stile auf einem PR wiederholt ändern, und es gibt zu viele unausgesprochene Regeln. Daher sind die Code-Spezifikationen und Unit-Test-Abschnitte des Kurses für Sie.
Und wenn Sie ein QA-Ingenieur sind, selbst wenn Sie OpenResty nicht verwenden, werden das Testframework und die Leistungsanalyse-Toolset von OpenResty Ihnen viele Anregungen geben. Schließlich sind die Investitionen und die Akkumulation von OpenResty in Tests ziemlich tief.