Skip to main content

Eine sichere API mit gRPC erstellen

Artikel von
Headshot of Vitalis Ogbonna

Vitalis Ogbonna

hero build api grpc

25. August 2022

0 Min. Lesezeit

Ein Google Remote Procedure Call (gRPC) ist Googles Open-Source-Version des Remote-Procedure-Call-Frameworks (RPC). Es handelt sich um ein Kommunikationsprotokoll, das HTTP/2 und Protocol-Buffer-Technologien (protobuf) nutzt. Mit gRPC kann ein Remote-Client oder -Server mit einem anderen Server kommunizieren, indem er einfach die Funktion des empfangenden Servers aufruft, als wäre sie lokal verfügbar. Dadurch lassen sich in verteilten Systemen große Datenmengen viel einfacher zwischen Client und Server übertragen.

Wie andere RPC-Systeme definiert gRPC einen Service. Seine Methoden und Rückgabetypen werden mithilfe von protobuf festgelegt – einem Google-Protokoll zur Serialisierung und Deserialisierung. So lassen sich Services einfach definieren und Clientbibliotheken automatisch generieren. gRPC verwendet dieses Protokoll, derzeit in Version 3, als Schnittstellendefinitionssprache und Serialisierungstoolset.

Für die meisten modernen Anwendungen ist gRPC dank seiner hervorragenden Unterstützung aller Datentypen eine ausgezeichnete Wahl. Es eignet sich besonders für große Datenmengen, etwa bei Streaming-Daten, kann für einfache Anwendungen, bei denen umfangreiche Datenübertragungen kaum eine Rolle spielen, jedoch überdimensioniert sein.

In diesem Artikel erfahren Sie, wie Sie gRPC für die client- und serverähnliche Kommunikation zwischen zwei Node.js-Anwendungen verwenden. Außerdem stellen wir einige Sicherheitsmaßnahmen für den Einsatz von gRPC als Kommunikationsmechanismus in Ihren Services vor.

Voraussetzungen für das Tutorial

Für dieses Tutorial müssen OpenSSL und Node.js (Version 4.0 oder höher) auf Ihrem PC installiert sein. Grundkenntnisse in Node.js und JavaScript sind unerlässlich. Außerdem benötigen Sie in Ihrer Arbeitsumgebung Administratorrechte.

Node.js-Projekt einrichten

Erstellen Sie zunächst für die Ordnerstruktur der Anwendung einen Ordner mit dem Namen event-app-node-grpc und initialisieren Sie ein Node.js-Projekt mit npm, indem Sie die folgenden Befehle eingeben:

#bash
$ mkdir event-app-node-grpc
$ cd event-app-node-grpc
$ npm init -y

Nachdem Sie Ihre Anwendung initialisiert haben, erstellen Sie die folgende Ordnerstruktur. Den vollständigen, in diesem Tutorial verwendeten Code finden Sie auf GitHub:

Event-app-node-grpc
client
app.js
index.js
server
index.js
scripts
generate-certs.sh
events.proto
README.md

Pakete installieren

Wechseln Sie im Terminal zum Stammverzeichnis Ihrer Anwendung. Installieren Sie die folgenden Pakete mit dem Befehl npm install, wie im folgenden Codeausschnitt gezeigt:

#bash
$ npm install express @grpc/grpc-js @grpc/proto-loader

Sehen wir uns die Pakete an, die Sie im obigen Codeausschnitt installiert haben:

  • Express ist der HTTP-Server Ihrer Anwendung.

  • @grpc/grpc-js ist eine gRPC-Bibliothek für Node.js. Damit können wir einen gRPC-Service in der Node.js-Laufzeitumgebung erstellen.

  • @grpc/proto-loader ist ein Paket, das zum Laden von protobuf-Dateien für die Verwendung mit gRPC benötigt wird. Es nutzt Version 3 des Pakets protobuf.js.

