Tworzenie wtyczek niestandardowych

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
Informacje

Edge Microgateway wersja 3.2.x

Odbiorcy

Ten temat jest przeznaczony dla programistów, którzy chcą rozszerzać funkcje Edge Microgateway za pomocą niestandardowych wtyczek. Jeśli chcesz napisać nową wtyczkę, musisz mieć doświadczenie z JavaScriptem i Node.js.

Czym jest niestandardowa wtyczka Edge Microgateway?

Wtyczka to moduł Node.js, który dodaje funkcje do Edge Microgateway. Moduły wtyczek mają spójny wzorzec i są przechowywane w lokalizacji znanej przez Edge Microgateway, dzięki czemu można je wykrywać i uruchamiać automatycznie. Podczas instalacji Edge Microgateway jest dostępnych kilka wstępnie zdefiniowanych wtyczek. Są to między innymi wtyczki służące do uwierzytelniania, przyspieszania zatrzymania, limitów i statystyk. Opis tych istniejących wtyczek znajdziesz w sekcji Używanie wtyczek.

Możesz dodawać do mikrobramy nowe funkcje i możliwości, tworząc niestandardowe wtyczki. Domyślnie Edge Microgateway to zasadniczo bezpieczny przekazujący serwer proxy, który przekazuje żądania i odpowiedzi niezmienione do usług docelowych i z nich. Niestandardowe wtyczki umożliwiają programową interakcję z żądaniami i odpowiedziami, które przechodzą przez mikrobramę.

Gdzie umieścić niestandardowy kod wtyczki

Folder z niestandardowymi wtyczkami jest częścią instalacji Edge Microgateway, która znajduje się tutaj:

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

gdzie [prefix] to katalog prefiksu npm zgodnie z opisem w sekcji „Gdzie jest zainstalowana przeglądarka Edge Microgateway” w artykule Instalowanie Edge Microgateway.

Możesz zmienić ten domyślny katalog wtyczek. Zobacz, gdzie znaleźć wtyczki.

Sprawdzanie wstępnie zdefiniowanych wtyczek

Zanim spróbujesz utworzyć własną wtyczkę, warto sprawdzić, czy żadna ze wstępnie zdefiniowanych wtyczek nie spełnia Twoich wymagań. Te wtyczki znajdują się w:

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

gdzie [prefix] to katalog prefiksów npm. Zobacz też sekcję „Gdzie jest zainstalowana Edge Microgateway” artykułu Instalowanie Edge Microgateway.

Więcej informacji znajdziesz w sekcji Wstępnie zdefiniowane wtyczki udostępniane przez Edge Microgateway.

Napisz prostą wtyczkę

