Tworzenie wtyczek niestandardowych

Przeglądasz dokumentację Apigee Edge.
Przejdź do Dokumentacja Apigee X.
informacje.

Edge Microgateway w wersji 3.1.5 i nowszych

Odbiorcy

Ten temat jest przeznaczony dla programistów, którzy chcą rozszerzyć funkcje Edge Microgateway, pisząc niestandardowe wtyczki. Jeśli chcesz napisać nową wtyczkę, zapoznaj się z JavaScriptem i Node.js

Czym jest niestandardowa wtyczka Edge Microgateway?

Wtyczka to moduł Node.js, który zapewnia dodatkowe funkcje do Edge Microgateway. Moduły wtyczek są zgodne ze spójnym wzorcem i przechowywane w lokalizacji znanej Edge Microgateway, co umożliwia aby były wykrywane i uruchamiane automatycznie. Dostępnych jest kilka wstępnie zdefiniowanych wtyczek zainstalować Edge Microgateway. Są to między innymi wtyczki do uwierzytelniania, zatrzymania szczytu, limitu Analytics. Informacje o istniejących wtyczkach znajdziesz w artykule Korzystanie z wtyczek.

Możesz dodać do mikrobramy nowe funkcje i możliwości, wpisując custom Edge Microgateway to domyślnie bezpieczny, przekazujący serwer proxy, przekazuje niezmienione żądania i odpowiedzi do i z usług docelowych. Dzięki niestandardowym wtyczkom możesz: automatycznie wchodzą w interakcje z żądaniami i odpowiedziami, które przechodzą przez mikrobramę.

Gdzie umieścić kod wtyczki niestandardowej

Folder na potrzeby niestandardowych wtyczek jest dołączany do instalacji Edge Microgateway tutaj:

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

gdzie [prefix] to katalog z prefiksem npm jako opisane w sekcji „Gdzie jest zainstalowana Edge Microgateway” w instalacji Edge Microgateway.

Możesz zmienić ten domyślny katalog wtyczek. Zobacz Gdzie znaleźć

Sprawdzanie wstępnie zdefiniowanych wtyczek

Zanim utworzysz własną wtyczkę, sprawdź, czy żaden wstępnie zdefiniowany które spełniają wymagania. Te wtyczki znajdują się w:

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

gdzie [prefix] to katalog prefiksów npm. Zobacz też „Gdzie jest zainstalowana Edge Microgateway”. w sekcji Instalowanie Edge Microgateway.

Szczegółowe informacje można znaleźć w artykule Wstępnie zdefiniowane i wtyczki udostępniane przez Edge Microgateway.

Napisanie prostej wtyczki

W tej sekcji omówimy kroki wymagane do utworzenia prostej wtyczki. Ta wtyczka zastępuje dane odpowiedzi (cokolwiek to jest) ciągiem „Hello, World!”, i drukuje ją na złącze.

