Implementieren von serverlosen Node.js-Funktionen mit Google Cloud
Veröffentlicht: 2022-03-11Das Erstellen von Software endet nicht mit dem Schreiben von gutem Code. Es ist abgeschlossen, wenn die Software bereitgestellt wird und in der Lage ist, die Anforderungen ordnungsgemäß zu verarbeiten, und wenn wir skalieren können, ohne die Leistung und die Betriebskosten zu beeinträchtigen.
Sie denken wahrscheinlich darüber nach, wie Sie Cloud Computing haben, um sich um all diese Dinge zu kümmern. „Also, was ist dieses neue serverlose Ding, Vignes?“
Serverless Computing ist ein Architekturstil, bei dem der Code in einer Cloud-Plattform ausgeführt wird, bei der wir uns keine Gedanken über Hardware- und Software-Setup, Sicherheit, Leistung und CPU-Leerlaufzeitkosten machen müssen. Es ist eine Weiterentwicklung des Cloud Computing, die über die Infrastruktur hinausgeht und auch die Softwareumgebung abstrahiert. Das bedeutet, dass keine Konfiguration erforderlich ist, um den Code auszuführen.
Bei Serverless sieht Ihr Arbeitsstil folgendermaßen aus:
Entwickeln Sie den Code.
Laden Sie den Code beim Dienstanbieter hoch.
Konfigurieren Sie den Trigger (in unserem Fall eine HTTP-Anfrage).
Unsere Arbeit ist getan! Nun kümmert sich der Plattformanbieter um eingehende Anfragen und die Skalierung.
Einführung in serverlose Microservices
Eine serverlose Architektur wird oft mit einem Design im Stil von Microservices gekoppelt. Ein Microservice ist ein eigenständiger Teil großer Software, der Anforderungen für ein bestimmtes Modul verarbeitet. Durch die Erstellung von Microservices, die in einer serverlosen Umgebung ausgeführt werden können, wird es einfach, den Code zu warten und Bereitstellungen zu beschleunigen.
Einführung in AWS Lambda & GCF, ein Vergleich
Eine serverlose Funktion wird oft als „Back-End as a Service“ oder „Function as a Service“ bezeichnet. Die Zahl der Anbieter von Serverless Computing beginnt zu steigen. Einige der traditionellen Big Player bieten jedoch auch serverlose Optionen an, wie z. B. die AWS Lambda Functions von Amazon Web Services und die Google Cloud Functions (GCF) von Google Cloud, von denen letztere, obwohl sie sich derzeit in der Beta-Phase befindet, das ist, was ich verwende. Obwohl sie ähnlich funktionieren, gibt es einige wichtige Unterschiede zwischen ihnen.
| AWS-Lambda | Google Cloud-Funktionen | |
|---|---|---|
| Sprachunterstützung | Node.js, Python, C#, Java | Node.js |
| Löst aus | DynamoDB, Kinesis, S3, SNS, API-Gateway (HTTP), CloudFront und mehr | HTTP, Cloud PubSub, Cloud-Storage-Bucket |
| Maximale Ausführungszeit | 300 Sekunden | 540 Sekunden |
In diesem Artikel werden wir den Prozess der Implementierung der serverlosen Codebereitstellung mit GCF durchgehen. Google Cloud Functions ist eine einfache, ereignisbasierte, asynchrone Rechenlösung, mit der Sie kleine, zweckgebundene Funktionen erstellen können, die auf Cloud-Ereignisse reagieren, ohne dass Sie einen Server oder eine Laufzeitumgebung verwalten müssen.
GCF hat drei mögliche Implementierungen, die basierend auf Triggern getrennt sind.
HTTP-Trigger Leitet HTTP-Anforderungen an die Cloud-Funktionen weiter
Interner Google Pub/Sub-Trigger Leitet Veröffentlichungs- und Abonnementanfragen an Cloud-Funktionen weiter
Cloud-Speicher-Bucket-Trigger Leitet alle am Speicher-Bucket vorgenommenen Änderungen an die Cloud-Funktion weiter
Lassen Sie uns ein HTTP-Trigger-basiertes Setup mit Google Cloud Functions erstellen
Google Cloud Functions erfordert keine zusätzliche spezielle Einrichtung oder Installation. GCF stellt sicher, dass die Standardknotenumgebung eingerichtet und ausführungsbereit ist. Wenn eine Cloud-Funktion mit HTTP als Auslöser erstellt wird, stellt sie eine URL zum Auslösen der Funktion bereit. Im Vergleich zu AWS Lambda, das ein API-Gateway als Kommunikationsmedium verwendet, stellt Google Cloud Functions die URL sofort basierend auf der Projekt- projectID und der Region bereit.
Erstellen einer serverlosen Node.js-Anwendung
Um unseren Code in GCF ausführbar zu machen, sollten wir den Code in eine einzige Funktion packen. GCF ruft diese bestimmte Funktion immer dann auf, wenn der Trigger auftritt. Mögliche Wege hierfür sind das Hochladen,
Einzelne Datei: Exportieren Sie eine Standardfunktion, die andere Funktionen basierend auf der Anforderung aufruft.
Mehrere Dateien: Haben Sie eine
index.js-Datei, die alle anderen Dateien erfordert, und exportieren Sie die Standardfunktion als Ausgangspunkt.Mehrere Dateien: Konfigurieren Sie eine Hauptdatei in
package.jsonmit"main": "main.js"als Ausgangspunkt.
Jede der oben genannten Methoden funktioniert.
GCF hat eine bestimmte Node-Laufzeitversion, die unterstützt wird. Stellen Sie sicher, dass der Code so geschrieben ist, dass er diese bestimmte Version unterstützt. Zum Zeitpunkt der Erstellung dieses Beitrags unterstützt GCF die Node-Version v6.11.1.
Um eine Funktion zu erstellen, müssen nur wenige Optionen berücksichtigt werden.
Speicher Dies gibt an, wie viel Speicher benötigt wird, um die Anforderung für eine Laufzeit zu verarbeiten. Definiert in MB. Für eine kleine Anwendung sollten 128 MB völlig ausreichen, können aber auf bis zu 2 GB erhöht werden.
Timeout Timeout definiert, wie der Name schon sagt, das erwartete Timeout für die Codeausführung. Danach wird der Code getötet und gestoppt. Jede Ausführung nach diesem Punkt wird abrupt beendet. Das maximale Timeout beträgt 540 Sekunden.
Auszuführende Funktion Obwohl mehr als eine Funktion aus der Haupt-Handler-Datei exportiert werden kann, müssen wir eine Funktion konfigurieren, die für die Verarbeitung der Anfrage ausgelöst werden soll. Dies ermöglicht dem Entwickler mehrere Einstiegspunkte basierend auf der HTTP-Methode/URL.