Öffnen Sie nach der Installation der oben genannten Pakete die Datei package.json und ergänzen Sie die folgenden Konfigurationen in den scripts-Tags, wie im nachstehenden Codeausschnitt gezeigt:

#package.json

"scripts": {
   "start": "node server/index.js",
   "generate:certs": "./scripts/generate-certs.sh"
 },

Die oben gezeigten zusätzlichen Konfigurationen dienen der Laufzeitkonfiguration der Anwendung und der Erstellung des SSL-Zertifikats. Nach dem Hinzufügen sollte Ihre aktualisierte Datei package.json dem folgenden Codeausschnitt ähneln:

#package.json(updated)

{
 "name": "event-app-node-grpc",
 "version": "1.0.0",
 "description": "A CRUD application to demonstrate the use of gRPC with NodeJS",
 "main": "server/index.js",
 "scripts": {
   "start": "node server/index.js",
   "generate:certs": "./scripts/generate-certs.sh"
 },
 "author": "(author name here)",
 "license": "ISC",
 "dependencies": {
   "@grpc/proto-loader": "^0.6.12",
   "express": "^4.18.1",
   "@grpc/grpc-js": "^1.6.12
 }
}

Der obige Codeausschnitt zeigt die aktualisierte Datei package.json mit den Befehlen für die Laufzeitkonfiguration der Anwendung und die Erstellung des SSL-Zertifikats im scripts-Tag.

Protocol Buffer definieren

Dieses Tutorial zeigt, wie Sie gRPC in einer einfachen Anwendung zur Ereignisverfolgung verwenden. Die Demoanwendung nimmt Ereignisdetails entgegen und speichert sie in einer In-Memory-Datenbank. Die Ereignisdaten können aktualisiert, abgerufen und gelöscht werden.

In gRPC-Anwendungen befinden sich die Service-Schnittstelle und die benötigten Payloads in einer protobuf-Datei, damit verschiedene Anwendungen miteinander kommunizieren können. protobuf-Dateien haben die Erweiterung .proto, wie im Schema für unsere Projekteinrichtung dargestellt.

Erstellen Sie nun im Stammverzeichnis Ihrer Anwendung eine Datei namens events.proto und fügen Sie den folgenden Code ein. Zur Orientierung können Sie sich die zuvor definierte Schema-Struktur des Projekts ansehen.

#events.proto

syntax = "proto3";

service EventService {
   rpc GetAllEvents (Empty) returns (EventList) {}
   rpc GetEvent (EventId) returns (Event) {}
   rpc CreateEvent (Event) returns (Event) {}
   rpc UpdateEvent (Event) returns (Event) {}
   rpc DeleteEvent (EventId) returns (Empty) {}
}

message Empty {}

message Event {
   string id = 1;
   string name = 2;
   string description = 3;
   string location = 4;
   string duration = 5;
   int32 lucky_number = 6;
   string status = 7;
}

message EventList {
   repeated Event events = 1;
}

message EventId {
   string id = 1;
}

In den obigen Codeausschnitten für die proto-Definition haben wir zunächst mit der Definition syntax = "proto3" die Protocol-Buffer-Version angegeben und anschließend die Protocol-Service-Definition festgelegt.

Als Nächstes haben wir in der Beschreibung des Protocol-Event-Service einen Service namens EventService erstellt. Innerhalb dieses Services haben wir rpc-Funktionen mit den erforderlichen Parametern und erwarteten Rückgabewerten definiert. Sie können so viele Services definieren, wie Ihre Anwendung benötigt. Der Einfachheit halber definieren wir hier jedoch nur einen.

In der Definition von EventService haben wir außerdem die Datentypen für die rpc-Funktion sowie die Rückgabewerte mithilfe des eindeutigen Feldnummerierungssystems von gRPC festgelegt. Dieses beschreibt, wie viele Bytes bei der Codierung verwendet werden. Weitere Informationen finden Sie in der offiziellen protobuf-Dokumentation.

gRPC-Server erstellen