.
  1. Jeśli Edge Microgateway jest uruchomiona, zatrzymaj ją teraz:
    edgemicro stop
    
  2. cd do katalogu wtyczek niestandardowych:

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

    gdzie [prefix] to katalog prefiksów npm zgodnie z opisem w sekcji „Gdzie zainstalowano Edge Microgateway” w instalacji Edge Microgateway.

  3. Utwórz nowy projekt wtyczki o nazwie response-override i cd. :
    mkdir response-override && cd response-override
    
  4. Utwórz nowy projekt Node.js:
    npm init
    
    Aby zaakceptować wartości domyślne, kilka razy naciśnij klawisz Return.
  5. W edytorze tekstu utwórz nowy plik o nazwie index.js.
  6. Skopiuj ten kod do usługi index.js i zapisz plik.
    '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. Masz już utworzoną wtyczkę, którą musisz dodać do konfiguracji Edge Microgateway. Otwórz plik $HOME/.edgemicro/[org]-[env]-config.yaml, gdzie org i env to nazwy organizacji i środowiska Edge.
  8. Dodaj wtyczkę response-override do elementu plugins:sequence jak pokazano poniżej.
          ...
          
          plugins:
            dir: ../plugins
            sequence:
              - oauth
              - response-override
              
          ...
    
  9. Uruchom ponownie Edge Microgateway.
  10. Wywołaj interfejs API za pomocą Edge Microgateway. (To wywołanie interfejsu API zakłada, że masz skonfigurowane konfiguracji jako samouczka dotyczącego zabezpieczeń klucza interfejsu API, jak opisano w sekcji Konfigurowanie i konfigurowanie Edge Microgateway:
    curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo
    Hello, World!
    

Składnia wtyczki

Poniższa przykładowa wtyczka Edge Microgateway przedstawia wzorzec, który należy zastosować, gdy tworzenia własnych wtyczek. Kod źródłowy przykładowej wtyczki omówionej w tej sekcji to plugins/header-uppercase/index.js.

  • Wtyczki to standardowe moduły NPM z interfejsami package.json i index.js. w folderze głównym.
  • Wtyczka musi wyeksportować funkcję init().
  • Funkcja init() przyjmuje 3 argumenty: config, logger i stats. Argumenty te zostały opisane we wtyczce argumentów funkcji init().
  • init() zwraca obiekt z modułami obsługi funkcji nazwanych, które są wywoływane, gdy określone zdarzenia zachodzą w trakcie realizacji żądania.

Funkcje obsługi zdarzeń

Wtyczka musi implementować niektóre lub wszystkie z tych funkcji obsługi zdarzeń. Wdrożenie zależy od Ciebie. Każda funkcja jest opcjonalna, a typowa wtyczka zostanie zaimplementowana przynajmniej podzbioru tych funkcji.

Moduły obsługi zdarzeń przepływu żądań

Te funkcje są wywoływane w przypadku zdarzeń żądania w Edge Microgateway.

  • onrequest
  • ondata_request
  • onend_request
  • onclose_request
  • onerror_request

funkcja onrequest

Wywoływane na początku żądania klienta. Ta funkcja jest uruchamiana, gdy pierwszy bajt to żądanie jest odbierane przez Edge Microgateway. Ta funkcja daje dostęp do nagłówków żądań, adres URL, parametry zapytania i metodę HTTP. Jeśli wywołujesz następny argument, podając prawdziwy pierwszy argument (np. wystąpienia błędu), przetwarzanie żądania zostanie zatrzymane, a żądanie docelowe nie zostanie zainicjowane.

Przykład:

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

funkcja ondata_request

Wywoływane po otrzymaniu fragmentu danych od klienta. Przenosi żądania danych do następnej w sekwencji wtyczki. Wartość zwrócona z ostatniej wtyczki w sekwencji jest wysyłana do wartość docelową. Typowym zastosowaniem pokazanym poniżej jest przekształcenie danych żądania przed ich wysłaniem. do wartości docelowej.

Przykład:

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

funkcja onend_request

Wywoływane po otrzymaniu od klienta wszystkich danych żądania.

Przykład:

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

Funkcja onclose_request

Wskazuje, że połączenie z klientem zostało zamknięte. Możesz użyć tej funkcji, gdy połączenie z klientem jest zawodne. Jest ona wywoływana, gdy połączenie gniazda z klientem jest zamknięto.

Przykład:

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

Funkcja onerror_request

Wywoływane, jeśli podczas odbierania żądania klienta wystąpił błąd.

Przykład:

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

Moduły obsługi zdarzeń przepływu odpowiedzi

Te funkcje są wywoływane w przypadku zdarzeń odpowiedzi w Edge Microgateway.

  • onresponse
  • ondata_response
  • onend_response
  • onclose_response
  • onerror_response

Funkcja onresponse

Wywoływane na początku odpowiedzi docelowej. Ta funkcja jest uruchamiana, gdy pierwszy bajt Odpowiedź jest odebrana przez Edge Microgateway. Ta funkcja zapewnia dostęp do nagłówków odpowiedzi i kod stanu.

Przykład:

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


Funkcja ondata_response

Wywoływana, gdy z miejsca docelowego zostanie odebrany fragment danych.

Przykład:

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


Funkcja onend_response

Wywoływane po odebraniu wszystkich danych odpowiedzi z celu.

Przykład:

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

Funkcja onclose_response

Wskazuje, że połączenie docelowe zostało zamknięte. Możesz użyć tej funkcji, gdy jest zawodne. Jest ona wywoływana, gdy połączenie gniazda z miejscem docelowym to zamknięto.

Przykład:

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


Funkcja onerror_response

Wywoływane, jeśli wystąpił błąd podczas odbierania odpowiedzi docelowej.

Przykład:

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

Co musisz wiedzieć o funkcje obsługi zdarzeń wtyczki

Funkcje obsługi zdarzeń wtyczek są wywoływane w odpowiedzi na określone zdarzenia Edge Microgateway przetwarza dane żądanie do interfejsu API.

  • Każdy moduł obsługi funkcji init() (ondata_request, ondata_response itp.) musi wywołać wywołanie zwrotne next() po ich wykonaniu. o przetwarzaniu danych. Jeśli nie wywołasz funkcji next(), przetwarzanie zostanie zatrzymane, a żądanie zwiesz się.
  • Pierwszy argument funkcji next() może być błędem, który spowoduje wysłanie żądania w celu zakończenia przetwarzania.
  • Moduły ondata_ i onend_ muszą wywoływać funkcje next() z drugim argumentem zawierającym dane, które mają zostać przekazane do wartości docelowej. lub klienta. Ten argument może mieć wartość null, jeśli wtyczka buforuje i nie ma wystarczająco dużo danych, w danym momencie.
  • Pamiętaj, że do obsługi wszystkich żądań i odpowiedzi używana jest jedna instancja wtyczki. Jeśli wtyczka chce zachować stan poszczególnych żądań między wywołaniami, może zapisać ten stan w pliku została dodana do dostarczonego obiektu request (req), którego czas trwania to czas trwania wywołania interfejsu API.
  • Pamiętaj, by wykryć wszystkie błędy i wywołać funkcję next() z błędem. Nieprzestrzeganie tych zasad wywołanie next() spowoduje zawieszenie wywołania interfejsu API.
  • Uważaj, aby nie wprowadzać wycieków pamięci, ponieważ może to mieć wpływ na ogólną wydajność Edge Microgateway i powodować awarię, jeśli zabraknie pamięci.
  • Zachowaj zgodność z modelem Node.js i nie wykonuj zadań wymagających dużej mocy obliczeniowej w głównej , ponieważ może to negatywnie wpłynąć na wydajność Edge Microgateway.

Informacje o funkcji init() wtyczki

W tej sekcji opisujemy argumenty przekazywane do funkcji init(): config, logger i stats.

konfiguracja

Dane konfiguracji uzyskane przez połączenie pliku konfiguracji Edge Microgateway z dane pobrane z Apigee Edge są umieszczane w obiekcie o nazwie config.

Aby dodać parametr konfiguracji o nazwie param i wartości foo: do wtyczki o nazwie response-override, umieść to w sekcji default.yaml plik:

response-override:
    param: foo

Następnie możesz uzyskać dostęp do parametru w kodzie wtyczki w następujący sposób:

// 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);
    },

