lonipok Matrose
Joined: 09 January 2024 Location: United States
Online Status: Offline Posts: 2
|
Posted: 10 January 2024 at 15:51 | IP Logged
|
|
|
Was ist Node.js?
Node.js ist eine von Ryan Dahl entwickelte Plattform zur
Entwicklung von Anwendungen für eine bessere
Skalierbarkeit. Node.js basiert auf einem
ereignisgesteuerten Programmiermodell. Mit der
Softwareplattform Node.js können wir serverseitige und
Netzwerkanwendungen entwickeln. Das Hauptziel von Node.js
besteht darin, den Durchsatz der Anwendungen zu
maximieren, und Node.js verwendet nicht blockierende E/A.
Node.js fördert die asynchrone Ereignisbehandlung. Die in
Node.js zur Entwicklung von Anwendungen verwendete
Programmiersprache ist JavaScript.
Wie installiere ich Bower?
Bootstrap-Setup
Blockierende E/A- und Multithread-Programmiermodelle
Bevor wir mit dem gleichmäßig gesteuerten Programmierstil
fortfahren, werfen wir noch einmal einen Blick auf die
beiden Programmiermodelle und ihre Nachteile. Auf diese
Weise können wir den Wert einer gleichmäßig gesteuerten
Programmierung besser einschätzen.
E/A blockieren: Das traditionelle Blocking-I/O-
Programmiermodell hat seine eigenen Nachteile. Früher,
als E/A-Vorgänge auf Time-Sharing-Systemen durchgeführt
wurden, entsprach jeder Prozess einem Benutzer, sodass
die Benutzer voneinander isoliert waren. In diesen
Systemen muss der Benutzer einen Vorgang abschließen,
bevor er mit dem nächsten Vorgang fortfahren kann. Das
größte Problem bei dieser Art von Modellen ist die
Skalierbarkeit. Das Betriebssystem muss die Last der
Verwaltung aller Prozesse übernehmen und der
Kontextwechsel ist teuer. Darüber hinaus nimmt die
Systemleistung ab, nachdem die Prozesse eine bestimmte
Anzahl erreicht haben.
Multithread-Programmierung: Um die mit dem herkömmlichen
blockierenden I/O-Programmiermodell verbundenen Probleme
zu mildern, wurde Multi-Threading eingeführt. Bei der
Multithread-Programmierung werden mehrere Threads aus
einem einzigen Prozess erzeugt, der den Speicher mit
anderen Threads innerhalb desselben ursprünglichen
Prozesses teilt. Die Idee hinter diesem Modell besteht
darin, dass, wenn ein Thread auf E/A wartet, ein anderer
Thread eine andere Aufgabe zur Ausführung übernehmen
kann. Wenn der E/A-Vorgang abgeschlossen ist, kann der
Thread, der auf E/A wartet, aufwachen und mit der
Verarbeitung der Aufgaben fortfahren. Das Problem bei
diesem Multithread-Programmiermodell besteht darin, dass
Programmierer das genaue Verhalten von Threads und ihren
gemeinsamen Speicherstatus nicht kennen. Programmierer
müssen sich auf Sperren, Synchronisierung und Semaphoren
verlassen, um den Zugriff auf Daten und Ressourcen zu
kontrollieren.
Ereignisgesteuerte Programmierung
Ein Programmierstil, bei dem Ereignisse den
Ausführungsfluss bestimmen. Event-Handler oder Event-
Callbacks verarbeiten die Ereignisse. Ein Ereignisrückruf
ist eine Funktion, die aufgerufen wird, wenn etwas
Bedeutendes passiert. Beispielsweise können wir eine
Ereignisrückruffunktion einrichten, die aufgerufen wird,
wenn eine neue Nachricht in der Nachrichtenwarteschlange
verfügbar ist, oder für vom Benutzer ausgelöste
Ereignisse wie das Klicken auf eine Schaltfläche usw.
Betrachten Sie zum Beispiel die altmodische Methode der
blockierenden E/A-Programmierung. Wenn wir Daten aus
einer Datenbank abrufen und verarbeiten möchten, gehen
wir folgendermaßen vor:
myData = query(‘SELECT * FROM employees where empId =
1234’);
processMyData(myData);
Im obigen Beispiel muss der aktuelle Thread warten, bis
die Datenbank den Abruf der Ergebnisse abgeschlossen hat.
Im ereignisgesteuerten Programmierstil kann das gleiche
Szenario wie folgt erreicht werden:
myDataRetrieved = function(myData) {
processMyData(myData);
}
query(‘SELECT * FROM employees where empId = 1234’,
myDataRetrieved);
Im obigen ereignisgesteuerten Beispiel definieren wir
zunächst, was passieren soll, wenn die Abfrage
abgeschlossen ist, und speichern die Abfrageergebnisse in
einer Funktion namens „myDataRetrieved“. Dann übergeben
wir diese Funktion als Argument an die Abfrage. Wenn die
Abfrageausführung abgeschlossen ist, ruft die Abfrage die
Funktion „myDataRetrieved“ auf (die im Wesentlichen die
Daten verarbeitet), anstatt einfach das Ergebnis
zurückzugeben.
Bei dieser Art der Programmierung definieren wir, anstatt
einfach die Ergebnisse zurückzugeben, Funktionen, die vom
System aufgerufen werden, wenn wichtige Ereignisse
eintreten (in unserem Fall werden Daten abgerufen und
sind einsatzbereit). Dieser Programmierstil wird als
„ereignisgesteuertes Programmiermodell“ oder „asynchrone
Programmierung“ bezeichnet. Dieses Modell ist der
grundlegende Aspekt von Node.js. Die Kernidee dieses
Programmiermodells besteht darin, dass der aktuelle
Prozess (oder Thread) nicht blockiert, wenn er E/A
ausführt. Daher können mehrere E/A-Vorgänge parallel
erfolgen und jeder Vorgang verfügt über eine eigene
Rückruffunktion, die aufgerufen wird, sobald der
jeweilige Vorgang abgeschlossen ist.
Wie ereignisgesteuerte Programmierung erreicht wird
Die ereignisgesteuerte Programmierung wird durch ein
Konzept der „Ereignisschleife“ erreicht. Im Wesentlichen
führt eine Ereignisschleife zwei Vorgänge in einer
Endlosschleife aus. Diese beiden Vorgänge sind
Ereigniserkennung und Ereignisbehandlung. Bei jedem
Durchlauf der Schleife muss ermittelt werden, um welche
Ereignisse es sich handelt, und dann muss der
entsprechende Ereignisrückruf ermittelt und der Rückruf
aufgerufen werden.
Diese Ereignisschleife wird als einzelner Thread
innerhalb eines einzelnen Prozesses ausgeführt. Aufgrund
dieser Tatsache können Programmierer die
Synchronisierungsanforderungen lockern und müssen sich
keine Sorgen darüber machen, dass gleichzeitige Threads
auf gemeinsame Ressourcen zugreifen und denselben
Speicherstatus teilen.
Wie Clients asynchrone Anfragen verarbeiten
Betrachten Sie das folgende Beispiel, in dem jQuery eine
Ajax-Anfrage mithilfe von XMLHttp-Request (XHR)
durchführt:
$.post('/myData.json', function(data) {
console.log(data);
});
Im obigen Codebeispiel blockiert der E/A-Vorgang die
Ausführung nicht. Dieses Programm führt eine HTTP-Anfrage
für myData.json aus. Wenn die Antwort zurückkommt, wird
eine anonyme Funktion aufgerufen (in diesem Zusammenhang
der Rückruf), die das Argument „data“ enthält, also die
von dieser Anfrage empfangenen Daten.
Die Antwort für myData.json wird in der Variablen „data“
gespeichert, wenn sie bereit ist, und die Funktion
console.log wird bis dahin NICHT ausgeführt.
Der E/A-Vorgang (die Ajax-Anfrage) würde verhindern, dass
die Skriptausführung fortgesetzt wird, bis sie bereit
ist. Da es sich bei dem Browser um einen Single-Thread-
Browser handelt, würden alle anderen auf dieser Seite
auftretenden Ereignisse mit der Ausführung warten, wenn
die Rückgabe dieser Anfrage 500 Millisekunden dauern
würde. Das Benutzererlebnis ist schlecht, wenn eine
Animation angehalten wurde oder der Benutzer während
dieser Wartezeit versucht hat, mit der Seite zu
interagieren.
In diesem Fall sind die Dinge glücklicherweise nicht
blockiert. Wenn E/A-Vorgänge im Browser stattfinden,
geschieht dies außerhalb der Ereignisschleife (außerhalb
der Hauptskriptausführung). Wenn die E/A-Vorgänge
abgeschlossen sind, wird ein Ereignis ausgegeben, das von
einer Funktion (oft als Callback bezeichnet) verarbeitet
wird.
Die E/A erfolgt asynchron und blockiert nicht die
Skriptausführung, sodass die Ereignisschleife auf alle
anderen Interaktionen oder Anforderungen reagieren kann,
die auf der Seite ausgeführt werden. Dadurch kann der
Browser auf den Client reagieren und viel Interaktivität
auf der Seite bewältigen.
Es gibt nur wenige Ausnahmen, die die Ausführung im
Browser blockieren. Dies sind Warnung,
Eingabeaufforderung, Bestätigung und synchrones XHR. Von
deren Verwendung wird abgeraten, es sei denn, die
Anwendung erfordert es wirklich.
Wie der Server asynchrone Ereignisse verarbeitet
Das Folgende ist ein PHP-Beispiel für ein traditionelles
I/O-Blockierungsmodell.
$result = mysql_query('SELECT * FROM myTable');
print_r($result);
Im obigen Beispiel wird die Programmausführung blockiert,
bis die Ausführung der Datenbankabfrage abgeschlossen
ist. Dieser Code führt einige E/A-Vorgänge aus und die
Fortsetzung des Prozesses wird blockiert, bis alle Daten
zurückgekommen sind. Obwohl dieses Modell für viele
Anwendungen geeignet ist, verfügt der Prozess über einen
Status oder Speicher und führt im Wesentlichen nichts
aus, bis die E/A abgeschlossen ist. Dies kann je nach
Latenz des E/A-Vorgangs zwischen 20 ms und Minuten
dauern.
Normalerweise unternimmt der Server nichts, während er
auf E/A wartet. Eine Lösung für dieses Problem ist die
Verwendung von Multithreading. Aber die Multithread-
Anwendungen sind komplex und schwer zu programmieren und
zu verwalten, außerdem sind sie teuer im Hinblick auf die
CPU-Auslastung und -Ausführung.
In Node werden E/A außerhalb der Hauptereignisschleife
durchgeführt, sodass der Server effizient und
reaktionsfähig bleibt. Dadurch wird es für einen Prozess
wesentlich schwieriger, I/O-gebunden zu werden, da die
I/O-Latenz Ihren Server nicht zum Absturz bringt oder die
Ressourcen verbraucht, die bei einer Blockierung anfallen
würden. Dadurch kann der Server die normalerweise
langsamsten Vorgänge, die ein Server ausführt, entlasten.
SCHMUTZIGE Anwendungen und Node.js
Node.js wurde speziell für datenintensive
Echtzeitanwendungen oder einfach „DIRT“-Anwendungen
entwickelt. Ein Knotenserver ist asynchron und
ereignisgesteuert, hält eine Reihe von E/A-Verbindungen
offen und verarbeitet gleichzeitig viele Anfragen mit
geringem Speicherbedarf. Knotenanwendungen erfordern
wenig E/A und sind sehr reaktionsschnell. Node ist eine
leistungsstarke Plattform für datenintensive,
reaktionsschnelle Echtzeitanwendungen. Der Knotenkern ist
klein, einfach und enthält Bausteine für E/A-basierte
Anwendungen. Es gibt viele Module von Drittanbietern, die
auf Kernmodulen aufbauen und größere Abstraktionen
bieten. „Express“ ist ein beliebtes Node.js-Framework.
Node.js installieren
Die Installation von Node.js ist auf den meisten
Betriebssystemen ziemlich einfach. Der Knoten kann
entweder mit Paketinstallationsprogrammen oder mit
Befehlszeilentools installiert werden. Natürlich ist die
Installation über die Befehlszeile für Unix/Linus-
Plattformen einfach. Als Lernende wollten wir schon immer
auf unseren Windows-Systemen installieren. Lassen Sie uns
in diesem Artikel Node unter Windows installieren. Von
Zeit zu Zeit müssen wir jedoch den Node Package Manager
(npm) verwenden, um erforderliche Add-ons zu finden und
zu installieren.
Es sind eigenständige Node-Installationsprogramme
verfügbar Hier. Bitte laden Sie die entsprechende Version
für Ihr Windows (32bit/64bit) herunter und doppelklicken
Sie auf die Installationsprogramme. Der
Installationsprozess ist einfach und selbsterklärend
(Eine Installationsanleitung finden Sie in unserem Bower-
Tutorial). Sobald Node erfolgreich installiert wurde,
sollten wir Node und npm über die Eingabeaufforderung
ausführen können.
Überprüfen der Node.js-Installation
Um zu überprüfen, ob Node erfolgreich installiert wurde,
gehen Sie bitte zur Eingabeaufforderung und führen Sie
die folgenden Befehle aus. Der erste Befehl zeigt die
installierte Knotenversion an und der zweite Befehl zeigt
eine Beispieltestausgabe auf dem Bildschirm an.
Angenommen, wir haben Node unter D:\work\nodejs
installiert …
1
Drücken Sie mehrmals Strg+C, um die Node-
Eingabeaufforderung zu verlassen.
Außerdem sollte die Ordnerstruktur der folgenden
Bildschirmaufnahme ähneln, sobald der Knoten erfolgreich
unter Windows installiert wurde.
NodeJS-Verzeichnis
Node.js-Anwendung durch Erstellen eines Knoten-HTTP-
Servers
Der Aufbau von Servern ist in Node sehr verbreitet. Mit
Node können wir verschiedene Servertypen erstellen. Dies
ist etwas seltsam, insbesondere wenn wir aus dem
Serverbereich kommen und Server wie Apache oder Nginx
usw. verwenden Knoten können wir logischerweise davon
ausgehen, dass Server und Anwendung gleich sind. Das
folgende Codebeispiel erstellt einen HTTP-Server, der auf
Anfragen antwortet.
Es ist immer die beste Option, anwendungsspezifische
Dateien oder Anwendungen von der Node-Installation
getrennt zu halten. Da wir Node bereits unter
D:\work\nodejs installiert haben, erstellen wir unter
D:\work einen separaten Ordner namens node-apps.
Erstellen Sie in node-apps einen Anwendungsordner namens
hello-node. Erstellen Sie dann eine Datei mit dem Namen
server.js und geben Sie den folgenden Code in die Datei
server.js ein.
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type':'text/plain'});
response.end('Welcome to Node platform.\n');
}).listen(3000);
console.log('Server running at http://localhost:3000/');
Sobald unsere server.js-Datei fertig ist, gehen Sie zur
Eingabeaufforderung zum Speicherort der server.js-Datei
(in diesem Fall D:\work\node-apps) und führen Sie den
folgenden Befehl aus, um den Server zu starten.
D:\work\node-apps\hello-node>node server.js
Der Knoten-HTTP-Server sollte mit der Überwachung von
Port 3000 beginnen, wie im folgenden Screenshot gezeigt.
NodeJS ausführen
Öffnen Sie nun einen beliebigen Browser und geben Sie
Folgendes ein, um unsere erste Node-Anwendung zu testen.
http://localhost:3000/
Wir sollten die Beispielausgabe wie unten gezeigt sehen
können.
NodeJS-Beispiel
Wenn also eine HTTP-Anfrage am konfigurierten Port (3000
in unserem Beispiel oben) eintrifft, wird die
Rückruffunktion mit Anfrage und Antwort als Argumenten
ausgelöst. Innerhalb dieser Funktion geben wir den
zurückgegebenen HTTP-Statuscode (200) und den Inhaltstyp
als Text/Plain im Antwortobjekt an. Abschließend beenden
wir die Antwort mit einer Meldung, die im Browser
angezeigt wird.
Node.js: RESTful-APIs mit
StrongLoop Arc
|