Erstellen Sie entsprechend der oben beschriebenen Ordnerstruktur im Stammverzeichnis Ihrer Anwendung einen Ordner namens server und darin die Datei index.js. Fügen Sie den folgenden Codeausschnitt in die neu erstellte Datei server/index.js ein:

#server/index.js

const PROTO_PATH = "./events.proto";

let grpc = require("@grpc/grpc-js");
let protoLoader = require("@grpc/proto-loader");

let packageDefinition = protoLoader.loadSync(PROTO_PATH, {
   keepCase: true,
   longs: String,
   enums: String,
   arrays: true
});

let eventsProto = grpc.loadPackageDefinition(packageDefinition);

Im obigen Codeausschnitt haben wir die zuvor definierte Datei events.proto als Variable PROTO_PATH importiert und mit der Methode loadSync der Bibliothek protoLoader geladen. Anschließend haben wir die proto-Definitionen in der Variable eventsProto gespeichert, die alle proto-Definitionen enthält.

Fügen Sie nun direkt nach der Variable eventsProto den folgenden Codeausschnitt in die zuvor definierte Datei server/index.js ein.

const { randomUUID } = require("node:crypto");

const events = [
   {
       id: "34415c7c-f82d-4e44-88ca-ae2a1aaa92b7",
       name: "Birthday Party",
       description: "27th Birthday in Paris",
       location: "Paris France",
       duration: "All Day",
       lucky_number: 27,
       status: "Pending"
   },
];

const server = new grpc.Server();

Im obigen Codeausschnitt haben wir das Paket node:crypto und seine Funktion randomUUID eingebunden, mit der zufällige eindeutige Zeichenfolgen für unsere Ereignis-IDs generiert werden. Da wir für dieses Tutorial eine In-Memory-Datenbank verwenden, definieren wir sie als Array, in dem unsere Ereignisliste gespeichert wird. Anschließend richten wir unsere Serverinstanz ein, indem wir eine neue Methode grpc.Server aufrufen.

Als Nächstes registrieren wir die Anwendungsservices. Fügen Sie dazu den folgenden Codeausschnitt direkt nach der Variable server im obigen Code ein:

server.addService(eventsProto.EventService.service, {

   getAllEvents: (_, callback) => {
       callback(null, { events });
   },

   getEvent: (call, callback) => {
       let event = events.find(n => n.id == call.request.id);

       if (event) {
           callback(null, event);
       } else {
           callback({
               code: grpc.status.NOT_FOUND,
               details: "Event Not found"
           });
       }
   },

   createEvent: (call, callback) => {
       let event = call.request;

       event.id = randomUUID();
       events.push(event);
       callback(null, event);
   },

   updateEvent: (call, callback) => {
       let existingEvent = events.find(n => n.id == call.request.id);

       if (existingEvent) {
           existingEvent.name = call.request.name;
           existingEvent.description = call.request.description;
           existingEvent.location = call.request.location;
           existingEvent.duration = call.request.duration;
           existingEvent.lucky_number = call.request.lucky_number;
           existingEvent.status = call.request.status;
           callback(null, existingEvent);
       } else {
           callback({
               code: grpc.status.NOT_FOUND,
               details: "Event Not found"
           });
       }
   },

   deleteEvent: (call, callback) => {
       let existingEventIndex = events.findIndex(
           n => n.id == call.request.id
       );

       if (existingEventIndex != -1) {
           events.splice(existingEventIndex, 1);
           callback(null, {});
       } else {
           callback({
               code: grpc.status.NOT_FOUND,
               details: "Event Not found"
           });
       }
   }
});

Im obigen Codeausschnitt haben wir die Methode addService für die gRPC-Serverinstanz aufgerufen, um die Anwendungsservices zu registrieren. Dabei handelte es sich im Wesentlichen um Vorgänge zum Erstellen, Lesen und Aktualisieren von Ereignissen.

Damit der Anwendungsserver gestartet werden kann, fügen Sie den folgenden Codeausschnitt direkt nach der Methode addService aus dem obigen Code ein.