W takim przypadku w danych wyjściowych debugowania wtyczki zobaczysz foo:

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

Ty może uzyskać dostęp do scalonej konfiguracji mikrobramki i pobrać dane Apigee Edge w obiekt podrzędny config.emgConfigs. Przykład: dostęp do tych danych konfiguracji możesz uzyskać w funkcji init w następujący sposób:

module.exports.init = function(config, logger, stats) {
   let emgconfigs = config.emgConfigs;

Oto przykładowe dane, które zawiera emgConfigs:

{
    edgemicro:
    {
        port: 8000,
        max_connections: 1000,
        config_change_poll_interval: 600,
        logging:
        {
            level: 'error',
            dir: '/var/tmp',
            stats_log_interval: 60,
            rotate_interval: 24,
            stack_trace: false
        },
        plugins: { sequence: [Array] },
        global: { org: 'Your Org', env: 'test' }
    },
    headers:
    {
        'x-forwarded-for': true,
        'x-forwarded-host': true,
        'x-request-id': true,
        'x-response-time': true,
        via: true
    },
    proxies:
    [    {
                max_connections: 1000,
                name: 'edgemicro_delayed',
                revision: '1',
                proxy_name: 'default',
                base_path: '/edgemicro_delayed',
                target_name: 'default',
                url: 'https://httpbin.org/delay/10',
                timeout: 0
            }
    ],
    product_to_proxy: { EdgeMicroTestProduct: [ 'edgemicro-auth','edgemicro_delayed',] },
    product_to_scopes: {prod4: [ 'Admin', 'Guest', 'Student' ] },
    product_to_api_resource: { EdgeMicroTestProduct: [ '/*' ] },
    _hash: 0,
    keys: { key: 'Your key', secret: 'Your key ' },
    uid: 'Internally generated uuid',
    targets: []
  }

rejestrator

Rejestrator systemowy. Używany obecnie rejestrator eksportuje te funkcje, gdzie można ciąg znaków, żądanie HTTP, odpowiedź HTTP lub wystąpienie błędu.

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

statystyki

Obiekt zawierający liczbę żądań, odpowiedzi, błędów i inne zbiorcze statystyki związane z żądaniami i odpowiedziami przechodzącymi przez instancję mikrobramki.

  • treqErrors – liczba żądań docelowych z błędami.
  • treqErrors – liczba odpowiedzi docelowych z błędami.
  • statusCodes – obiekt zawierający kod odpowiedzi, który zlicza:
{
  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
  }
  
  • żądania – łączna liczba żądań.
  • responses – łączna liczba odpowiedzi.
  • connections (połączenia) – liczba aktywnych połączeń docelowych.

Informacje o funkcji next()

Aby można było kontynuować przetwarzanie następnej metody w parametrze next(), wszystkie metody wtyczki (lub proces wtyczki zawiesi się). Pierwsza wywoływana metoda w cyklu życia żądania to onrequest(). Kolejną wywoływaną metodą jest ondata_request(). jednak Funkcja ondata_request jest wywoływana tylko wtedy, gdy żądanie zawiera dane, na przykład na przykład dla żądania POST. Następną wywoływaną metodą będzie onend_request(), które jest wywoływane po zakończeniu przetwarzania żądania. Funkcje onerror_* są wywoływane tylko w przypadku błędu i umożliwiają wykonanie naprawiaj błędy za pomocą niestandardowego kodu.

Załóżmy, że w żądaniu zostały wysłane dane, a funkcja ondata_request() jest wywoływana. Uwaga które funkcja wywołuje next() z 2 parametrami:

next(null, data);

Zgodnie z konwencją do przekazania informacji o błędzie jest używany pierwszy parametr, którego możesz następnie w kolejnej funkcji w łańcuchu. Po ustawieniu na null jest to fałszywe , uznamy, że nie ma błędów i przetwarzanie żądań powinno przebiegać normalnie. Jeśli ten argument jest prawdziwy (np. obiekt Error), wówczas przetwarzanie żądania zostaje zatrzymane, wysłane do celu.

Drugi parametr przekazuje dane żądania do następnej funkcji w łańcuchu. Jeśli nie dodatkowe przetwarzanie, dane żądania są przekazywane bez zmian do miejsca docelowego interfejsu API. Możesz jednak w ramach tej metody zmodyfikować dane żądania i przekazać zmodyfikowane do grupy docelowej. Jeśli np. dane żądania są w formacie XML, a obiekt docelowy oczekuje kodu JSON, możesz dodać do metody ondata_request() kod, który (a) zmieni wartość Content-Type nagłówka żądania na application/json i konwertuje dane żądania w formacie JSON, w dowolny sposób (możesz na przykład użyć środowiska Node.js konwertera xml2json uzyskanego z NPM).

Zobaczmy, jak mogłoby to wyglądać:

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

W tym przypadku dane żądania (przyjmowane jako XML) są konwertowane do formatu JSON, a tag przekształcone dane są przekazywane przez next() do następnej funkcji w łańcuchu żądań, przed przekazaniem do miejsca docelowego backendu.

Pamiętaj, że możesz dodać kolejną instrukcję debugowania, aby wydrukować przekształcone dane na potrzeby debugowania. w celach informacyjnych. Na przykład:

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);
},

