Node ist ein serverseitiger JavaScript-Interpreter, der das Konzept der Funktionsweise von Servern ändern wird. Ziel ist es, Programmierern dabei zu helfen, hoch skalierbare Anwendungen zu erstellen und Code zu schreiben, der Zehntausende gleichzeitiger Verbindungen zu einer (und nur einer) physischen Maschine verarbeiten kann.
Einführung
Wenn Sie von Node gehört oder einige Artikel gelesen haben, in denen verkündet wird, wie großartig Node ist, fragen Sie sich vielleicht: „Was zum Teufel ist Node?“ Selbst nachdem Sie sich die Homepage von Node angesehen haben, verstehen Sie vielleicht immer noch nicht, was Knoten ist? Node ist sicherlich nicht für jeden Programmierer geeignet, aber es könnte etwas sein, mit dem einige Programmierer zu kämpfen haben.
Um zu erklären, was Node.js ist, bietet dieser Artikel kurz einige Hintergrundinformationen: das Problem, das es löst, wie es funktioniert, wie man eine einfache Anwendung ausführt und schließlich, wann Node eine gute Lösung ist. In diesem Artikel wird weder beschrieben, wie eine komplexe Node-Anwendung geschrieben wird, noch handelt es sich um ein umfassendes Node-Tutorial. Die Lektüre dieses Artikels soll Ihnen bei der Entscheidung helfen, ob Sie Node weiter erlernen sollten, damit Sie es für Ihr Unternehmen nutzen können.
Welches Problem soll Node lösen?
Das erklärte Ziel von Node besteht darin, „eine einfache Möglichkeit zum Aufbau skalierbarer Netzwerkprogramme bereitzustellen.“ Was stimmt mit dem aktuellen Serverprogramm nicht? Lass uns eine Matheaufgabe lösen. In Sprachen wie Java™ und PHP erzeugt jede Verbindung einen neuen Thread, und jeder neue Thread erfordert möglicherweise 2 MB zugehörigen Speicher. Auf einem System mit 8 GB RAM beträgt die theoretische maximale Anzahl gleichzeitiger Verbindungen 4.000 Benutzer. Wenn Ihr Kundenstamm wächst, müssen Sie weitere Server hinzufügen, wenn Ihre Webanwendung mehr Benutzer unterstützen soll. Dies erhöht natürlich die Kosten wie Serverkosten, Verkehrskosten und Arbeitskosten. Zusätzlich zu diesen steigenden Kosten besteht auch das potenzielle technische Problem, dass Benutzer für jede Anfrage einen anderen Server verwenden könnten, sodass alle gemeinsam genutzten Ressourcen von allen Servern gemeinsam genutzt werden müssen. Aus all den oben genannten Gründen besteht der Engpass in der gesamten Webanwendungsarchitektur (einschließlich Datenverkehr, Prozessorgeschwindigkeit und Speichergeschwindigkeit) in der maximalen Anzahl gleichzeitiger Verbindungen, die der Server verarbeiten kann.
Die Lösung dieses Problems durch Node besteht darin, die Art der Verbindung zum Server zu ändern. Anstatt für jede Verbindung einen neuen Betriebssystem-Thread zu erzeugen (und dafür etwas Speicher zuzuweisen), gibt jede Verbindung ein Ereignis aus, das in einem Prozess der Node-Engine ausgeführt wird. Der Knoten behauptet, dass er niemals einen Deadlock durchführen kann, da er überhaupt keine Sperren zulässt und E/A-Aufrufe nicht direkt blockiert. Node behauptet außerdem, dass die Server, auf denen es läuft, Zehntausende gleichzeitiger Verbindungen unterstützen können.
Nachdem Sie nun über ein Programm verfügen, das Zehntausende gleichzeitiger Verbindungen verarbeiten kann, was können Sie mit Node eigentlich erstellen? Es wäre beängstigend, wenn Sie eine Webanwendung hätten, die so viele Verbindungen verarbeiten müsste! Das ist ein „Wenn Sie dieses Problem haben, ist es überhaupt kein Problem“. Bevor wir die obige Frage beantworten, werfen wir einen Blick auf die Funktionsweise und die Funktionsweise von Node.
Knoten ist definitiv nicht was?
Ja, Node ist ein Serverprogramm. Allerdings ist das Basisprodukt Node sicherlich nicht wie Apache oder Tomcat. Im Wesentlichen handelt es sich bei diesen Servern um „installationsfertige“ Serverprodukte, die eine sofortige Bereitstellung von Anwendungen ermöglichen. Mit diesen Produkten können Sie einen Server in weniger als einer Minute betriebsbereit haben. Node ist sicherlich nicht dieses Produkt. Ähnlich wie Apache, das es Entwicklern ermöglicht, dynamische Webseiten zu erstellen, indem es ein PHP-Modul und ein SSL-Modul zur Implementierung sicherer Verbindungen hinzufügt, verfügt Node auch über ein Modulkonzept, das das Hinzufügen von Modulen zum Node-Kern ermöglicht. Für Node stehen buchstäblich Hunderte von Modulen zur Auswahl, und die Community ist sehr aktiv bei der Erstellung, Veröffentlichung und Aktualisierung von Modulen und kann sogar Dutzende von Modulen pro Tag bearbeiten. Der gesamte Modulteil von Node wird später in diesem Artikel besprochen.
Wie funktioniert Node?
Der Knoten selbst führt V8-JavaScript aus. Moment, JavaScript auf dem Server? Ja, das hast du richtig gelesen. Serverseitiges JavaScript mag für Programmierer, die JavaScript nur auf dem Client verwenden, ein neues Konzept sein, aber das Konzept selbst ist nicht weit hergeholt. Warum kann also nicht dieselbe Programmiersprache, die auf dem Client verwendet wird, auf dem Server verwendet werden?
Was ist ein V8? Die V8-JavaScript-Engine ist die zugrunde liegende JavaScript-Engine, die Google für seinen Chrome-Browser verwendet. Nur wenige Leute denken darüber nach, was JavaScript tatsächlich auf dem Client-Rechner macht? Tatsächlich ist die JavaScript-Engine für die Interpretation und Ausführung des Codes verantwortlich. Mit V8 hat Google einen in C geschriebenen superschnellen Interpreter erstellt, der über eine weitere einzigartige Funktion verfügt: Sie können die Engine herunterladen und in jede Anwendung einbetten. Die V8-JavaScript-Engine ist nicht auf die Ausführung in einem Browser beschränkt. Node nimmt also tatsächlich die von Google geschriebene V8-JavaScript-Engine und baut sie neu auf, damit sie auf dem Server funktioniert. Es ist perfekt! Warum eine neue Sprache erstellen, wenn es bereits eine gute Lösung gibt?
Ereignisgesteuerte Programmierung
Viele Programmierer wurden in dem Glauben erzogen, dass objektorientierte Programmierung das perfekte Programmierdesign sei, was sie dazu bringt, andere Programmiermethoden abzulehnen. Node verwendet ein sogenanntes ereignisgesteuertes Programmiermodell.
Listing 1. Ereignisgesteuerte Programmierung mit jQuery auf dem Client
// Wenn eine Taste gedrückt wird, tritt ein Ereignis ein – kümmere dich darum
// direkt hier in einer anonymen Funktion, wo alle
// Notwendige Variablen sind vorhanden und können direkt referenziert werden
$("#myButton").click(function(){
If ($("#myTextField").val() != $(this).val())
warning("Feld muss mit Schaltflächentext übereinstimmen");
});
Eigentlich gibt es keinen Unterschied zwischen Serverseite und Clientseite. Ja, es gibt kein Anklicken oder Eingeben einer Schaltfläche in das Textfeld, aber auf einer höheren Ebene finden Ereignisse statt. Es entsteht eine Verbindung, das ist ein Event! Über die Verbindung werden Daten empfangen, was ebenfalls ein Ereignis ist! Es fließen keine Daten mehr über die Verbindung. Dies ist immer noch ein Ereignis!
Warum ist diese Art der Einrichtung ideal für Node? JavaScript ist eine großartige ereignisgesteuerte Programmiersprache, da sie die Verwendung anonymer Funktionen und Abschlüsse ermöglicht und, was noch wichtiger ist, ihre Syntax jedem vertraut ist, der Code geschrieben hat. Die Rückruffunktion, die beim Eintreten eines Ereignisses aufgerufen wird, kann an der Stelle geschrieben werden, an der das Ereignis erfasst wird. Dadurch ist der Code einfach zu schreiben und zu warten, ohne komplexe objektorientierte Frameworks, ohne Schnittstellen und ohne die Möglichkeit einer Überentwicklung. Hören Sie sich einfach das Ereignis an, schreiben Sie eine Rückruffunktion und überlassen Sie den Rest dem System!
Beispielknotenanwendung
Schauen wir uns zum Schluss etwas Code an! Lassen Sie uns alles, was wir besprochen haben, zusammenfassen, um unsere erste Node-Anwendung zu erstellen. Wir wissen bereits, dass Node ideal für die Verarbeitung von Anwendungen mit hohem Datenverkehr geeignet ist. Deshalb erstellen wir eine sehr einfache Webanwendung, die auf maximale Geschwindigkeit ausgelegt ist. Hier sind die spezifischen Anforderungen des „Chefs“ für unsere Beispielanwendung: Erstellen Sie eine RESTful-API für einen Zufallszahlengenerator. Diese Anwendung sollte eine Eingabe akzeptieren: einen Parameter mit dem Namen „Nummer“. Die Anwendung gibt dann eine Zufallszahl zwischen 0 und diesem Parameter zurück und gibt die resultierende Zahl an den Aufrufer zurück. Da der „Chef“ möchte, dass die Anwendung eine weit verbreitete Anwendung wird, sollte sie in der Lage sein, 50.000 gleichzeitige Benutzer zu verwalten. Schauen wir uns den folgenden Code an:
Listing 2. Knoten-Zufallszahlengenerator
// Die wichtigste Zeile in jeder Node-Datei. Diese Funktion
// führt den eigentlichen Prozess der Servererstellung durch. Technisch gesehen
// Der Knoten teilt dem zugrunde liegenden Betriebssystem mit, dass wann immer ein
// Verbindung hergestellt ist, sollte diese bestimmte Rückruffunktion
sein
// ausgeführt. Da wir einen Webdienst mit REST-API erstellen,
// wir wollen einen HTTP-Server, der die http-Variable
benötigt
// wir haben in den obigen Zeilen erstellt.
// Schließlich können Sie sehen, dass die Callback-Methode eine „Anfrage“ erhält
// und 'response' Objekt automatisch. Das sollte bekannt sein
// an jeden PHP- oder Java-Programmierer.
http.createServer(function(request, Response) {
// Die Antwort muss alle Header und Rückgabecodes verarbeiten
// Solche Dinge werden in Serverprogrammen automatisch verarbeitet
// wie Apache und Tomcat, aber Node erfordert, dass alles selbst erledigt wird
Response.writeHead(200, {"Content-Type": "text/plain"});
// Hier ist ein einzigartig aussehender Code. So ruft Node ab
// Von Client-Anfragen übergebene Parameter. Das URL-Modul
// übernimmt alle diese Funktionen. Die Parse-Funktion
// dekonstruiert die URL und platziert die Schlüsselwerte der Abfrage im
// Objekt abfragen. Wir können den Wert für den Schlüssel „Zahl“ finden
// durch direkte Referenzierung – das Schöne an JavaScript.
var params = url.parse(request.url, true).query;
var input = params.number;
// Dies sind die generischen JavaScript-Methoden, die erstellt werden
// unsere Zufallszahl, die an den Anrufer zurückgegeben wird
var numInput = neue Zahl(Eingabe);
var numOutput = new Number(Math.random() * numInput).toFixed(0);
// Schreibe die Zufallszahl in die Antwort
Response.write(numOutput);
// Node erfordert, dass wir diese Verbindung explizit beenden. Das liegt daran
// Knoten ermöglicht es Ihnen, eine Verbindung offen zu halten und Daten hin und her zu übertragen,
// obwohl dieses fortgeschrittene Thema in diesem Artikel nicht behandelt wird.
Response.end();
// Wenn wir den Server erstellen, müssen wir den HTTP-Server explizit mit
verbinden
// ein Port. Der Standard-HTTP-Port ist 80, also verbinden wir ihn mit diesem.
}).listen(80);
// Gibt einen String an die Konsole aus, sobald der Server startet, und teilt uns alles mit.
// startet korrekt
console.log("Zufallszahlengenerator läuft...");
启动应用程序
将上面的代码放入一个名为 „random.js“ 的文件中80 % der HTTP-Anforderungen命令提示中输入以下命令:% node random.js.下面是服务器已经启动并运行时看起来的样子:
Zugriff auf die App
Die Anwendung ist betriebsbereit. Der Knoten wartet auf alle Verbindungen. Testen wir es. Da wir eine einfache RESTful-API erstellt haben, kann auf die Anwendung über einen Webbrowser zugegriffen werden. Geben Sie die folgende Adresse ein (stellen Sie sicher, dass Sie die oben genannten Schritte ausgeführt haben): http://localhost/?number=27.
Ihr Browserfenster ändert sich auf eine Zufallszahl zwischen 0 und 27. Klicken Sie in Ihrem Browser auf die Schaltfläche „Neu laden“ und Sie erhalten eine weitere Zufallszahl. Das ist sie, Ihre erste Node-Anwendung!
Wofür ist Node gut?
An dieser Stelle können Sie möglicherweise die Frage „Was ist Node“ beantworten, aber Sie haben möglicherweise auch eine andere Frage: „Wofür wird Node verwendet?“ Dies ist eine wichtige Frage, denn es gibt definitiv etwas, das könnte auf Node profitieren.
Wofür ist es gut?
Wie Sie bereits gesehen haben, eignet sich Node hervorragend für Situationen, in denen Sie mit potenziell hohem Datenverkehr rechnen, aber nicht unbedingt viel serverseitige Logik und Verarbeitung erfordern, bevor Sie auf den Client antworten. Typische Beispiele für Node-Exzellenz sind:
RESTful API
Ein Webdienst, der eine RESTful-API bereitstellt, empfängt mehrere Parameter, analysiert sie, stellt eine Antwort zusammen und gibt eine Antwort (normalerweise weniger Text) an den Benutzer zurück. Dies ist eine ideale Situation für Node, da Sie ihn so aufbauen können, dass er Zehntausende von Verbindungen verarbeiten kann. Es erfordert immer noch nicht viel Logik; es sucht im Wesentlichen nur einige Werte aus einer Datenbank und setzt sie zu einer Antwort zusammen. Da es sich bei Antworten um kleine Textmengen und bei eingehenden Anfragen um kleine Textmengen handelt, ist der Datenverkehr nicht hoch und ein einzelner Computer kann die API-Anforderungen selbst der geschäftigsten Unternehmen bewältigen.
Twitter-Warteschlange
Stellen Sie sich ein Unternehmen wie Twitter vor, das Tweets empfangen und in eine Datenbank schreiben muss. In der Realität ist es bei fast tausenden Tweets, die pro Sekunde eingehen, unmöglich, dass die Datenbank die Anzahl der während der Spitzenzeiten erforderlichen Schreibvorgänge zeitnah verarbeiten kann. Der Knoten wird zu einem wichtigen Teil der Lösung dieses Problems. Wie Sie sehen, kann Node Zehntausende eingehende Tweets verarbeiten. Es schreibt sie schnell und einfach in einen speicherinternen Warteschlangenmechanismus (z. B. Memcached), von wo aus ein separater Prozess sie in die Datenbank schreiben kann. Die Rolle von Node besteht hier darin, Tweets schnell zu sammeln und diese Informationen an einen anderen Prozess weiterzuleiten, der für das Schreiben verantwortlich ist. Stellen Sie sich ein alternatives Design vor (bei dem ein normaler PHP-Server versuchen würde, Schreibvorgänge in die Datenbank selbst zu verarbeiten): Jeder Tweet würde eine kurze Verzögerung beim Schreiben in die Datenbank verursachen, da der Datenbankaufruf den Kanal blockiert. Eine auf diese Weise konzipierte Maschine kann aufgrund der Datenbanklatenz möglicherweise nur 2000 eingehende Tweets pro Sekunde verarbeiten. Für die Verarbeitung von 1 Million Tweets pro Sekunde wären 500 Server erforderlich. Stattdessen verarbeitet Node jede Verbindung, ohne den Kanal zu blockieren, sodass so viele Tweets wie möglich erfasst werden können. Eine Node-Maschine, die 50.000 Tweets verarbeiten kann, benötigt nur 20 Server.
Videospielstatistiken
Wenn Sie das Spiel Call of Duty online gespielt haben, wird Ihnen beim Blick auf die Spielstatistiken sofort etwas auffallen: Um Statistiken auf diesem Niveau zu erstellen, müssen Sie eine große Menge an Informationen erfassen. Wenn Millionen von Spielern gleichzeitig online spielen und diese sich an unterschiedlichen Positionen im Spiel befinden, können auf diese Weise sehr schnell riesige Mengen an Informationen generiert werden. Node ist eine großartige Lösung für dieses Szenario, da es die vom Spiel generierten Daten aufnimmt, eine minimale Zusammenführung der Daten durchführt und die Daten dann in eine Warteschlange stellt, damit sie in die Datenbank geschrieben werden können. Einen ganzen Server zu verwenden, um zu verfolgen, wie viele Kugeln ein Spieler in einem Spiel abfeuert, erscheint albern, und wenn Sie einen Server wie Apache verwenden, kann es einige nützliche Einschränkungen geben, aber umgekehrt, wenn Sie einen dedizierten Server verwenden, um alle Statistiken für ein Spiel zu verfolgen; , wie Sie es mit einem Server tun würden, auf dem Node ausgeführt wird, scheint das ein kluger Schachzug zu sein.
Knotenmodul
Obwohl dieser Artikel nicht das ursprüngliche Thema dieses Artikels ist, wurde er aufgrund der großen Leserschaft um eine Einführung in Node Modules und Node Package Manager erweitert. Genau wie Entwickler es gewohnt sind, Apache zu verwenden, können Sie die Funktionalität von Node auch durch die Installation von Modulen erweitern. Allerdings bereichern die für Node verfügbaren Module das Produkt erheblich und sind so nützlich, dass Entwickler, die Node verwenden, normalerweise mehrere davon installieren. Daher gewinnen Module immer mehr an Bedeutung und werden sogar zu einem zentralen Bestandteil des gesamten Produkts.
Im Abschnitt „Referenzen“ habe ich einen Link zur Modulseite bereitgestellt, auf der alle verfügbaren Module aufgeführt sind. Um die Möglichkeiten zu veranschaulichen, die Module bieten können, habe ich die folgenden Module zu den Dutzenden verfügbaren hinzugefügt: eines zum Schreiben dynamisch erstellter Seiten (z. B. PHP), eines zur Vereinfachung der Verwendung von MySQL und eines zur Unterstützung bei der Verwendung von WebSockets sowie ein Modul zur Unterstützung bei der Text- und Parameteranalyse. Ich werde nicht im Detail auf diese Module eingehen, da dieser Übersichtsartikel Ihnen helfen soll, Node zu verstehen und festzustellen, ob Sie (erneut) mehr in die Tiefe lernen müssen, und wenn ja, dann werden Sie auf jeden Fall die Möglichkeit haben, das zu nutzen verfügbaren Module.
Eine Funktion von Node ist außerdem das Node Package Module, eine integrierte Funktion zum Installieren und Verwalten von Node-Modulen. Es verarbeitet Abhängigkeiten automatisch, sodass Sie sicher sein können, dass jedes Modul, das Sie installieren möchten, korrekt installiert wird und die erforderlichen Abhängigkeiten enthält. Es unterstützt auch die Veröffentlichung Ihrer eigenen Module in der Node-Community, falls Sie sich dafür entscheiden, der Community beizutreten und Ihre eigenen Module zu schreiben. Sie können sich NPM als eine Methode vorstellen, mit der Sie die Funktionalität von Node einfach erweitern können, ohne befürchten zu müssen, dass Ihre Node-Installation kaputt geht. Wenn Sie sich für den Einstieg in Node entscheiden, wird NPM ebenfalls ein wichtiger Bestandteil Ihrer Node-Lösung sein.
Fazit
Nachdem Sie diesen Artikel gelesen haben, sollte Ihre Frage zu Beginn dieses Artikels „Was genau ist Node.js?“ beantwortet sein und Sie sollten in der Lage sein, diese Frage in wenigen klaren und prägnanten Sätzen zu beantworten. Wenn ja, sind Sie vielen Programmierern bereits voraus. Ich habe mit vielen Leuten über Node gesprochen, aber sie waren immer verwirrt darüber, wofür Node eigentlich verwendet wird. Verständlicherweise haben sie eine Apache-Denkweise, bei der der Server eine Anwendung ist, man eine HTML-Datei hineinlegt und alles funktioniert. Da die meisten Programmierer mit Apache und seinen Verwendungsmöglichkeiten vertraut sind, lässt sich Node am einfachsten beschreiben, indem man es mit Apache vergleicht. Node ist ein Programm, das alles kann, was Apache kann (mit Hilfe einiger Module), und noch viel mehr als erweiterbare JavaScript-Plattform, auf der Sie aufbauen können.
Wie Sie diesem Artikel entnehmen können, erreicht Node sein Ziel, einen hoch skalierbaren Server bereitzustellen. Es verwendet eine sehr schnelle JavaScript-Engine von Google, die V8-Engine. Es verwendet ein ereignisgesteuertes Design, um den Code minimal und leicht lesbar zu halten. All diese Faktoren tragen zum idealen Ziel von Node bei, das Schreiben einer hoch skalierbaren Lösung zu vereinfachen.
Genauso wichtig wie zu verstehen, was Node ist, ist auch zu verstehen, was es nicht ist. Node ist nicht nur ein Ersatz für Apache, es soll auch die Skalierung von PHP-Webanwendungen erleichtern. Nichts könnte weiter von der Wahrheit entfernt sein. Obwohl Node noch in den Kinderschuhen steckt, wächst es sehr schnell, die Community-Beteiligung ist so hoch und Community-Mitglieder haben so viele großartige Module erstellt, dass dieses sich entwickelnde Produkt innerhalb eines Jahres in Ihrem Unternehmen verfügbar sein könnte.