W tej sekcji pokażemy, jak utworzyć prostą wtyczkę. Ta wtyczka zastępuje dane odpowiedzi (cokolwiek to jest) ciągiem „Hello, World!” i drukuje je w terminalu.

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

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

    gdzie [prefix] to katalog prefiksu npm zgodnie z opisem w sekcji „Gdzie jest zainstalowana przeglądarka Edge Microgateway” w artykule Instalowanie 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
    
    Naciśnij kilka razy klawisz powrotu, aby zaakceptować ustawienia domyślne.
  5. Użyj edytora tekstu, aby utworzyć nowy plik o nazwie index.js.
  6. Skopiuj ten kod do aplikacji 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. Wtyczka została utworzona i musisz ją dodać do konfiguracji Edge Microgateway. Otwórz plik $HOME/.edgemicro/[org]-[env]-config.yaml, gdzie org i env to nazwy organizacji i środowisk Edge.
  8. Dodaj wtyczkę response-override do elementu plugins:sequence, jak pokazano poniżej.
          ...
          
          plugins:
            dir: ../plugins
            sequence:
              - oauth
              - response-override
              
          ...
    
  9. Ponownie uruchom Edge Microgateway.
  10. Wywołaj interfejs API przez Edge Microgateway. (W tym wywołaniu interfejsu API założono, że masz skonfigurowaną tę samą konfigurację jak w samouczku z zabezpieczeniami klucza interfejsu API zgodnie z opisem w sekcji Konfigurowanie i konfigurowanie Edge Microgateway:
    curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo
    Hello, World!
    

Składnia wtyczki

Przykładowa wtyczka Edge Microgateway ilustruje wzorzec, którym należy przestrzegać podczas tworzenia własnych wtyczek. Kod źródłowy przykładowej wtyczki omówionej w tej sekcji znajduje się w sekcji plugins/header-uppercase/index.js.

  • Wtyczki to standardowe moduły NPM z elementami package.json i index.js w folderze głównym.
  • Wtyczka musi wyeksportować funkcję init().
  • Funkcja init() przyjmuje 3 argumenty: config, logger i stats. Te argumenty opisano w argumentach funkcji init() wtyczki.
  • init() zwraca obiekt z modułami obsługi funkcji nazwanych, które są wywoływane, gdy w cyklu życia żądania występują określone zdarzenia.

Funkcje modułu obsługi zdarzeń

Wtyczka musi implementować niektóre lub wszystkie funkcje modułu obsługi zdarzeń. Implementacja tych funkcji zależy od Ciebie. Każda funkcja jest opcjonalna, a typowa wtyczka implementuje co najmniej jeden podzbiór tych funkcji.

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

Te funkcje są wywoływane ze zdarzeniami żądania w Edge Microgateway.

  • onrequest
  • ondata_request
  • onend_request
  • onclose_request
  • onerror_request

onrequest funkcja

Wywoływana na początku żądania klienta. Ta funkcja jest uruchamiana, gdy Edge Microgateway otrzyma pierwszy bajt żądania. Ta funkcja zapewnia dostęp do nagłówków żądań, adresu URL, parametrów zapytania i metody HTTP. Jeśli wywołasz następny argument z prawdziwym pierwszym argumentem (takim jak wystąpienie 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();
    }

ondata_request funkcja

Wywoływana po odebraniu fragmentu danych od klienta. Przekazuje dane żądania do następnej wtyczki w sekwencji wtyczki. Zwrócona wartość z ostatniej wtyczki w sekwencji jest wysyłana do środowiska docelowego. Typowym przypadkiem użycia opisanym poniżej jest przekształcanie danych żądania przed wysłaniem ich do miejsca docelowego.

Przykład:

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

onend_request funkcja

Wywoływana po odebraniu wszystkich danych żądania od klienta.

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 w przypadku, gdy połączenie z klientem jest zawodne. Jest wywoływana po zamknięciu połączenia przez gniazdo z klientem.

Przykład:

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

Funkcja onerror_request

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

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 po zdarzeniach odpowiedzi w Edge Microgateway.

  • onresponse
  • ondata_response
  • onend_response
  • onclose_response
  • onerror_response

Funkcja onresponse

Wywoływana na początku docelowej odpowiedzi. Ta funkcja jest uruchamiana, gdy Edge Microgateway otrzyma pierwszy bajt odpowiedzi. Ta funkcja zapewnia dostęp do nagłówków odpowiedzi i kodu 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 po odebraniu fragmentu danych z celu.

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żywać tej funkcji w przypadkach, gdy połączenie docelowe jest niestabilne. Jest ona wywoływana, gdy połączenie gniazda z miejscem docelowym zostanie zamknięte.

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 docelowej odpowiedzi.

Przykład:

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

Co musisz wiedzieć o funkcjach modułu obsługi zdarzeń wtyczki

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

  • Po zakończeniu przetwarzania każdy z modułów obsługi funkcji init() (ondata_request, ondata_response itp.) musi wywoływać wywołanie zwrotne next(). Jeśli nie wywołasz funkcji next(), przetwarzanie zostanie zatrzymane, a żądanie zostanie zawieszone.
  • Pierwszy argument funkcji next() może zawierać błąd, który spowoduje zakończenie przetwarzania żądania.
  • Moduły obsługi ondata_ i onend_ muszą wywoływać metodę next() z drugim argumentem zawierającym dane, które mają zostać przekazane do elementu docelowego lub klienta. Ten argument może mieć wartość null, jeśli wtyczka buforuje i nie ma wystarczającej ilości danych do przekształcenia.
  • Zwróć uwagę, że pojedyncza instancja wtyczki jest używana do obsługi wszystkich żądań i odpowiedzi. Jeśli wtyczka chce zachować stan żądania między wywołaniami, może zapisać ten stan w usłudze dodanej do dostarczonego obiektu request (req), którego czas trwania to czas trwania wywołania interfejsu API.
  • Uważaj, aby wychwycić wszystkie błędy i wywołać z nimi funkcję next(). Nieudane wywołanie metody next() spowoduje zawieszenie wywołania interfejsu API.
  • Uważaj, aby nie wprowadzić wycieków pamięci, ponieważ może to wpłynąć na ogólną wydajność Edge Microgateway i spowodować jej awarię w przypadku wyczerpania pamięci.
  • Uważaj, aby korzystać z modelu Node.js i nie wykonywać zadań wymagających dużej mocy obliczeniowej w wątku głównym, ponieważ może to niekorzystnie 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 łączenie pliku konfiguracji Edge Microgateway z danymi pobranymi z Apigee Edge są umieszczane w obiekcie o nazwie config.

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

response-override:
    param: foo

Następnie możesz uzyskać dostęp do tego parametru w kodzie wtyczki, jak w tym przykładzie:

// 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 zostanie wyświetlony tag foo:

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

Dostęp do scalonej konfiguracji mikrobramy i pobranych danych Apigee Edge znajdziesz w obiekcie podrzędnym config.emgConfigs. Możesz na przykład uzyskać dostęp do tych danych konfiguracji w funkcji init w następujący sposób:

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

Poniżej znajduje się przykład danych, 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: []
  }