Informacje kolejność wykonania modułu obsługi wtyczki

Jeśli piszesz wtyczki do Edge Microgateway, musisz wiedzieć, w jakiej kolejności są wykonywane moduły obsługi zdarzeń.

Należy pamiętać, że określając sekwencję wtyczki w przeglądarce Edge konfiguracji Microgateway, moduły obsługi żądań są wykonywane w kolejności rosnącej, a moduły obsługi odpowiedzi są wykonywane w kolejności malejącej.

Poniższy przykład ma pomóc w zrozumieniu tej sekwencji wykonywania.

1. Utwórz 3 proste wtyczki

Przyjrzyjmy się wtyczce poniżej. Generuje tylko dane wyjściowe konsoli, gdy jej moduły obsługi zdarzeń pod tytułem

Wtyczka/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);
    }
  };
}

Rozważ utworzenie jeszcze 2 wtyczek: plugin-2 i plugin-3, z zastosowaniem ten sam kod (ale zmień instrukcje console.log() na plugin-2 i plugin-3).

2. Sprawdź kod wtyczki

Wyeksportowana wtyczka działa w <microgateway-root-dir>/plugins/plugin-1/index.js to moduły obsługi zdarzeń, które są wykonywane w określonych momentach podczas przetwarzania żądań i odpowiedzi. Przykład: Funkcja onrequest wykonuje pierwszy bajt nagłówka żądania. Ale Funkcja onend_response jest wykonywana po otrzymaniu ostatniego bajtu danych odpowiedzi.