server.bindAsync("127.0.0.1:50051", grpc.ServerCredentials.createInsecure(), (error, port) => {
console.log(`Server listening at http://127.0.0.1:${port}`);
server.start();
});

gRPC-Client erstellen

Erstellen Sie entsprechend der oben beschriebenen Ordnerstruktur im Stammverzeichnis Ihrer Anwendung einen Ordner namens client. Legen Sie darin zwei Dateien an: index.js und app.js. Fügen Sie den folgenden Codeausschnitt in die Datei client/app.js ein.

#client/app.js

const PROTO_PATH = "../events.proto";
const grpc = require("@grpc/grpc-js");
const protoLoader = require("@grpc/proto-loader");

let packageDefinition = protoLoader.loadSync(PROTO_PATH, {
   keepCase: true,
   longs: String,
   enums: String,
   arrays: true
});

const EventService = grpc.loadPackageDefinition(packageDefinition).EventService;
const client = new EventService("127.0.0.1:50051", grpc.credentials.createInsecure());
module.exports = client;

Im obigen Codeausschnitt haben wir die zuvor erstellten proto-Definitionen importiert, mit protoLoader geladen, den grpc-Client mit der IP-Adresse der Serveranwendung verbunden und den Event-Service unter dem Variablennamen client exportiert. Außerdem haben wir dem Client ein SSL-Zertifikat zur Authentifizierung und Verschlüsselung der Client-Server-Kommunikation hinzugefügt.

Fügen Sie anschließend den folgenden Codeausschnitt in die Datei client/index.js ein:

#client/index.js

const client = require("./app");

const express = require("express");
const app = express();
app.disable('x-powered-by');
app.use(express.json());
app.use(express.urlencoded());

app.get("/", (req, res) => {
   client.getAllEvents(null, (err, data) => {
       if (!err) {
           res.status(200).send({
               data
           });
       }
   });
});

app.post("/createEvent", (req, res) => {

   let newEvent = {
       name: req.body.name,
       description: req.body.age,
       location: req.body.address,
       duration: req.body.address,
       lucky_number: req.body.address,
       status: req.body.status
   };

   client.insert(newEvent, (err, data) => {
       if (err) throw err;
       res.status(200).send({
           data,
           message: 'Event created successfully'
       });
   });
});

app.post("/updateEvent", (req, res) => {
   let updateEvent = {
       name: req.body.name,
       description: req.body.age,
       location: req.body.address,
       duration: req.body.address,
       lucky_number: req.body.address,
       status: req.body.status
   };

   client.update(updateEvent, (err, data) => {
       if (err) throw err;

       res.status(200).send({
           data,
           message: 'Event updated successfully'
       });
   });
});

app.delete("/deleteEvent", (req, res) => {
   client.remove({ id: req.body.eventId }, (err, _) => {
       if (err) throw err;

       res.status(200).send({
           message: 'Event deleted successfully'
       });
   });
});

const PORT = process.env.PORT || 50050;
app.listen(PORT, () => {
   console.log("Client Server listening to port %d", PORT);
});

Im obigen Codeausschnitt haben wir event-service aus der Datei client/app.js importiert. Anschließend haben wir einen Express-Server mit einfachen Endpunkten zum creation, update, fetch und delete von Ereignissen eingerichtet. Dafür rufen wir die Serveranwendung mithilfe von gRPC-Techniken remote auf.

Server- und Clientanwendungen testen

Nun können wir unsere Arbeit testen und prüfen, ob alles wie geplant funktioniert.

Der Server

Wechseln Sie im Terminal zum Stammverzeichnis des Projekts und führen Sie dann die folgenden Befehle aus:

$bash
$ npm run start

Die Serveranwendung sollte unter http://localhost:50051 erreichbar sein:

% npm run start
> event-app-node-grpc@1.0.0 start
> node server/index.js

Server listening at https://127.0.0.1:50051

Der Client