logger

Rejestrator systemowy. Obecnie używany rejestrator eksportuje te funkcje, których obiekt może być ciągiem tekstowym, żądaniem HTTP, odpowiedzią HTTP lub wystąpieniem 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 dotyczące żądań i odpowiedzi przechodzących przez instancję mikrobramy.

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

Informacje o funkcji next()

Aby kontynuować przetwarzanie następnej metody w serii, wszystkie metody wtyczki muszą wywołać metodę next() (w przeciwnym razie proces wtyczki się zawiesi). Pierwsza metoda wywoływana w cyklu życia żądania to onrequest(). Kolejną wywoływaną metodą jest ondata_request(); jednak metoda ondata_request jest wywoływana tylko wtedy, gdy żądanie zawiera dane, jak w tym przypadku, na przykład POST. Kolejna wywoływana metoda to onend_request(), która jest wywoływana po zakończeniu przetwarzania żądania. Funkcje onerror_* są wywoływane tylko w przypadku błędu i pozwalają wyeliminować błędy za pomocą kodu niestandardowego.

Załóżmy, że dane są wysyłane w żądaniu, a wywoływana jest funkcja ondata_request(). Zwróć uwagę, że funkcja wywołuje next() z 2 parametrami:

next(null, data);

Zgodnie z konwencją pierwszy parametr jest używany do przekazywania informacji o błędzie, które możesz obsłużyć w kolejnej funkcji w łańcuchu. Ustawienie fałszywego argumentu null oznacza, że nie ma błędów i przetwarzanie żądań powinno przebiegać normalnie. Jeśli ten argument jest prawidłowy (np. jest obiektem błędu), przetwarzanie żądania zatrzymuje się, a żądanie jest wysyłane do celu.