Spójrz na moduł obsługi ondata_response – jest on wywoływany za każdym razem, gdy fragment danych odpowiedzi . Pamiętaj, że dane odpowiedzi nie zawsze są dostarczane w całości raz. Dane mogą być pobierane we fragmentach o dowolnej długości.

3. Dodaj wtyczki do sekwencja wtyczki

Kontynuując ten przykład, dodamy wtyczki do sekwencji wtyczek w Edge. pliku konfiguracyjnego Microgateway (~./edgemicro/config.yaml) w następujący sposób. Sekwencja jest są ważne. Określa kolejność wykonywania modułów obsługi wtyczek.

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

4. Sprawdzanie danych wyjściowych debugowania

Spójrzmy teraz na dane wyjściowe, które zostałyby wygenerowane po wywołaniu tych wtyczek. Istnieją warto zwrócić uwagę na kilka ważnych kwestii:

  • Wtyczka sekwencja pliku konfiguracyjnego Edge Microgateway (~./edgemicro/config.yaml) określa kolejność, w jakiej moduły obsługi zdarzeń są .
  • Moduły obsługi żądań są wywoływane w kolejności rosnącej (w kolejności, w jakiej są pojawiają się w sekwencji wtyczki – 1, 2, 3).
  • Moduły obsługi odpowiedzi są wywoływane w kolejności malejącej – 3, 2, 1.
  • Moduł obsługi ondata_response jest wywoływany raz dla każdego fragmentu danych, który przyjeżdża. W tym przykładzie (dane wyjściowe pokazane poniżej) odbierają 2 fragmenty.

Oto przykładowe dane wyjściowe debugowania, które są generowane, gdy te 3 wtyczki są używane i wysyłane jest żądanie za pomocą Edge Microgateway. Zwróć tylko uwagę na kolejność wywoływania modułów obsługi:

  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

Podsumowanie

Poznanie kolejności wywoływania modułów obsługi wtyczek jest bardzo ważne wdrożyć niestandardowe funkcje wtyczki, takie jak zbieranie i przekształcanie żądań lub odpowiedzi; i skalowalnych danych.