Öffnen Sie ein neues Terminalfenster, wechseln Sie vom Stammverzeichnis Ihrer Anwendung in den client-Ordner und führen Sie dann die folgenden Befehle aus:

$bash
$ node index

Die Anwendung sollte unter http://localhost:50050 erreichbar sein:

$ event-app-node-grpc  cd client
$ event-app-node-grpc/client node index.js

Client Server listening to port 50050

Rufen Sie zum Testen localhost:50050 in Ihrem Browser auf oder verwenden Sie ein API-Testtool wie Postman. Sie sollten das Standardereignis sehen, das wir anfangs zu unserem Ereignis-Array hinzugefügt haben. Die Antwort sollte mit dem folgenden Screenshot übereinstimmen:

Postman-Oberfläche mit einer GET-Anfrage an localhost und einer JSON-Antwort mit Details zu einer Geburtstagsfeier.

gRPC-API authentifizieren und absichern

Das gRPC-Protokoll unterstützt verschiedene Authentifizierungsmechanismen und lässt sich dadurch einfach an neue und bestehende Systeme anpassen. Die Authentifizierung in der gRPC-Client-Server-Kommunikation können wir mithilfe empfohlener Mechanismen wie SSL und TLS implementieren, mit oder ohne Google-Token-basierte Authentifizierung. Außerdem können wir eine benutzerdefinierte Authentifizierung erstellen, indem wir die integrierte Authentifizierungsfunktion von gRPC erweitern.

Standardmäßig umfasst gRPC die folgenden Authentifizierungsmechanismen:

  • SSL und TLS zur Authentifizierung des Servers und zur Verschlüsselung der zwischen Client und Server ausgetauschten Daten

  • ALTS (ein von Google entwickeltes gegenseitiges Transport- und Authentifizierungsprotokoll) zur Absicherung der RPC-Kommunikation von Anwendungen auf der Google Cloud Platform (GCP)

  • Ein generischer Token-basierter Authentifizierungsmechanismus zum Hinzufügen metadatenbasierter Anmeldedaten zu Anfragen und Antworten

Wie in der Einleitung des Tutorials erwähnt, implementieren wir die Authentifizierung in diesem Tutorial mit SSL. Anschließend ändern wir den Code in den Dateien client/app.js und server/index.js, damit er diese neue Funktion unterstützt.

SSL-Zertifikat mit OpenSSL generieren

Generieren wir zunächst mit OpenSSL ein SSL-Zertifikat. Dazu muss OpenSSL installiert sein. Außerdem benötigen Sie die Berechtigung zum Ausführen von Bash-Skripten. Diese Voraussetzungen sind wichtig, um Berechtigungsfehler zu vermeiden.

Erstellen Sie in unserer Ordnerstruktur einen Ordner namens scripts und darin eine Datei namens generate-certs.sh. Fügen Sie den folgenden Codeausschnitt in die Datei ein:

#scripts/generate-certs.sh

echo "Creating certs folder ..."
mkdir certs && cd certs

echo "Generating certificates ..."

openssl genrsa -passout pass:1111 -des3 -out ca.key 4096

openssl req -passin pass:1111 -new -x509 -days 365 -key ca.key -out ca.crt -subj  "/C=CL/ST=RM/L=Santiago/O=Test/OU=Test/CN=localhost"

openssl genrsa -passout pass:1111 -des3 -out server.key 4096

openssl req -passin pass:1111 -new -key server.key -out server.csr -subj  "/C=CL/ST=RM/L=Santiago/O=Test/OU=Server/CN=localhost"

openssl x509 -req -passin pass:1111 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

openssl rsa -passin pass:1111 -in server.key -out server.key

openssl genrsa -passout pass:1111 -des3 -out client.key 4096

openssl req -passin pass:1111 -new -key client.key -out client.csr -subj  "/C=CL/ST=RM/L=Santiago/O=Test/OU=Client/CN=localhost"

openssl x509 -passin pass:1111 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt

openssl rsa -passin pass:1111 -in client.key -out client.key