Um den Code hochzuladen, kopieren Sie einfach den Code und fügen Sie ihn ein, um ein Funktionsportal zu erstellen. Bei mehr als einer Datei komprimieren Sie den Inhalt und laden Sie die Datei hoch. Stellen Sie sicher, dass im Fall einer ZIP-Datei entweder eine index.js -Datei oder eine package.json -Datei mit der erwähnten Hauptdatei vorhanden sein sollte.
Jede NPM-Modulabhängigkeit sollte in package.json erwähnt werden. GCF versucht, die in der Datei package.json erwähnten Module während der Ersteinrichtung zu installieren.
Lassen Sie uns einen einfachen Handler erstellen, um einen 200-Status und eine Nachricht zurückzugeben. Erstellen Sie eine Funktion und fügen Sie der Quelle den folgenden Code hinzu.
exports.httpServer = function httpServer(req, res) { console.log(req); res.status(200).send('Server is working'); } Sobald die Funktion erstellt ist, öffnen Sie die bereitgestellte URL, um die Funktion auszulösen. Es sollte wie folgt reagieren.
Sehen wir uns nun das req -Objekt in den Protokollen an. Zum Anzeigen von Protokollen bietet GCF Optionen direkt von der Konsole aus. Klicken Sie auf die vertikalen Punkte und öffnen Sie die Protokolloption.
Lassen Sie uns nun den Code aktualisieren, um einfache Routen für /users zu handhaben.
Der folgende Code wird verwendet, um eine einfache GET & POST -Anfrage für die Route /users zu verarbeiten:
exports.httpServer = function httpServer(req, res) { const path = req.path; switch(path) { case '/users': handleUsers(req, res); break; default: res.status(200).send('Server is working'); } }; const handleUsers = (req, res) => { if (req.method === 'GET') { res.status(200).send('Listing users...'); } else if (req.method === 'POST') { res.status(201).send('Creating User...') } else { res.status(404); } } Testen wir es nach der Aktualisierung jetzt im Browser, diesmal jedoch mit /users am Ende.
Das ist cool. Wir haben einen einfachen HTTP-Server mit Routing erstellt.
Betrieb & Debugging
Wenn die Geschichte mit Code enden würde, würden Sie nicht nach Infrastrukturoptionen wie serverlosen Node.js-Anwendungen suchen. Hier ist eine kurze Zusammenfassung, wie Sie sich um allgemeine Aufgaben wie Bereitstellung und Debugging kümmern. Dinge, die Node.js-Entwickler bereits für andere Anwendungen tun.
Einsatz:
Code für Funktionen kann auf vier Arten bereitgestellt werden.
Kopieren Sie den Code und fügen Sie ihn in die Konsole ein
Hochladen einer ZIP-Datei
Bereitstellung aus dem Cloudspeicher-Bucket als ZIP-Datei
Bereitstellung aus dem Cloud-Quellrepository
Die bequemste Option ist natürlich die Bereitstellung aus einem Quell-Repository.
Aufruf:
Beim Erstellen der Funktion stellt die Konsole die HTTP-URL zum Auslösen der Funktion bereit, die folgendes Format hat: https://<region>-<project-id>.cloudfunctions.net/<function-name>
Die Funktion von AWS Lambda weist Kaltstartprobleme auf, wodurch die Ausführung der Funktion zusätzliche Zeit zum Starten benötigt. Nach dem Start reagieren die folgenden Ausführungen normal. Diese anfängliche zusätzliche Anlaufzeit wird als Kaltstart bezeichnet. Obwohl wir keine offizielle Dokumentation für GCF zu diesem Thema haben, sind die Kaltstartprobleme während unserer Tests nicht aufgetreten.
Debuggen:
GCF lässt sich in den Stackdriver Logging-Dienst in Google Cloud integrieren. Alle Konsolenprotokolle und -fehler werden hier protokolliert und helfen beim Debuggen von bereits bereitgestelltem Code.
Testen:
Die Konsole bietet Optionen zum Testen der Funktion, indem ein JSON als Eingabe übergeben wird. Die Funktion wird mit JSON als Eingabe aufgerufen und die Ausgabe wird in der Konsole angezeigt. Die Anforderung (Eingabe) und Antwort ähneln dem Express.js-Framework und können während des Entwicklungsprozesses selbst auf Einheiten getestet werden. Wenn Sie eine Auffrischung zum Node.js-Testen benötigen, sehen Sie sich A Node.js Guide to Effective Doing Integration Tests an
Einschränkungen und nächste Schritte
Die Verwendung serverloser Funktionen hat ihre eigenen Vorteile, aber auch Einschränkungen
Vendor Lock-in: Es begrenzt den Code, den wir schreiben, auf einen bestimmten Dienstanbieter. Das Verschieben des Codes zu einem anderen Anbieter erfordert ein Umschreiben des Codes mit erheblichem Migrationsaufwand. Da dies ein großes Problem sein kann, sollten wir bei der Auswahl eines Dienstleisters sehr vorsichtig sein.
Beschränkungen in der Anzahl von Anforderungen und Hardwareressourcen: Anbieter begrenzen häufig die Anzahl paralleler Anforderungen, die eine Funktion gleichzeitig verarbeitet. Es gibt auch Speicherbeschränkungen. Diese Arten von Einschränkungen können durch Rücksprache mit dem Anbieter erhöht werden, sie bestehen jedoch weiterhin.
Google Cloud Functions reift und verbessert sich stark. Es wird immer noch regelmäßig verbessert und aktualisiert, insbesondere in den Sprachen, die es unterstützen kann. Wenn Sie vorhaben, Google Cloud-Funktionen zu verwenden, behalten Sie die Änderungsprotokolle im Auge, um bahnbrechende Änderungen in der Implementierung zu vermeiden.
Weiterführende Literatur im Toptal Engineering Blog:
- Arbeiten mit TypeScript und Jest Support: Ein AWS SAM-Tutorial