Pamiętaj tylko, że moduły obsługi żądań są wykonywane w kolejności, w której są uruchamiane wtyczki określone w pliku konfiguracyjnym Edge Microgateway, a moduły obsługi odpowiedzi są wykonywane w w odwrotnej kolejności.

Informacje o używaniu zmiennych globalnych we wtyczkach

Każde żądanie do Edge Microgateway jest wysyłane do tej samej instancji wtyczki. w związku z tym stan drugiego żądania od innego klienta zastąpi pierwsze. Jedynym bezpiecznym miejscem i zapisanie stanu wtyczki polega na zapisaniu stanu we właściwości w obiekcie żądania lub odpowiedzi (którym okres ważności jest ograniczony do okresu żądania).

Przepisywanie docelowych adresów URL we wtyczce

Dodano w wersji 2.3.3

Możesz dynamicznie zastąpić domyślny docelowy URL we wtyczce, modyfikując te zmienne w kodzie wtyczki: req.targetHostname i req.targetPath.

Dodano w wersji 2.4.x

Możesz też zastąpić docelowy port punktu końcowego i wybrać HTTP lub HTTPS. Zmień te w kodzie wtyczki: req.targetPort oraz req.targetSecure. Aby wybrać HTTPS, ustaw parametr req.targetSecure na true; dla HTTP, ustaw wartość false. Jeśli ustawisz req.targetSecure na true, obejrzyj tę dyskusję .

Przykładowa wtyczka o nazwie eurekaclient została dodana do Edge Microgateway. Ten pokazuje, jak używać zmiennych req.targetPort i req.targetSecure oraz pokazuje, jak Edge Microgateway może przeprowadzać dynamiczne wyszukiwanie punktów końcowych za pomocą usługi Eureka katalogu punktów końcowych.


Przykładowe wtyczki

Te wtyczki są dostarczane wraz z instalacją Edge Microgateway. Znajdziesz je w Tutaj możesz zainstalować Edge Microgateway:

[prefix]/lib/node_modules/edgemicro/plugins

gdzie [prefix] to katalog z prefiksem npm jako opisane w sekcji „Gdzie jest zainstalowana Edge Microgateway” w instalacji Edge Microgateway.

accumulate-request

Ta wtyczka gromadzi fragmenty danych z klienta do właściwości tablicy dołączonej do obiektu żądania. Po otrzymaniu wszystkich danych żądania tablica jest połączona z buforem. który jest następnie przekazywany do następnej wtyczki w sekwencji. Ta wtyczka powinna być pierwszą wtyczką w sekwencji, tak aby kolejne wtyczki otrzymywały dane dotyczące żądań.

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

Ta wtyczka gromadzi fragmenty danych ze środowiska docelowego do właściwości tablicy dołączonej do obiektu odpowiedzi. Po otrzymaniu wszystkich danych odpowiedzi tablica jest połączona z buforem który jest następnie przekazywany do następnej wtyczki w sekwencji. Ponieważ ta wtyczka działa na przetwarzanych w odwrotnej kolejności, należy umieścić je jako ostatnią wtyczkę w kolejności.

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);
    }

  };

}

wtyczka z nagłówkiem „uppercase”

Rozkłady Edge Microgateway zawierają przykładową wtyczkę o nazwie <microgateway-root-dir>/plugins/header-uppercase Przykład zawiera komentarze który zawiera opis każdego z modułów obsługi funkcji. W tym przykładzie przeprowadzamy proste przekształcenie danych funkcji i dodaje niestandardowe nagłówki do żądania klienta i odpowiedzi docelowej.

Oto kod źródłowy dla <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();
    }

  };

}

przekształcanie wielkie litery

To ogólna wtyczka przekształcająca, którą można zmodyfikować, aby uzyskać według własnego uznania. Ten przykład po prostu przekształca odpowiedź i dane żądania na wielkimi literami.

 */
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);
    }

  };

}