Drugi parametr przekazuje dane żądania do następnej funkcji w łańcuchu. Jeśli nie wykonasz dodatkowego przetwarzania, dane żądania zostaną przekazane w niezmienionej postaci do celu interfejsu API. Możesz jednak zmodyfikować dane żądania w tej metodzie i przekazać zmodyfikowane żądanie do środowiska docelowego. Jeśli np. dane żądania mają format XML, a cel oczekuje w formacie JSON, możesz dodać do metody ondata_request() kod, który (a) zmienia wartość Content-Type nagłówka żądania na application/json i konwertuje dane żądania na format JSON w dowolny sposób (możesz np. użyć konwertera Node.js xml2json uzyskanego z NPM).

Spójrzmy, jak to może 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 (które powinny mieć format XML) są konwertowane do formatu JSON, a przekształcone dane są przekazywane przez funkcję next() do następnej funkcji w łańcuchu żądań, zanim trafią do celu backendu.

Pamiętaj, że możesz dodać kolejną instrukcję debugowania, aby wydrukować przekształcone dane na potrzeby debugowania. 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 o zamówieniu wykonania modułu obsługi wtyczek

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

Pamiętaj, że jeśli określisz sekwencję wtyczki w pliku konfiguracyjnym Edge Microgateway, moduły obsługi żądań będą wykonywane w kolejności rosnącej, a moduły obsługi odpowiedzi – w kolejności malejąco.

Poniższy przykład pomoże Ci zrozumieć tę sekwencję wykonania.

1. Utwórz 3 proste wtyczki

Przyjrzyj się tej wtyczce. Służy tylko do drukowania danych wyjściowych konsoli, gdy ich moduły obsługi zdarzeń są wywoływane:

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

Teraz zastanów się nad utworzeniem 2 dodatkowych wtyczek, plugin-2 i plugin-3, o tym samym kodzie (z wyjątkiem zmiany instrukcji console.log() na odpowiednio plugin-2 i plugin-3).

2. Sprawdź kod wtyczki

Wyeksportowane funkcje wtyczek 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. Na przykład onrequest wykonuje pierwszy bajt otrzymanych nagłówków żądań. Natomiast onend_response uruchamia się po odebraniu ostatniego bajtu danych odpowiedzi.

Spójrz na moduł obsługi ondata_response, który jest wywoływany za każdym razem, gdy otrzyma fragment danych odpowiedzi. Pamiętaj, że dane odpowiedzi nie muszą być odbierane w całości od razu. Dane mogą być odbierane w porcjach o dowolnej długości.

3. Dodaj wtyczki do sekwencji wtyczek

W ramach tego przykładu dodamy wtyczki do sekwencji wtyczek w pliku konfiguracyjnym Edge Microgateway (~./edgemicro/config.yaml) w następujący sposób. Sekwencja jest ważna. Określa kolejność wykonywania modułów obsługi wtyczek.

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

4. Sprawdzanie wyników debugowania

Przyjrzyjmy się teraz danym wyjściowym generowanym po wywołaniu tych wtyczek. Oto kilka ważnych kwestii:

  • Sekwencja wtyczek w pliku konfiguracyjnym Edge Microgateway (~./edgemicro/config.yaml) określa kolejność wywoływania modułów obsługi zdarzeń.
  • Moduły obsługi żądań są wywoływane w kolejności rosnącej (w kolejności, w jakiej pojawiają się w sekwencji wtyczek – 1, 2, 3).
  • Moduły obsługi odpowiedzi są wywoływane w kolejności malejącej – od 3, 2, 1.
  • Moduł obsługi ondata_response jest wywoływany raz na każdy przychodzący fragment danych. W tym przykładzie (dane wyjściowe widoczne poniżej) odbierane są 2 fragmenty.

Oto przykładowe dane wyjściowe debugowania wyświetlane, gdy te 3 wtyczki są używane, a żądanie jest wysyłane przez Edge Microgateway. Zwróć uwagę na kolejność ich wywoływania:

  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