Der obige Code generiert die SSL-Zertifikate, die für eine sichere, verschlüsselte Verbindung zwischen Server- und Clientanwendung erforderlich sind. Bei der Ausführung erstellt er einen Ordner certs, generiert mit OpenSSL die SSL-Zertifikate für Server und Client und speichert sie anschließend im Ordner certs. Weitere Informationen zu diesen Konfigurationen und ihrer Funktion finden Sie auf der OpenSSL-Website.

SSL-Zertifikat für die Anwendung mit npm generieren

Verwenden Sie nun das Skript, um ein SSL-Zertifikat für Ihre Anwendung zu generieren. Führen Sie dazu im Terminal im Stammverzeichnis der Anwendung die folgenden Befehle aus.

$bash
$ npm run generate:certs

Dadurch wird ein Ordner certs erstellt, der die generierten SSL-Zertifikate enthält.

Beachten Sie, dass dafür Administratorrechte erforderlich sind. Wenn beim Ausführen des Skripts ein Berechtigungsfehler auftritt, erteilen Sie dem Skript mit den folgenden Befehlen die Berechtigung zum Ausführen und versuchen Sie es dann erneut.

$bash
$ cd scripts
$ chmod u+r+x generate-certs.sh
$ ./generate-certs.sh

Im Terminal sollte folgende Ausgabe erscheinen:

> event-app-node-grpc@1.0.0 generate:certs
> ./scripts/generate-certs.sh

Creating certs folder…
Generating certificates…
Generating RSA private key, 4096 bit long modulus
………………………………………………..++
……………..++

e is 65537 (0x10001)
Generating RSA private key, 4096 bit long modulus
…………………++
………………………………………….….….….….….………..…………..++
e is 65537 (0x10001)
Signature ok
subject=/C=CL/ST=RM/L=Santiago/0=Test/OU=Server/CN=localhost
Getting CA Private Key
writing RSA key
Generating RSA private key, 4096 bit long modulus
………………………………………………..….….….…………..++
.…………..++
e is 65537 (0x10001)
Signature ok
subject=/C=CL/ST=RM/L=Santiago/0=Test/OU=Client/ON=localhost
Getting CA Private Key
writing RSA key

Dateien client/app.js und server/index.js aktualisieren

Wir haben nun die SSL-Zertifikate generiert, die zur Authentifizierung unserer gRPC-APIs erforderlich sind. Als Nächstes ändern wir die Dateien client/index.js und server/index.js, damit sie mit diesen generierten Zertifikaten arbeiten.

In der unten gezeigten aktualisierten Datei client/app.js haben wir das Modul fs hinzugefügt, um die generierten Zertifikate einzulesen. Anschließend haben wir damit gRPC-SSL-Anmeldedaten erstellt und diese schließlich auf den gRPC-Service angewendet.

#client/app.js(updated)

const PROTO_PATH = "../events.proto";
const fs = require('fs');
const grpc = require("@grpc/grpc-js");
const protoLoader = require("@grpc/proto-loader");

let packageDefinition = protoLoader.loadSync(PROTO_PATH, {
   keepCase: true,
   longs: String,
   enums: String,
   arrays: true
});

const credentials = grpc.credentials.createSsl(
   fs.readFileSync('../certs/ca.crt'),
   fs.readFileSync('../certs/client.key'),
   fs.readFileSync('../certs/client.crt')
);

const EventService = grpc.loadPackageDefinition(packageDefinition).EventService;
const client = new EventService("localhost:50051",credentials);
module.exports = client;

Auch in der unten gezeigten aktualisierten Datei server/index.js haben wir das Modul fs hinzugefügt, um die generierten Zertifikate einzulesen. Anschließend haben wir damit gRPC-SSL-Anmeldedaten erstellt und diese auf den Server angewendet.

#server/index.js(updated)

const PROTO_PATH = "./events.proto";
const fs = require('fs');

let grpc = require("@grpc/grpc-js");
let protoLoader = require("@grpc/proto-loader");

