Benutzerdefinierte Plug-ins entwickeln

Sie lesen gerade die Dokumentation zu Apigee Edge.
Apigee X-Dokumentation aufrufen
info

Edge Microgateway v. 2.5.x

Zielgruppe

Dieses Thema richtet sich an Entwickler, die die Funktionen von Edge Microgateway durch das Schreiben benutzerdefinierter Plug-ins erweitern möchten. Wenn Sie ein neues Plug-in schreiben möchten, sind Kenntnisse in JavaScript und Node.js erforderlich.

Was ist ein benutzerdefiniertes Edge Microgateway-Plug-in?

Ein Plug-in ist ein Node.js-Modul, das Edge Microgateway Funktionen hinzufügt. Plugin-Module folgen einem einheitlichen Muster und werden an einem Ort gespeichert, der Edge Microgateway bekannt ist. So können sie automatisch erkannt und ausgeführt werden. Bei der Installation von Edge Microgateway werden mehrere vordefinierte Plug-ins bereitgestellt. Dazu gehören Plug-ins für Authentifizierung, Spike-Arrest, Kontingent und Analysen. Diese vorhandenen Plug-ins werden unter Plug-ins verwenden beschrieben.

Sie können dem Microgateway neue Funktionen hinzufügen, indem Sie benutzerdefinierte Plug-ins schreiben. Standardmäßig ist Edge Microgateway im Wesentlichen ein sicherer Pass-Through-Proxy, der Anfragen und Antworten unverändert an und von Zieldiensten weiterleitet. Mit benutzerdefinierten Plug-ins können Sie programmatisch mit den Anfragen und Antworten interagieren, die über das Microgateway fließen.

Wo benutzerdefinierter Plug-in-Code eingefügt werden muss

Im Rahmen der Edge Microgateway-Installation ist ein Ordner für benutzerdefinierte Plug-ins enthalten:

[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins

Dabei ist [prefix] das npm-Präfixverzeichnis, wie unter „Wo ist Edge Microgateway installiert?“ in Edge Microgateway installieren beschrieben.

Sie können dieses Standard-Plug-in-Verzeichnis ändern. Weitere Informationen

Vordefinierte Plug-ins ansehen

Bevor Sie versuchen, ein eigenes Plug-in zu entwickeln, sollten Sie prüfen, ob eines der vordefinierten Plug-ins Ihren Anforderungen entspricht. Diese Plug-ins befinden sich unter:

[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins

Dabei ist [prefix] das npm-Präfixverzeichnis. Weitere Informationen finden Sie unter Edge Microgateway installieren im Abschnitt „Wo wird Edge Microgateway installiert?“.

Weitere Informationen finden Sie unter Vordefinierte Plug-ins, die mit Edge Microgateway bereitgestellt werden.

Einfaches Plug‑in schreiben

In diesem Abschnitt werden die Schritte zum Erstellen eines einfachen Plug-ins beschrieben. Dieses Plug-in überschreibt die Antwortdaten (unabhängig davon, was sie sind) mit dem String „Hello, World!“ und gibt sie im Terminal aus.

  1. Wenn Edge Microgateway ausgeführt wird, beenden Sie es jetzt:
    edgemicro stop
  2. cd in das Verzeichnis für benutzerdefinierte Plug-ins:

    cd [prefix]/lib/node_modules/edgemicro/plugins

    Dabei ist [prefix] das npm-Präfixverzeichnis, wie unter „Wo ist Edge Microgateway installiert?“ in Edge Microgateway installieren beschrieben.

  3. Erstellen Sie ein neues Plug‑in-Projekt mit dem Namen response-override und cd rufen Sie dieses Verzeichnis auf:
    mkdir response-override && cd response-override
  4. Erstellen Sie ein neues Node.js-Projekt:
    npm init
    Drücken Sie mehrmals die Eingabetaste, um die Standardeinstellungen zu übernehmen.
  5. Erstellen Sie mit einem Texteditor eine neue Datei mit dem Namen index.js.
  6. Kopieren Sie den folgenden Code in index.js und speichern Sie die Datei.
    'use strict';
    var debug = require('debug')
    
    module.exports.init = function(config, logger, stats) {
    
      return {
       
        ondata_response: function(req, res, data, next) {
          debug('***** plugin ondata_response');
          next(null, null);
        },
        
        onend_response: function(req, res, data, next) {
          debug('***** plugin onend_response');
          next(null, "Hello, World!\n\n");
        }
      };
    }
  7. Nachdem Sie ein Plug-in erstellt haben, müssen Sie es der Edge Microgateway-Konfiguration hinzufügen. Öffnen Sie die Datei $HOME/.edgemicro/[org]-[env]-config.yaml, wobei org und env die Namen Ihrer Edge-Organisation und -Umgebung sind.
  8. Fügen Sie das response-override-Plug-in dem plugins:sequence-Element hinzu, wie unten dargestellt.
          ...
          
          plugins:
            dir: ../plugins
            sequence:
              - oauth
              - response-override
              
          ...
        
  9. Starten Sie Edge Microgateway neu.
  10. Eine API über Edge Microgateway aufrufen Bei diesem API-Aufruf wird davon ausgegangen, dass Sie die gleiche Konfiguration wie im Tutorial mit API-Schlüssel-Sicherheit eingerichtet haben, wie unter Edge Microgateway einrichten und konfigurieren beschrieben:
    curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo
    Hello, World!

Aufbau eines Plug-ins

Das folgende Edge Microgateway-Beispiel-Plug-in veranschaulicht das Muster, das Sie beim Entwickeln eigener Plug-ins verwenden sollten. Der Quellcode für das in diesem Abschnitt beschriebene Beispiel-Plug-in befindet sich im Verzeichnis plugins/header-uppercase/index.js..

  • Plug-ins sind Standard-NPM-Module mit einer package.json- und einer index.js-Datei im Stammordner.
  • Ein Plug-in muss eine init()-Funktion exportieren.
  • Die Funktion init() verwendet drei Argumente: config, logger und stats. Diese Argumente werden unter „Argumente der Funktion init() des Plug-ins“ beschrieben.
  • init() gibt ein Objekt mit benannten Funktions-Handlern zurück, die aufgerufen werden, wenn während des Lebenszyklus einer Anfrage bestimmte Ereignisse eintreten.

Event-Handler-Funktionen

Ein Plug-in muss einige oder alle dieser Event-Handler-Funktionen implementieren. Die Implementierung dieser Funktionen liegt bei Ihnen. Jede Funktion ist optional und ein typisches Plug-in implementiert mindestens einen Teil dieser Funktionen.

Event-Handler für den Anfrageablauf

Diese Funktionen werden bei Request-Ereignissen in Edge Microgateway aufgerufen.

  • onrequest
  • ondata_request
  • onend_request
  • onclose_request
  • onerror_request

onrequest Funktion

Wird zu Beginn der Clientanfrage aufgerufen. Diese Funktion wird ausgelöst, wenn das erste Byte der Anfrage von Edge Microgateway empfangen wird. Mit dieser Funktion haben Sie Zugriff auf die Anfrageheader, die URL, die Abfrageparameter und die HTTP-Methode. Wenn Sie „next“ mit einem ersten Argument aufrufen, das als „truthy“ gilt (z. B. eine Instanz von „Error“), wird die Anfrageverarbeitung beendet und es wird keine Zielanfrage initiiert.

Beispiel:

onrequest: function(req, res, next) {
      debug('plugin onrequest');
      req.headers['x-foo-request-start'] = Date.now();
      next();
    }

ondata_request Funktion

Wird aufgerufen, wenn ein Datenblock vom Client empfangen wird. Übergibt Anfragedaten an das nächste Plug-in in der Plug-in-Sequenz. Der zurückgegebene Wert des letzten Plug-ins in der Sequenz wird an das Ziel gesendet. Ein typischer Anwendungsfall, der unten dargestellt ist, besteht darin, die Anfragedaten zu transformieren, bevor sie an das Ziel gesendet werden.

Beispiel:

ondata_request: function(req, res, data, next) {
      debug('plugin ondata_request ' + data.length);
      var transformed = data.toString().toUpperCase();
      next(null, transformed);
    }

onend_request Funktion

Wird aufgerufen, wenn alle Anfragedaten vom Client empfangen wurden.

Beispiel:

onend_request: function(req, res, data, next) {
      debug('plugin onend_request');
      next(null, data);
    }

onclose_request-Function

Gibt an, dass die Clientverbindung geschlossen wurde. Sie können diese Funktion verwenden, wenn die Clientverbindung unzuverlässig ist. Sie wird aufgerufen, wenn die Socket-Verbindung zum Client geschlossen wird.

Beispiel:

onclose_request: function(req, res, next) {
      debug('plugin onclose_request');
      next();
    }

onerror_request-Function

Wird aufgerufen, wenn beim Empfangen der Clientanfrage ein Fehler auftritt.

Beispiel:

onerror_request: function(req, res, err, next) {
      debug('plugin onerror_request ' + err);
      next();
    }

Event-Handler für Antwortabläufe

Diese Funktionen werden bei Antwort-Ereignissen in Edge Microgateway aufgerufen.

  • onresponse
  • ondata_response
  • onend_response
  • onclose_response
  • onerror_response

onresponse-Function

Wird zu Beginn der Zielantwort aufgerufen. Diese Funktion wird ausgelöst, wenn das erste Byte der Antwort von Edge Microgateway empfangen wird. Mit dieser Funktion haben Sie Zugriff auf die Antwortheader und den Statuscode.

Beispiel:

onresponse: function(req, res, next) {      
    debug('plugin onresponse');     
    res.setHeader('x-foo-response-time', Date.now() - req.headers['x-foo-request-start'])    
    next();    
}


ondata_response-Funktion

Wird aufgerufen, wenn ein Datenblock vom Ziel empfangen wird.

Beispiel:

ondata_response: function(req, res, data, next) {
      debug('plugin ondata_response ' + data.length);
      var transformed = data.toString().toUpperCase();
      next(null, transformed);
    }


onend_response-Funktion

Wird aufgerufen, wenn alle Antwortdaten vom Ziel empfangen wurden.

Beispiel:

onend_response: function(req, res, data, next) {
      debug('plugin onend_response');
      next(null, data);
    }

onclose_response-Function

Gibt an, dass die Zielverbindung geschlossen wurde. Sie können diese Funktion verwenden, wenn die Zielverbindung unzuverlässig ist. Wird aufgerufen, wenn die Socketverbindung zum Ziel geschlossen wird.

Beispiel:

onclose_response: function(req, res, next) {
      debug('plugin onclose_response');
      next();
    }


onerror_response-Funktion

Wird aufgerufen, wenn beim Empfangen der Zielantwort ein Fehler auftritt.

Beispiel:

onerror_response: function(req, res, err, next) {
      debug('plugin onerror_response ' + err);
      next();
    }

Wichtige Informationen zu den Funktionen für die Verarbeitung von Plug-in-Ereignissen

Plugin-Ereignis-Handler-Funktionen werden als Reaktion auf bestimmte Ereignisse aufgerufen, die auftreten, während Edge Microgateway eine bestimmte API-Anfrage verarbeitet.

  • Jeder der init()-Funktionshandler (ondata_request, ondata_response usw.) muss den next()-Callback aufrufen, wenn die Verarbeitung abgeschlossen ist. Wenn Sie next() nicht aufrufen, wird die Verarbeitung beendet und die Anfrage bleibt hängen.
  • Das erste Argument für next() kann ein Fehler sein, der dazu führt, dass die Verarbeitung der Anfrage beendet wird.
  • Die Handler ondata_ und onend_ müssen next() mit einem zweiten Argument aufrufen, das die Daten enthält, die an das Ziel oder den Client übergeben werden sollen. Dieses Argument kann null sein, wenn das Plug-in puffert und derzeit nicht genügend Daten für die Transformation vorhanden sind.
  • Beachten Sie, dass eine einzelne Instanz des Plug-ins verwendet wird, um alle Anfragen und Antworten zu verarbeiten. Wenn ein Plug-in den Status pro Anfrage zwischen Aufrufen beibehalten möchte, kann es diesen Status in einer Eigenschaft speichern, die dem bereitgestellten request-Objekt (req) hinzugefügt wird. Die Lebensdauer dieser Eigenschaft entspricht der Dauer des API-Aufrufs.
  • Achten Sie darauf, alle Fehler abzufangen und next() mit dem Fehler aufzurufen. Wenn next() nicht aufgerufen wird, bleibt der API-Aufruf hängen.
  • Achten Sie darauf, keine Speicherlecks zu verursachen, da dies die Gesamtleistung von Edge Microgateway beeinträchtigen und zum Absturz führen kann, wenn der Arbeitsspeicher nicht mehr ausreicht.
  • Achten Sie darauf, dem Node.js-Modell zu folgen und keine rechenintensiven Aufgaben im Hauptthread auszuführen, da dies die Leistung von Edge Microgateway beeinträchtigen kann.

Die Funktion init() des Plug-ins

In diesem Abschnitt werden die Argumente beschrieben, die an die Funktion init() übergeben werden: config, logger und stats.

config

Ein Konfigurationsobjekt, das nach dem Zusammenführen der Edge Microgateway-Konfigurationsdatei mit Informationen, die von Apigee Edge heruntergeladen werden, z. B. Produkte und Kontingente, abgerufen wird. Die plug-inspezifische Konfiguration finden Sie in diesem Objekt: config.<plugin-name>.

Wenn Sie dem Plugin response-override einen Konfigurationsparameter mit dem Namen param und dem Wert foo hinzufügen möchten, fügen Sie Folgendes in die Datei default.yaml ein:

response-override:
    param: foo

Anschließend können Sie im Plug-in-Code so auf den Parameter zugreifen:

// Called when response data is received
    ondata_response: function(req, res, data, next) {
      debug('***** plugin ondata_response');
      debug('***** plugin ondata_response: config.param: ' + config.param);
      next(null, data);
    },

In diesem Fall wird „foo“ in der Debug-Ausgabe des Plug-ins angezeigt:

Sun, 13 Dec 2015 21:25:08 GMT plugin:response-override ***** plugin ondata_response: config.param: foo

logger

Der Systemlogger. Der aktuell verwendete Logger exportiert diese Funktionen, wobei „object“ ein String, eine HTTP-Anfrage, eine HTTP-Antwort oder eine Error-Instanz sein kann.

  • info(object, message)
  • warn(object, message)
  • error(object, message)

Statistiken

Ein Objekt, das die Anzahl der Anfragen, Antworten, Fehler und anderer aggregierter Statistiken im Zusammenhang mit den Anfragen und Antworten enthält, die durch eine Microgateway-Instanz fließen.

  • treqErrors: Die Anzahl der Zielanfragen mit Fehlern.
  • treqErrors: Die Anzahl der Zielantworten mit Fehlern.
  • statusCodes: Ein Objekt mit der Anzahl der Antwortcodes:
{
  1: number of target responses with 1xx response codes
  2: number of target responses with 2xx response codes
  3: number of target responses with 3xx response codes
  4: number of target responses with 4xx response codes
  5: number of target responses with 5xx response codes
  }
  
  • requests: Die Gesamtzahl der Anfragen.
  • Antworten: Die Gesamtzahl der Antworten.
  • connections (Verbindungen): Die Anzahl der aktiven Zielverbindungen.

Die Funktion „next()“

Alle Plug-in-Methoden müssen next() aufrufen, damit die Verarbeitung der nächsten Methode in der Reihe fortgesetzt wird. Andernfalls bleibt der Plug-in-Prozess hängen. Im Lebenszyklus der Anfrage ist die erste aufgerufene Methode onrequest(). Die nächste aufzurufende Methode ist ondata_request(). ondata_request wird nur aufgerufen, wenn die Anfrage Daten enthält, wie z. B. bei einer POST-Anfrage. Als Nächstes wird die Methode onend_request() aufgerufen, wenn die Verarbeitung der Anfrage abgeschlossen ist. Die onerror_*-Funktionen werden nur im Fehlerfall aufgerufen. Sie ermöglichen es Ihnen, Fehler mit benutzerdefiniertem Code zu beheben.

Angenommen, Daten werden in der Anfrage gesendet und ondata_request() wird aufgerufen. Die Funktion ruft next() mit zwei Parametern auf:

next(null, data);

Konventionsgemäß wird der erste Parameter verwendet, um Fehlerinformationen zu übermitteln, die Sie dann in einer nachfolgenden Funktion in der Kette verarbeiten können. Wenn wir es auf null, ein falsches Argument, setzen, bedeutet das, dass keine Fehler vorliegen und die Verarbeitung der Anfrage normal fortgesetzt werden sollte. Wenn dieses Argument wahr ist (z. B. ein Error-Objekt), wird die Verarbeitung der Anfrage beendet und die Anfrage wird an das Ziel gesendet.

Mit dem zweiten Parameter werden die Anfragedaten an die nächste Funktion in der Kette übergeben. Wenn Sie keine zusätzliche Verarbeitung vornehmen, werden die Anfragedaten unverändert an das Ziel der API übergeben. Sie haben jedoch die Möglichkeit, die Anfragedaten in dieser Methode zu ändern und die geänderte Anfrage an das Ziel weiterzuleiten. Wenn die Anfragedaten beispielsweise XML sind und das Ziel JSON erwartet, können Sie der Methode ondata_request() Code hinzufügen, der (a) den Content-Type des Anfrageheaders in application/json ändert und die Anfragedaten auf beliebige Weise in JSON konvertiert (z. B. mit einem Node.js-Konverter xml2json von NPM).

So könnte das aussehen:

ondata_request: function(req, res, data, next) {
  debug('****** plugin ondata_request');
  var translated_data = parser.toJson(data);
  next(null, translated_data);
},

In diesem Fall werden die Anfragedaten (die als XML angenommen werden) in JSON konvertiert und die transformierten Daten werden über next() an die nächste Funktion in der Anfragekette übergeben, bevor sie an das Backend-Ziel übergeben werden.

Sie können eine weitere Debugging-Anweisung hinzufügen, um die transformierten Daten für die Fehlerbehebung auszugeben. Beispiel:

ondata_request: function(req, res, data, next) {
  debug('****** plugin ondata_request');
  var translated_data = parser.toJson(data);
  debug('****** plugin ondata_response: translated_json: ' + translated_json);
  next(null, translated_data);
},

Ausführungsreihenfolge von Plugin-Handlern

Wenn Sie Plug-ins für Edge Microgateway schreiben, müssen Sie die Reihenfolge kennen, in der die Event-Handler von Plug-ins ausgeführt werden.

Wichtig ist, dass die Anfrage-Handler in aufsteigender Reihenfolge und die Antwort-Handler in absteigender Reihenfolge ausgeführt werden, wenn Sie eine Plug-in-Sequenz in der Edge Microgateway-Konfigurationsdatei angeben.

Das folgende Beispiel soll Ihnen helfen, diese Ausführungsreihenfolge zu verstehen.

1. Drei einfache Plug‑ins erstellen

Betrachten Sie das folgende Plug-in. Es gibt lediglich Konsolenausgaben aus, wenn seine Ereignis-Handler aufgerufen werden:

plugins/plugin-1/index.js

module.exports.init = function(config, logger, stats) {

  return {

    onrequest: function(req, res, next) {
      console.log('plugin-1: onrequest');
      next();
    },

    onend_request: function(req, res, data, next) {
      console.log('plugin-1: onend_request');
      next(null, data);
    },

    ondata_response: function(req, res, data, next) {
      console.log('plugin-1: ondata_response ' + data.length);
      next(null, data);
    },

    onend_response: function(req, res, data, next) {
      console.log('plugin-1: onend_response');
      next(null, data);
    }
  };
}

Erstellen Sie nun zwei weitere Plugins, plugin-2 und plugin-3, mit demselben Code. Ändern Sie jedoch die console.log()-Anweisungen in plugin-2 bzw. plugin-3.

2. Plug-in-Code prüfen

Die exportierten Plug-in-Funktionen in <microgateway-root-dir>/plugins/plugin-1/index.js sind Ereignishandler, die zu bestimmten Zeiten während der Verarbeitung von Anfragen und Antworten ausgeführt werden. onrequest wird beispielsweise ausgeführt, wenn das erste Byte der Anfrageheader empfangen wird. onend_response wird ausgeführt, nachdem das letzte Byte der Antwortdaten empfangen wurde.

Sehen Sie sich den Handler „ondata_response“ an. Er wird immer aufgerufen, wenn ein Teil der Antwortdaten empfangen wird. Wichtig ist, dass Antwortdaten nicht unbedingt alle auf einmal empfangen werden. Stattdessen können die Daten in Blöcken beliebiger Länge empfangen werden.

3. Plug‑ins zur Plug‑in-Sequenz hinzufügen

In diesem Beispiel fügen wir die Plug-ins der Plug-in-Sequenz in der Edge Microgateway-Konfigurationsdatei (~./edgemicro/config.yaml) hinzu. Die Reihenfolge ist wichtig. Sie definiert die Reihenfolge, in der die Plug-in-Handler ausgeführt werden.

  plugins:
    dir: ../plugins
    sequence:
      - plugin-1
      - plugin-2
      - plugin-3
  

4. Debug-Ausgabe prüfen

Sehen wir uns nun die Ausgabe an, die bei Aufruf dieser Plugins erzeugt wird. Hier sind einige wichtige Punkte, die Sie beachten sollten:

  • Die Reihenfolge der Plug-ins in der Edge Microgateway-Konfigurationsdatei (~./edgemicro/config.yaml) gibt die Reihenfolge an, in der Event-Handler aufgerufen werden.
  • Anfrage-Handler werden in aufsteigender Reihenfolge aufgerufen (in der Reihenfolge, in der sie in der Plug-in-Sequenz erscheinen – 1, 2, 3).
  • Antworthandler werden in absteigender Reihenfolge aufgerufen: 3, 2, 1.
  • Der ondata_response-Handler wird einmal für jeden eingehenden Datenblock aufgerufen. In diesem Beispiel (Ausgabe unten) werden zwei Chunks empfangen.

Hier sehen Sie ein Beispiel für die Debug-Ausgabe, die erzeugt wird, wenn diese drei Plug-ins verwendet werden und eine Anfrage über Edge Microgateway gesendet wird. Beachten Sie die Reihenfolge, in der die Handler aufgerufen werden:

  plugin-1: onrequest
  plugin-2: onrequest
  plugin-3: onrequest

  plugin-1: onend_request
  plugin-2: onend_request
  plugin-3: onend_request

  plugin-3: ondata_response 931
  plugin-2: ondata_response 931
  plugin-1: ondata_response 931

  plugin-3: ondata_response 1808
  plugin-3: onend_response

  plugin-2: ondata_response 1808
  plugin-2: onend_response

  plugin-1: ondata_response 1808
  plugin-1: onend_response

Zusammenfassung

Die Reihenfolge, in der die Plug-in-Handler aufgerufen werden, ist sehr wichtig, wenn Sie benutzerdefinierte Plug-in-Funktionen implementieren möchten, z. B. das Erfassen und Transformieren von Anforderungs- oder Antwortdaten.

Denken Sie daran, dass Anfrage-Handler in der Reihenfolge ausgeführt werden, in der die Plug-ins in der Edge Microgateway-Konfigurationsdatei angegeben sind, und Antwort-Handler in der umgekehrten Reihenfolge.

Globale Variablen in Plug-ins verwenden

Jede Anfrage an Edge Microgateway wird an dieselbe Instanz eines Plug-ins gesendet. Daher wird der Status einer zweiten Anfrage von einem anderen Client den Status der ersten Anfrage überschreiben. Der einzige sichere Ort zum Speichern des Plug-in-Status ist eine Eigenschaft des Anfrage- oder Antwortobjekts, dessen Lebensdauer auf die der Anfrage beschränkt ist.

Ziel-URLs in Plug-ins umschreiben

Hinzugefügt in Version 2.3.3

Sie können die Standardziel-URL in einem Plug-in dynamisch überschreiben, indem Sie die folgenden Variablen in Ihrem Plug-in-Code ändern: req.targetHostname und req.targetPath.

Hinzugefügt in: v2.4.x

Sie können auch den Zielendpunktport überschreiben und zwischen HTTP und HTTPS wählen. Ändern Sie diese Variablen in Ihrem Plug-in-Code: req.targetPort und req.targetSecure. Wenn Sie HTTPS auswählen möchten, legen Sie req.targetSecure auf true fest. Für HTTP legen Sie es auf false fest. Wenn Sie „req.targetSecure“ auf „true“ setzen, finden Sie in diesem Diskussionsforum weitere Informationen.

Edge Microgateway wurde ein Beispiel-Plug-in namens eurekaclient hinzugefügt. Dieses Plug-in zeigt, wie die Variablen „req.targetPort“ und „req.targetSecure“ verwendet werden, und veranschaulicht, wie Edge Microgateway dynamische Endpunktsuchen mit Eureka als Dienstendpunktkatalog durchführen kann.


Beispiel-Plug-ins

Diese Plug-ins werden mit Ihrer Edge Microgateway-Installation bereitgestellt. Sie finden sie in der Edge Microgateway-Installation hier:

[prefix]/lib/node_modules/edgemicro/plugins

Dabei ist [prefix] das npm-Präfixverzeichnis, wie unter „Wo ist Edge Microgateway installiert?“ in Edge Microgateway installieren beschrieben.

accumulate-request

Dieses Plug-in sammelt Datenblöcke vom Client in einer Array-Property, die dem Anfrageobjekt angehängt ist. Wenn alle Anforderungsdaten empfangen wurden, wird das Array in einen Puffer verkettet, der dann an das nächste Plug-in in der Sequenz übergeben wird. Dieses Plug-in sollte das erste in der Sequenz sein, damit nachfolgende Plug-ins die gesammelten Anfragedaten erhalten.

module.exports.init = function(config, logger, stats) {

  function accumulate(req, data) {

    if (!req._chunks) req._chunks = [];
    req._chunks.push(data);

  }

  return {

    ondata_request: function(req, res, data, next) {

      if (data && data.length > 0) accumulate(req, data);

      next(null, null);

    },


    onend_request: function(req, res, data, next) {

      if (data && data.length > 0) accumulate(req, data);

      var content = null;

      if (req._chunks && req._chunks.length) {

        content = Buffer.concat(req._chunks);

      }

      delete req._chunks;

      next(null, content);

    }

  };

}

accumulate-response

Dieses Plug-in sammelt Datenblöcke aus dem Ziel in einer Array-Property, die an das Antwortobjekt angehängt ist. Wenn alle Antwortdaten empfangen wurden, wird das Array in einem Puffer verkettet, der dann an das nächste Plug-in in der Sequenz übergeben wird. Da dieses Plug-in für Antworten verwendet wird, die in umgekehrter Reihenfolge verarbeitet werden, sollten Sie es als letztes Plug-in in der Sequenz platzieren.

module.exports.init = function(config, logger, stats) {

  function accumulate(res, data) {
    if (!res._chunks) res._chunks = [];
    res._chunks.push(data);
  }

  return {

    ondata_response: function(req, res, data, next) {
      if (data && data.length > 0) accumulate(res, data);
      next(null, null);
    },

    onend_response: function(req, res, data, next) {
      if (data && data.length > 0) accumulate(res, data);
      var content = Buffer.concat(res._chunks);
      delete res._chunks;
      next(null, content);
    }

  };

}

„header-uppercase“-Plug-in

Edge Microgateway-Distributionen enthalten ein Beispiel-Plug-in namens <microgateway-root-dir>/plugins/header-uppercase. Das Beispiel enthält Kommentare, in denen die einzelnen Funktionshandler beschrieben werden. In diesem Beispiel werden einige einfache Datentransformationen der Zielantwort vorgenommen und der Clientanfrage und Zielantwort benutzerdefinierte Header hinzugefügt.

Hier ist der Quellcode für <microgateway-root-dir>/plugins/header-uppercase/index.js:

'use strict';

var debug = require('debug')('plugin:header-uppercase');

// required
module.exports.init = function(config, logger, stats) {

  var counter = 0;

  return {

    // indicates start of client request
    // request headers, url, query params, method should be available at this time
    // request processing stops (and a target request is not initiated) if
    // next is called with a truthy first argument (an instance of Error, for example)
    onrequest: function(req, res, next) {
      debug('plugin onrequest');
      req.headers['x-foo-request-id'] = counter++;
      req.headers['x-foo-request-start'] = Date.now();
      next();
    },

    // indicates start of target response
    // response headers and status code should be available at this time
    onresponse: function(req, res, next) {
      debug('plugin onresponse');
      res.setHeader('x-foo-response-id', req.headers['x-foo-request-id']);
      res.setHeader('x-foo-response-time', Date.now() - req.headers['x-foo-request-start']);
      next();
    },

    // chunk of request body data received from client
    // should return (potentially) transformed data for next plugin in chain
    // the returned value from the last plugin in the chain is written to the target
    ondata_request: function(req, res, data, next) {
      debug('plugin ondata_request ' + data.length);
      var transformed = data.toString().toUpperCase();
      next(null, transformed);
    },

    // chunk of response body data received from target
    // should return (potentially) transformed data for next plugin in chain
    // the returned value from the last plugin in the chain is written to the client
    ondata_response: function(req, res, data, next) {
      debug('plugin ondata_response ' + data.length);
      var transformed = data.toString().toUpperCase();
      next(null, transformed);
    },

    // indicates end of client request
    onend_request: function(req, res, data, next) {
      debug('plugin onend_request');
      next(null, data);
    },

    // indicates end of target response
    onend_response: function(req, res, data, next) {
      debug('plugin onend_response');
      next(null, data);
    },

    // error receiving client request
    onerror_request: function(req, res, err, next) {
      debug('plugin onerror_request ' + err);
      next();
    },

    // error receiving target response
    onerror_response: function(req, res, err, next) {
      debug('plugin onerror_response ' + err);
      next();
    },

    // indicates client connection closed
    onclose_request: function(req, res, next) {
      debug('plugin onclose_request');
      next();
    },

    // indicates target connection closed
    onclose_response: function(req, res, next) {
      debug('plugin onclose_response');
      next();
    }

  };

}

transform-uppercase

Dies ist ein allgemeines Transformations-Plug-in, das Sie nach Belieben anpassen können. In diesem Beispiel werden die Antwort- und Anfragedaten einfach in Großbuchstaben umgewandelt.

 */
module.exports.init = function(config, logger, stats) {

  // perform content transformation here
  // the result of the transformation must be another Buffer
  function transform(data) {
    return new Buffer(data.toString().toUpperCase());
  }

  return {

    ondata_response: function(req, res, data, next) {
      // transform each chunk as it is received
      next(null, data ? transform(data) : null);
    },

    onend_response: function(req, res, data, next) {
      // transform accumulated data, if any
      next(null, data ? transform(data) : null);
    },

    ondata_request: function(req, res, data, next) {
      // transform each chunk as it is received
      next(null, data ? transform(data) : null);
    },

    onend_request: function(req, res, data, next) {
      // transform accumulated data, if any
      next(null, data ? transform(data) : null);
    }

  };

}