Zrozumienie kolejności wywoływania modułów obsługi wtyczek jest bardzo ważne, gdy próbujesz zaimplementować niestandardowe funkcje wtyczki, takie jak zbieranie i przekształcanie danych żądań lub odpowiedzi.

Pamiętaj tylko, że moduły obsługi żądań są wykonywane w kolejności określonej w pliku konfiguracyjnym Edge Microgateway, a moduły obsługi odpowiedzi – w odwrotnej kolejności.

Informacje o używaniu zmiennych globalnych we wtyczkach

Każde żądanie wysyłane do Edge Microgateway jest wysyłane do tej samej instancji wtyczki, dlatego drugie żądanie z innego klienta zastąpi pierwsze. Jedynym bezpiecznym miejscem do zapisywania stanu wtyczki jest przechowywanie stanu w usłudze w obiekcie żądania lub odpowiedzi (który czas życia jest ograniczony do czasu żądania).

Przepisywanie docelowych adresów URL we wtyczkach

Dodano w wersji 2.3.3

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

Dodano w wersji 2.4.x

Możesz też zastąpić port docelowego punktu końcowego i wybrać HTTP lub HTTPS. Zmodyfikuj te zmienne w kodzie wtyczki: req.targetPort i req.targetSecure. Aby wybrać protokół HTTPS, ustaw req.targetSecure na wartość true, a w przypadku HTTP ustaw na false. Jeśli ustawisz req.targetSecure na wartość true, przeczytaj ten wątek dyskusji, aby uzyskać więcej informacji.

Przykładowa wtyczka o nazwie eurekaclient została dodana do Edge Microgateway. Ta wtyczka 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ą Eureka jako katalogu punktów końcowych usługi.


Przykładowe wtyczki

Te wtyczki są dostarczane z instalacją Edge Microgateway. Znajdziesz je w instalacji Edge Microgateway tutaj:

[prefix]/lib/node_modules/edgemicro/plugins

gdzie [prefix] to katalog prefiksu npm zgodnie z opisem w sekcji „Gdzie jest zainstalowana przeglądarka Edge Microgateway” w artykule Instalowanie Edge Microgateway.

żądanie skumulowania

Ta wtyczka gromadzi fragmenty danych od klienta do właściwości tablicy dołączonej do obiektu żądania. Po otrzymaniu wszystkich danych żądania tablica jest łączona do bufora, który jest następnie przekazywany do następnej wtyczki w sekwencji. Powinna ona być pierwszą wtyczką w sekwencji, aby kolejne wtyczki mogły otrzymywać zgromadzone dane żą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);

    }

  };

}

kumuluj-odpowiedź

Ta wtyczka gromadzi fragmenty danych z miejsca docelowego do właściwości tablicy dołączonej do obiektu odpowiedzi. Po otrzymaniu wszystkich danych odpowiedzi tablica jest łączona do bufora, który jest następnie przekazywany do następnej wtyczki w sekwencji. Ta wtyczka działa na odpowiedziach przetwarzanych w odwrotnej kolejności, dlatego musisz umieścić ją jako ostatnią wtyczkę w sekwencji.

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 „header-uppercase”

Dystrybucja Edge Microgateway zawiera przykładową wtyczkę o nazwie <microgateway-root-dir>/plugins/header-uppercase. Przykład zawiera komentarze opisujące każdy moduł obsługi funkcji. W tym przykładzie przeprowadzamy proste przekształcenie danych docelowej odpowiedzi oraz dodaje niestandardowe nagłówki do żądania klienta i odpowiedzi docelowej.

Oto kod źródłowy witryny <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łcaj wielkie litery

Jest to ogólna wtyczka do przekształcania, którą można modyfikować pod kątem dowolnego rodzaju przekształcenia. W tym przykładzie po prostu przekształcamy odpowiedź i dane żądań, używając wielkich liter.

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

  };

}