let packageDefinition = protoLoader.loadSync(PROTO_PATH, {
   keepCase: true,
   longs: String,
   enums: String,
   arrays: true
});

let eventsProto = grpc.loadPackageDefinition(packageDefinition);

const server = new grpc.Server();

let credentials = grpc.ServerCredentials.createSsl(
   fs.readFileSync('./certs/ca.crt'), [{
   cert_chain: fs.readFileSync('./certs/server.crt'),
   private_key: fs.readFileSync('./certs/server.key')
}], true);

----------

----------

server.bindAsync("0.0.0.0:50051", credentials, (error, port) => {
console.log(`Server listening at http://0.0.0.0:${port}`);
server.start();
});

Server- und Clientanwendungen ausführen

Wir haben erfolgreich eine Lösung zur Ereignisverwaltung mithilfe der gRPC-Spezifikationen implementiert. Um die Endpunkte zu testen, starten Sie die Anwendung über das Terminal und führen Sie die folgenden Schritte aus.

Der Server

Navigieren Sie im Terminal zum Stammverzeichnis des Projekts und führen Sie die folgenden Befehle aus:

$bash
$ npm run start

Anschließend sollte die Serveranwendung unter http://0.0.0.0:50051 verfügbar sein:

event-app-node-grpc % npm run start

> event-app-node-grpc@1.0.0 start
> node server/index.js

Server listening at http://0.0.0.0:50051

Der Client

Öffnen Sie ein neues Terminalfenster, navigieren Sie vom Stammverzeichnis Ihrer Anwendung zum Client-Ordner und führen Sie anschließend die folgenden Befehle aus:

$bash
$ node index

Anschließend sollte die Client-Anwendung unter http://localhost:50050 verfügbar sein:

> event-app-node-grpc % cd client
> client % node index
Client Server listening to port 50050

Rufen Sie zum Testen der Anwendung in Ihrem Browser localhost:50050 auf oder verwenden Sie ein API-Testtool wie Postman. Sie sollten das Standardereignis sehen, das wir anfangs zu unserem Events-Array hinzugefügt haben. Ihre Antwort sollte mit dem folgenden Screenshot übereinstimmen:

Postman zeigt eine GET-Anfrage an localhost mit einer JSON-Antwort, die ein ausstehendes Geburtstagsereignis in Paris auflistet.

Sie können nun weitere Endpunkte der Anwendung testen, um sicherzustellen, dass alles wie erwartet funktioniert.

Sie haben eine sichere API mit gRPC erstellt!

In diesem Tutorial haben wir mit Node.js eine einfache API in gRPC erstellt und ihre Funktionsweise sowie zahlreiche Vorteile beleuchtet, darunter HTTP/2 und SSL/TLS für die durchgängige Authentifizierung und Verschlüsselung zur Verbesserung der API-Sicherheit.

Trotz dieser Vorteile hat gRPC auch Schwächen: Dazu zählen die eingeschränkte Browser-Unterstützung, das nicht menschenlesbare Datenformat, die steile Lernkurve und die mangelnde Unterstützung für Edge-Caching. Doch ungeachtet dieser Einschränkungen ist gRPC dank seiner unübertroffenen Leistung und Mehrsprachigkeit die beste Option für die Kommunikation zwischen internen Microservices. Das gRPC-Protokoll ist beeindruckend und hat seit seiner ersten Veröffentlichung im August 2016 in der Branche breite Akzeptanz gefunden. Dieser Trend wird sich zweifellos fortsetzen.

Mit gRPC können Sie noch vieles mehr tun. Das Beispiel in diesem Tutorial kratzt nur an der Oberfläche dessen, was gRPC zu bieten hat. In der Dokumentation können Sie Ihr Wissen über gRPC vertiefen, um die Kommunikationsprozesse Ihrer Anwendung und Strategien zur Gewährleistung der gRPC-Sicherheit zu verbessern.

Weitere API-Ressourcen: