Einführung
Wenn Sie von Knoten gehört haben oder einige Artikel gelesen haben, die behaupten, wie groß der Knoten ist, denken Sie vielleicht: „Was genau ist Knoten?“ Obwohl nicht jedermanns Sache, ist der Knoten für manche Menschen die richtige Wahl.
Um zu erklären, was Node.js ist, untersucht dieser Artikel die Probleme, die er lösen kann, wie er funktioniert, wie man eine einfache Anwendung ausführt und schließlich, wann der Knoten ist und wann keine gute Lösung ist. In diesem Artikel wird weder das Schreiben einer komplexen Knotenanwendung behandelt, noch ist es ein umfassendes Knoten -Tutorial. Wenn Sie diesen Artikel lesen, können Sie entscheiden, ob Sie einen Knoten lernen sollten, um ihn für Ihr Unternehmen zu verwenden.
Was wird der Knoten gelöst?
Das öffentlich behauptete Ziel von Node ist "eine einfache Möglichkeit, skalierbare Netzwerkprogramme aufzubauen". Was sind die Probleme mit dem aktuellen Serverprogramm? Lassen Sie uns ein Mathematikproblem machen. In Sprachen wie Java ™ und PHP erzeugt jede Verbindung einen neuen Thread, der möglicherweise 2 MB Begleiterspeicher pro neues Thread erfordern. Auf einem System mit 8 GB RAM beträgt die theoretische maximale Anzahl gleichzeitiger Verbindungen 4.000 Benutzer. Wenn Ihr Client -Stamm wächst, möchten Sie, dass Ihre Webanwendung mehr Benutzer unterstützt, sodass Sie mehr Server hinzufügen müssen. Dies erhöht natürlich die Geschäftskosten, insbesondere die Serverkosten, die Versandkosten und die Arbeitskosten. Zusätzlich zu diesen Kostenerhöhungen gibt es ein technisches Problem: Benutzer verwenden möglicherweise verschiedene Server für jede Anfrage, sodass jede gemeinsame Ressource auf alle Server geteilt werden muss. In Java müssen beispielsweise statische Variablen und Caches zwischen JVMS auf jedem Server geteilt werden. Dies ist der Engpass in der gesamten Webanwendungsarchitektur: die maximale Anzahl gleichzeitiger Verbindungen, die ein Server verarbeiten kann.
Die Lösung des Knotens für dieses Problem besteht darin, die Art und Weise zu ändern, wie die Verbindung mit dem Server eine Verbindung herstellt. Jede Verbindung erstellt einen Prozess, der keinen Begleitspeicherblock erfordert, anstatt für jede Verbindung einen neuen Betriebssystem -Thread zu generieren (und ihm einen Begleitspeicher zuzuweisen). Node behauptet, dass es niemals abgestimmt ist, weil er überhaupt keine Schlösser zulässt und E/A -Anrufe nicht direkt blockiert. Node behauptet außerdem, dass der Server, der damit ausgeführt wird, Zehntausende von gleichzeitigen Verbindungen unterstützen kann. Tatsächlich ändert der Knoten die Serveraussicht, indem sie die Engpässe im gesamten System aus der maximalen Anzahl von Verbindungen zum Verkehr für ein einzelnes System ändern.
Nachdem Sie ein Programm haben, das Zehntausende von gleichzeitigen Verbindungen verarbeiten kann, was können Sie dann tatsächlich mit dem Knoten erstellen? Wenn Sie eine Webanwendung haben, die so viele Verbindungen umgehen muss, wäre es eine "schreckliche" Sache! Das ist ein "Wenn Sie dieses Problem haben, ist es überhaupt kein Problem". Bevor wir die obige Frage beantworten, werfen wir einen Blick darauf, wie der Knoten funktioniert und wie er für funktioniert.
Knoten ist definitiv nicht
Ja, Node ist ein Serverprogramm. Es sieht jedoch sicherlich nicht aus wie Apache oder Tomcat. Diese Server sind eigenständige Serverprodukte, mit denen die Anwendungen sofort installiert und bereitgestellt werden können. Mit diesen Produkten können Sie in einer Minute einen Server in Betrieb nehmen. Knoten ist sicherlich nicht diese Art von Produkt. Apache kann ein PHP -Modul hinzufügen, damit Entwickler dynamische Webseiten erstellen können, und Programmierer, die Tomcat verwenden, können JSPs bereitstellen, um dynamische Webseiten zu erstellen. Knoten ist sicherlich nicht dieser Typ.
In den frühen Stadien des Knotens (aktuell Version 0.4.6) war es kein "run-fähiger" Serverprogramm, und Sie können es nicht installieren, Dateien einlegen und einen voll funktionsfähigen Webserver haben. Auch wenn Sie die Grundfunktion des Webservers nach Abschluss der Installation in Betrieb nehmen möchten, ist noch viele Arbeiten erforderlich.
Wie der Knoten funktioniert
Der Knoten selbst führt V8 JavaScript aus. Warten Sie, JavaScript auf dem Server? Das stimmt, du hast es richtig gelesen. Serverseitig JavaScript ist ein relativ neues Konzept, das vor zwei Jahren erwähnt wird, als das Aptana Jaxer-Produkt auf Entwicklerworks erörtert wird (siehe Ressourcen). Obwohl Jaxer noch nie sehr beliebt war, ist das Konzept selbst nicht unerreichbar - warum können wir die auf dem Client auf dem Server verwendete Programmiersprache nicht verwenden?
Was macht V8 aus? Die V8 JavaScript -Engine ist die zugrunde liegende JavaScript -Engine, die Google für den Chrome -Browser verwendet. Nur wenige Leute denken darüber nach, was JavaScript tatsächlich mit dem Kunden macht? Tatsächlich ist die JavaScript -Engine für die Interpretation und Ausführung des Codes verantwortlich. Mit V8 erstellte Google einen superschnellen Interpreter, der in C ++ geschrieben wurde und eine weitere eindeutige Funktion hat. Sie können die Engine herunterladen und in jede Anwendung einbetten. Es ist nicht darauf beschränkt, in einem Browser zu laufen. Daher verwendet Node tatsächlich die von Google geschriebene V8 JavaScript -Engine und baut sie für die Verwendung auf dem Server um. Zu perfekt! Warum eine gute Lösung verfügbar ist, warum eine neue Sprache erstellen?
Ereignisgesteuerte Programmierung
Viele Programmierer haben sie ausgebildet, um zu glauben, dass objektorientierte Programmierungen das perfekte Programmierdesign sind und andere Programmiermethoden abweisen. Node verwendet ein sogenanntes ereignisorientiertes Programmiermodell.
Auflistung 1. Ereignisgesteuerte Programmierung mit JQuery im Client
Die Codekopie lautet wie folgt:
// jQuery-Code auf der clientseitigen zeigt, wie ereignisgesteuerte Programme funktionieren
// Wenn eine Taste gedrückt wird, tritt ein Ereignis auf - damit umgehen
// direkt hier in einer anonymen Funktion, wo alle alle
// notwendige Variablen sind vorhanden und können direkt verwiesen werden
$ ("#mybutton"). click (function () {
if ($ ("#Mytextfield"). Val ()! = $ (this) .val ())
ALERT ("Feld muss mit der Schaltfläche übereinstimmen");
});
Tatsächlich gibt es keinen Unterschied zwischen dem Server und dem Client. Ja, es gibt keine Schaltfläche Klick -Operation, noch gibt es eine Aktion, um in ein Textfeld einzugeben, aber auf einer höheren Ebene findet das Ereignis statt. Eine Verbindung ist hergestellt - Ereignis! Daten werden durch Verbindung - Ereignisse empfangen! Daten stoppen durch Verbindung - Ereignis!
Warum ist dieser Einstellungsart ideal für Knoten? JavaScript ist eine großartige, ereignisgesteuerte Programmiersprache, da sie anonyme Funktionen und Schließungen ermöglicht, und was noch wichtiger ist, jeder, der Code geschrieben hat, ist mit seiner Syntax vertraut. Die Anrufbeauftragung, die auf dem Namen eines Ereignisses aufgerufen wird, kann beim Capture -Ereignis geschrieben werden. Auf diese Weise ist der Code leicht zu schreiben und zu warten, ohne komplexe objektorientierte Frameworks, ohne Schnittstellen und ohne das Potenzial, etwas darauf zu strukturieren. Hören Sie sich einfach das Ereignis an, schreiben Sie eine Rückruffunktion und dann kümmert sich die ereignisgesteuerte Programme um alles!
Beispielknotenanwendung
Schließlich schauen wir uns einen Code an! Kombinieren wir alles, was wir besprochen haben, und erstellen Sie unsere erste Knotenanwendung. Da wir bereits wissen, dass der Knoten ideal für die Behandlung von Anwendungen mit hoher Handel ist, werden wir eine sehr einfache Webanwendung erstellen - eine Anwendung, die für maximale Geschwindigkeit erstellt wurde. Hier sind die spezifischen Anforderungen für unsere Stichprobenanwendung, die von "Boss" erläutert wird: Erstellen Sie eine REAMS -API von Zufallszahlengenerator. Diese Anwendung sollte eine Eingabe annehmen: einen Parameter mit dem Namen "Nummer". Die Anwendung gibt dann eine Zufallszahl zwischen 0 und dem Parameter zurück und die generierte Nummer an den Anrufer zurück. Da "Boss" möchte, dass es eine sehr beliebte Anwendung ist, sollte es in der Lage sein, 50.000 gleichzeitige Benutzer zu verarbeiten. Schauen wir uns den Code an:
Listing 2. Knoten -Zufallszahlengenerator
Die Codekopie lautet wie folgt:
// Diese Module müssen importiert werden, um sie zu verwenden.
// Knoten hat mehrere Module. Sie sind wie jeder #include
// oder importieren Sie eine Erklärung in anderen Sprachen
var http = required ("http");
var url = erfordern ("url");
// die wichtigste Zeile in einer Knotendatei. Diese Funktion
// führt den tatsächlichen Prozess des Erstellens des Servers durch. Technisch,
// Knoten teilt dem zugrunde liegenden Betriebssystem mit, dass wann immer a
// Die Verbindung wird hergestellt, diese spezielle Rückruffunktion sollte sein
// ausgeführt. Da wir einen Webdienst mit REST -API erstellen,
// Wir möchten einen HTTP -Server, für den die HTTP -Variable erforderlich ist
// Wir haben in den obigen Zeilen erstellt.
// Schließlich können Sie sehen, dass die Callback -Methode eine "Anforderung" empfängt
// und 'Antwort' Objekt automatisch. Dies sollte vertraut sein
// an einen PHP- oder Java -Programmierer.
http.createServer (Funktion (Anfrage, Antwort) {
// Die Antwort muss alle Header und die Rückgabecodes verarbeiten
// Diese Art von Dingen werden automatisch in Serverprogrammen behandelt
// Wie Apache und Tomcat, aber der Knoten erfordert, dass alles selbst getan werden kann
response.writeHead (200, {"Content-Type": "Text/Plain"});
// Hier ist ein einzigartig aussehender Code. So zieht der Knoten zurück
// Parameter, die aus Client -Anfragen übergeben wurden. Das URL -Modul
// übernimmt all diese Funktionen. Die Parse -Funktion
// dekonstruiert die URL und legt die Abfrageschlüsselwerte in die
// Abfrageobjekt. Wir können den Wert für den Schlüssel "Zahl" finden
// durch direktes Verweisen - die Schönheit von JavaScript.
var params = url.parse (request.url, true) .query;
var input = params.number;
// Dies sind die generischen JavaScript -Methoden, die erstellen werden
// unsere zufällige Nummer, die an den Anrufer weitergeleitet wird
var numinput = neue Zahl (Eingabe);
var numoutput = new number (math.random () * numinput) .tofixed (0);
// Schreiben Sie die Zufallszahl in die Antwort
Antwort.Write (numoutput);
// Knoten verlangt, dass wir diese Verbindung explizit beenden. Das liegt daran, dass
// Knoten ermöglicht es Ihnen, eine Verbindung zu öffnen und Daten hin und her zu übergeben.
// Obwohl dieses fortgeschrittene Thema in diesem Artikel nicht erörtert wird.
Antwort.end ();
// Wenn wir den Server erstellen, müssen wir den HTTP -Server explizit anschließen
// ein Port. Der Standard -HTTP -Port ist 80, also verbinden wir ihn mit diesem.
}). Hören (80);
// geben eine Zeichenfolge in die Konsole aus, sobald der Server startet, und informiert uns über alles
// startet richtig
console.log ("Zufallszahlengenerator laufend ...");
Legen Sie den obigen Code in eine Datei "random.js" ein. Um die Anwendung zu starten und auszuführen (und dann einen HTTP -Server zu erstellen und auf Verbindungen auf Port 80 zu hören), geben Sie einfach den folgenden Befehl in Ihre Eingabeaufforderung ein: % node random.js. So sieht es aus, wenn der Server bereits in Betrieb ist:
Die Codekopie lautet wie folgt:
root@ubuntu:/home/moila/ws/mike# node random.js
Zufallszahlengenerator laufen ...
Zugriff auf die Anwendung
Die Anwendung ist in Betrieb. Der Knoten hört auf jede Verbindung zu. Testen wir ihn. Da wir eine einfache API für erholsame API erstellt haben, können wir unseren Webbrowser verwenden, um auf diese Anwendung zuzugreifen. Geben Sie die folgende Adresse ein (stellen Sie sicher, dass Sie die oben genannten Schritte ausgeführt haben): http: // localhost/? Number = 27.
Ihr Browserfenster wechselt zwischen 0 und 27 auf eine Zufallszahl. Klicken Sie auf die Schaltfläche REGLOAD in Ihrem Browser und Sie erhalten eine weitere Zufallszahl. Das ist es, das ist deine erste Knoten -App!
Wofür ist der Knoten gut?
Bisher sollten Sie in der Lage sein, die Frage "Was ist Knoten" zu beantworten, aber Sie sind möglicherweise nicht klar, wann Sie sie verwenden sollten. Dies ist eine wichtige Frage, die Sie stellen sollten, da der Knoten für einige Dinge gut ist, aber umgekehrt ist der Knoten im Moment möglicherweise keine gute Lösung für andere. Sie müssen vorsichtig sein, um zu entscheiden, wann der Knoten verwendet werden soll, da die Verwendung in der falschen Situation zu einem redundanten codierten Grundstück führen kann.
Wofür ist es gut?
Wie Sie bereits gesehen haben, ist Node perfekt für Situationen, in denen Sie einen hohen Verkehr erwarten, und die serverseitigen Logik- und Verarbeitungsanforderungen sind nicht unbedingt groß, bevor Sie auf den Client reagieren. Zu den typischen Beispielen für die herausragende Leistung des Knotens gehören:
1.Restful API
Ein Webdienst, der die erholsame API anbietet, empfängt mehrere Parameter, analysiert sie, kombiniert eine Antwort und gibt eine Antwort (normalerweise weniger Text) an den Benutzer zurück. Dies ist die ideale Situation für den Knoten, da Sie ihn für Zehntausende von Verbindungen aufbauen können. Es erfordert noch nicht viel Logik; Es sieht nur einige Werte aus einer Datenbank aus und kombiniert eine Antwort. Da die Antwort eine kleine Menge Text und eine kleine Menge Text auf eingehende Anfragen ist, ist der Verkehr nicht hoch und eine Maschine kann selbst die API -Anforderungen der geschäftigsten Unternehmen erfüllen.
2.Twitter -Warteschlange
Stellen Sie sich ein Unternehmen wie Twitter vor, das Tweets erhalten und in eine Datenbank schreiben muss. Tatsächlich sind fast Tausende von Tweets pro Sekunde erreicht, und es ist für die Datenbank unmöglich, die Anzahl der in Spitzenzeiten geforderten Schreibvorgänge rechtzeitig zu verarbeiten. Der Knoten ist zu einem wichtigen Teil der Lösung für dieses Problem geworden. Wie Sie sehen können, kann der Knoten Zehntausende von eingehenden Tweets verarbeiten. Es schreibt sie schnell und einfach in einen Speicherwarteschlangenmechanismus (z. B. memcached), bei dem ein anderer separater Prozess sie in die Datenbank schreiben kann. Die Rolle des Knotens hier besteht darin, schnell Tweets zu sammeln und diese Informationen an einen anderen Prozess zu übergeben, der für das Schreiben verantwortlich ist. Stellen Sie sich ein anderes Design vor - ein regulärer PHP -Server versucht, das Schreiben in die Datenbank selbst zu verarbeiten -. Jeder Tweet führt zum Schreiben in die Datenbank zu einer kurzen Verzögerung, da der Datenbankanruf den Kanal blockiert. Aufgrund der Datenbanklatenz kann eine solche Maschine nur 2000 eingehende Tweets pro Sekunde verarbeiten. 1 Million Tweets pro Sekunde benötigen 500 Server. Stattdessen verarbeitet der Knoten jede Verbindung, ohne den Kanal zu blockieren, wodurch so viele Tweets wie möglich erfasst wird. Eine Knotenmaschine, die 50.000 Tweets verarbeiten kann, erfordert nur 20 Server.
3. Bilddateiserver
Ein Unternehmen mit großen verteilten Websites wie Facebook oder Flickr kann sich entscheiden, alle Maschinen nur für Servicebilder zu verwenden. Der Knoten wäre eine gute Lösung für dieses Problem, da das Unternehmen es verwenden kann, um einen einfachen Datei -Retriever zu schreiben und dann Zehntausende von Verbindungen zu verarbeiten. Der Knoten sucht nach der Bilddatei, gibt die Datei oder einen 404 -Fehler zurück und dann nichts. Mit diesem Setup können solche verteilten Websites die Anzahl der Server reduzieren, die sie benötigen, um statische Dateien wie Bilder, .JS und .css -Dateien zu erstellen.
Wofür ist es schlecht?
Natürlich ist der Knoten in einigen Fällen nicht ideal. Hier sind Bereiche, in denen der Knoten nicht gut ist:
1. dynamisch erstellte Seiten
Derzeit liefert der Knoten keine Standardmethode zum Erstellen von dynamischen Seiten. Wenn Sie beispielsweise die JSP -Technologie (JavaServer Pages) verwenden, können Sie eine Index.jsp -Seite erstellen, die eine Schleife in einem solchen JSP -Code -Snippet enthält. Der Knoten unterstützt solche dynamischen HTML-gesteuerten Seiten nicht. In ähnlicher Weise ist der Knoten als Webserver wie Apache und Tomcat nicht sehr geeignet. Wenn Sie daher eine solch serverseitige Lösung im Knoten bereitstellen möchten, müssen Sie die gesamte Lösung selbst schreiben. PHP -Programmierer möchten nicht jedes Mal, wenn sie eine Webanwendung bereitstellen, einen PHP -Konverter für Apache schreiben. Bisher ist dies genau das, was Node Sie auffordert.
2. Relationale Datenbank Schwere Anwendungen
Der Zweck des Knotens ist schnell, asynchron und nicht blockiert. Datenbanken teilen diese Ziele nicht unbedingt. Sie sind synchron und blockieren, da Aufrufe der Datenbank während des Lesens und Schreibens den Kanal blockieren, bis das Ergebnis generiert ist. Daher ist eine Webanwendung, für die viele Datenbankaufrufe erforderlich sind, viele Lesevorgänge, viele Schreibvorgänge pro Anforderung für Knoten sehr ungeeignet, da die relationale Datenbank selbst die vielen Vorteile des Knotens ausgleichen kann. (Die neue NoSQL -Datenbank ist besser für Knoten geeignet, aber das ist insgesamt ein weiteres Thema.)
Abschluss
Die Frage ist "Was ist node.js?" hätte beantwortet werden sollen. Nach dem Lesen dieses Artikels sollten Sie in der Lage sein, diese Frage in einigen klaren und prägnanten Sätzen zu beantworten. Wenn ja, haben Sie vieler Codierer und Programmierer in den Vordergrund geraten. Ich habe mit vielen Menschen über den Knoten gesprochen, aber sie waren verwirrt darüber, was genau der Knoten ist. Verständlicherweise haben sie die Denkweise von Apache - ein Server ist eine Anwendung, die HTML -Dateien in sie stellt und alles ordnungsgemäß funktioniert. Und der Knoten ist zweckbedingt. Es handelt sich um ein Softwareprogramm, das JavaScript verwendet, damit Programmierer schnell und schnell und skalierbare Webserver erstellen können. Apache ist bereit zu laufen, während der Knoten codiert, um zu laufen.
Node erreicht sein Ziel, einen hochskalierbaren Server bereitzustellen. Anstatt ein Modell "One Thread pro Verbindung" zuzuweisen, wird ein Modell "One -Prozess pro Verbindung" verwendet, um nur den Speicher zu erstellen, der für jede Verbindung erforderlich ist. Es verwendet eine sehr schnelle JavaScript -Engine von Google: Die V8 -Engine. Es verwendet ein ereignisorientiertes Design, um den Code minimal und einfach zu lesen. All diese Faktoren tragen zum idealen Ziel des Knotens bei - es ist einfacher, eine hochskalierbare Lösung zu schreiben.
So wichtig wie zu verstehen, was der Knoten ist, zu verstehen, was er nicht ist. Der Knoten ist kein Ersatz für Apache, das PHP -Webanwendungen skalierbarer gestaltet. Dies ist in der Tat der Fall. In dieser ersten Stufe des Knotens ist es unwahrscheinlich, dass eine große Anzahl von Programmierern ihn verwenden wird, aber in Szenarien, in denen es funktioniert, funktioniert es sehr gut.
Was soll ich in Zukunft vom Knoten erwarten? Dies ist vielleicht die wichtigste Frage, die dieser Artikel erhöht. Jetzt, wo Sie wissen, was es jetzt tut, sollten Sie sich fragen, was es als nächstes tun wird. Im nächsten Jahr freue ich mich darauf, dass Knoten eine bessere Integration in bestehende Support-Bibliotheken von Drittanbietern bietet. Viele Programmierer von Drittanbietern haben jetzt Plug-Ins für Knoten entwickelt, einschließlich des Hinzufügens von Dateiserverunterstützung und MySQL-Unterstützung. Hoffentlich beginnt Node, sie in seine Kernfunktionalität zu integrieren. Schließlich möchte ich auch, dass der Knoten ein dynamisches Seitenmodul unterstützt, damit Sie in der HTML -Datei das tun können, was Sie in PHP und JSP (möglicherweise ein NSP, eine Node -Server -Seite) tun. Hoffentlich wird eines Tages ein "Bereitstellungsbereit" -Knotenserver angezeigt, der heruntergeladen und installiert werden kann. Stellen Sie einfach Ihre HTML-Dateien ein, genau wie Apache oder Tomcat. Der Knoten befindet sich noch in den Anfangsphasen, entwickelt sich aber sehr schnell und kann bald in Ihrer Vision liegen.