Özel eklentiler geliştirme

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
bilgi

Edge Microgateway v. 3.3.x

Kitle

Bu konu, özel eklentiler yazarak Edge Microgateway özelliklerini genişletmek isteyen geliştiriciler için hazırlanmıştır. Yeni bir eklenti yazmak istiyorsanız JavaScript ve Node.js deneyiminiz olmalıdır.

Özel Edge Microgateway eklentisi nedir?

Eklenti, Edge Mikro Ağ Geçidi'ne işlev ekleyen bir Node.js modülüdür. Eklenti modülleri tutarlı bir şablonu izler ve Edge Microgateway tarafından bilinen bir konumda depolanır. Böylece, otomatik olarak keşfedilip çalıştırılabilir. Edge Microgateway'i yüklediğinizde önceden tanımlanmış çeşitli eklentiler sağlanır. Bunlar arasında kimlik doğrulama, artış durdurma, kota ve analiz eklentileri yer alır. Bu mevcut eklentiler, Eklentileri kullanma bölümünde açıklanmıştır.

Özel eklentiler yazarak mikro ağ geçidine yeni özellikler ve işlevler ekleyebilirsiniz. Varsayılan olarak Edge Microgateway, temel olarak hedef hizmetlere ve alınan istek ve yanıtları değişmeden geçiren güvenli bir geçiş proxy'sidir. Özel eklentiler sayesinde, mikro ağ geçidinden geçen istek ve yanıtlarla programlı bir şekilde etkileşim kurabilirsiniz.

Özel eklenti kodu nereye yerleştirilmelidir?

Özel eklentiler için bir klasör, aşağıdaki Edge Microgateway yüklemesinin bir parçası olarak eklenir:

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

Burada [prefix], Uç Microgateway Yükleme bölümündeki "Edge Microgateway nerede yüklü" bölümünde açıklandığı gibi npm ön ek dizinidir.

Bu varsayılan eklenti dizinini değiştirebilirsiniz. Eklentileri nerede bulabilirim? konusuna bakın.

Önceden tanımlanmış eklentileri inceleme

Kendi eklentinizi geliştirmeyi denemeden önce, önceden tanımlanmış eklentilerin hiçbirinin gereksinimlerinizi karşılayıp karşılamadığını kontrol etmenizde fayda vardır. Bu eklentiler şu konumdadır:

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

burada [prefix], npm önekidir. Ayrıca Edge Microgateway'i Yükleme bölümündeki "Edge Microgateway nereye kurulu?" konusuna da bakın.

Ayrıntılar için, Edge Microgateway ile birlikte sağlanan önceden tanımlanmış eklentiler sayfasına da bakın.

Basit bir eklenti yazın

Bu bölümde, basit bir eklenti oluşturmak için gereken adımları anlatacağız. Bu eklenti, yanıt verilerini "Hello, World!" dizesiyle geçersiz kılar ve verileri terminale yazdırır.

  1. Edge Microgateway çalışıyorsa hemen durdurun:
    edgemicro stop
    
  2. Özel eklenti dizinine cd:

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

    Burada [prefix], Uç Microgateway Yükleme bölümündeki "Edge Microgateway nerede yüklü" bölümünde açıklandığı gibi npm ön ek dizinidir.

  3. Response-override ve cd adında yeni bir eklenti projesi oluşturun:
    mkdir response-override && cd response-override
    
  4. Yeni bir Node.js projesi oluşturun:
    npm init
    
    Varsayılanları kabul etmek için Return tuşuna birkaç kez basın.
  5. index.js adında yeni bir dosya oluşturmak için metin düzenleyici kullanın.
  6. Aşağıdaki kodu index.js klasörüne kopyalayıp dosyayı kaydedin.
    '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. Bir eklenti oluşturdunuz ve bu eklentiyi Edge Microgateway yapılandırmasına eklemeniz gerekiyor. $HOME/.edgemicro/[org]-[env]-config.yaml dosyasını açın. Burada org ve env, Edge kuruluş ve ortam adlarınızdır.
  8. response-override eklentisini aşağıda gösterildiği gibi plugins:sequence öğesine ekleyin.
          ...
          
          plugins:
            dir: ../plugins
            sequence:
              - oauth
              - response-override
              
          ...
    
  9. Edge Microgateway'i yeniden başlatın.
  10. Edge Microgateway aracılığıyla bir API çağırın. (Bu API çağrısı, Edge Microgateway kurulumu ve yapılandırılması bölümünde açıklandığı gibi, API anahtarı güvenliği eğitimiyle aynı yapılandırmayı ayarladığınız varsayılır:
    curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo
    Hello, World!
    

Eklentinin anatomisi

Aşağıdaki Edge Microgateway örnek eklentisinde kendi eklentilerinizi geliştirirken izlemeniz gereken kalıp gösterilmektedir. Bu bölümde açıklanan örnek eklentinin kaynak kodu plugins/header-uppercase/index.js. içindedir.

  • Eklentiler, kök klasörde package.json ve index.js bulunan standart NPM modülleridir.
  • Eklentilerin init() işlevini dışa aktarması gerekir.
  • init() işlevi üç bağımsız değişken alır: config, logger ve stats. Bu bağımsız değişkenler, Eklenti init() işlevi bağımsız değişkenlerinde açıklanmıştır.
  • init(), bir isteğin kullanım süresi boyunca belirli etkinlikler gerçekleştiğinde çağrılan, adlandırılmış işlev işleyicilere sahip bir nesne döndürür.

Etkinlik işleyici işlevleri

Bir eklenti bu etkinlik işleyici işlevlerinden bazılarını veya tümünü uygulamalıdır. Bu işlevlerin uygulanması size bağlıdır. Herhangi bir işlev isteğe bağlıdır ve tipik bir eklenti, bu işlevlerin en azından bir alt kümesini uygular.

İstek akışı etkinlik işleyicileri

Bu işlevler, Edge Microgateway'de istek etkinliklerinde çağrılır.

  • onrequest
  • ondata_request
  • onend_request
  • onclose_request
  • onerror_request

onrequest işlevi

İstemci isteğinin başında çağrılır. Bu işlev, isteğin ilk baytı Edge Microgateway tarafından alındığında tetiklenir. Bu işlev; istek başlıklarına, URL'ye, sorgu parametrelerine ve HTTP yöntemine erişmenizi sağlar. Sonrakini doğru bir ilk bağımsız değişkenle (Hata örneği gibi) çağırırsanız isteğin işlenmesi durur ve hedef istek başlatılmaz.

Örnek:

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

ondata_request işlevi

İstemciden bir veri parçası alındığında çağrılır. İstek verilerini, eklenti sırasında bir sonraki eklentiye iletir. Dizideki son eklentiden döndürülen değer hedefe gönderilir. Aşağıda gösterilen tipik bir kullanım, istek verilerini hedefe göndermeden önce dönüştürmektir.

Örnek:

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

onend_request işlevi

İstemciden tüm istek verileri alındığında çağrılır.

Örnek:

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

onclose_request işlevi

İstemci bağlantısının kapatıldığını belirtir. Bu işlevi, istemci bağlantısının güvenilir olmadığı durumlarda kullanabilirsiniz. İstemciyle olan yuva bağlantısı kapatıldığında çağrılır.

Örnek:

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

onerror_request işlevi

İstemci isteği alınırken hata oluşursa çağrılır.

Örnek:

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

Yanıt akışı etkinlik işleyicileri

Bu işlevler, Edge Microgateway'deki yanıt etkinliklerinde çağrılır.

  • onresponse
  • ondata_response
  • onend_response
  • onclose_response
  • onerror_response

onresponse işlevi

Hedef yanıtın başında çağrılır. Bu işlev, yanıtın ilk baytı Edge Microgateway tarafından alındığında tetiklenir. Bu işlev, yanıt başlıklarına ve durum koduna erişmenizi sağlar.

Örnek:

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 işlevi

Hedeften bir veri parçası alındığında çağrılır.

Örnek:

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


onend_response işlevi

Tüm yanıt verileri hedeften alındığında çağrılır.

Örnek:

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

onclose_response işlevi

Hedef bağlantının kapatıldığını gösterir. Bu işlevi, hedef bağlantının güvenilir olmadığı durumlarda kullanabilirsiniz. Hedefe olan yuva bağlantısı kapatıldığında çağrılır.

Örnek:

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


onerror_response işlevi

Hedef yanıt alınırken bir hata oluşursa çağrılır.

Örnek:

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

Eklenti etkinlik işleyici işlevleri hakkında bilmeniz gerekenler

Eklenti etkinlik işleyici işlevleri, Edge Microgateway belirli bir API isteğini işlerken gerçekleşen belirli etkinliklere yanıt olarak çağrılır.

  • İşleme tamamlandığında init() işlev işleyicilerinin (ondata_request, ondata_response vb.) her biri next() geri çağırmasını çağırmalıdır. next() çağrısı yapmazsanız işleme durur ve istek askıya alınır.
  • next() işlevinin ilk bağımsız değişkeni, istek işlemenin sona ermesine neden olan bir hata olabilir.
  • ondata_ ve onend_ işleyicileri, hedefe veya istemciye iletilecek verileri içeren ikinci bir bağımsız değişkenle birlikte next() işlevini çağırmalıdır. Eklenti arabelleğe alınıyorsa ve şu anda dönüştürmek için yeterli veriye sahip değilse bu bağımsız değişken boş olabilir.
  • Tüm istek ve yanıtların hizmet vermek için eklentinin tek bir örneğinin kullanıldığını unutmayın. Bir eklenti çağrılar arasında istek başına durumunu korumak isterse bu durumu, sağlanan request nesnesine (req) eklenen bir özelliğe kaydedebilir. Bu nesneye, kullanım ömrü API çağrısının süresi kadar devam eder.
  • Tüm hataları yakalamaya ve hatayla next() çağrısı yapmaya dikkat edin. next() çağrısının yapılmaması API çağrısının askıya alınmasına neden olur.
  • Edge Microgateway'in genel performansını etkileyebileceği ve bellek tükenirse kilitlenmesine neden olabileceği için bellek sızıntılarına yol açmamaya dikkat edin.
  • Edge Mikro Ağ Geçidi'nin performansını olumsuz etkileyebileceğinden, ana iş parçacığında işlem odaklı görevler gerçekleştirmeyerek Node.js modeline uymaya dikkat edin.

Eklenti init() işlevi hakkında

Bu bölümde init() işlevine iletilen bağımsız değişkenler açıklanmaktadır: config, logger ve stats.

config

Edge Microgateway yapılandırma dosyasının Apigee Edge'den indirilen verilerle birleştirilmesiyle elde edilen yapılandırma verileri, config adlı bir nesneye yerleştirilir.

Yanıt-geçersiz kılma adlı bir eklentiye foo değerine sahip param adlı bir config parametresi eklemek için bunu default.yaml dosyasına yerleştirin:

response-override:
    param: foo

Ardından, eklenti kodunuzdaki parametreye aşağıdaki şekilde erişebilirsiniz:

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

Bu durumda, eklenti hata ayıklama çıkışında foo çıktısını görürsünüz:

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

Birleştirilmiş mikro ağ geçidi yapılandırmasına ve indirilen Apigee Edge verilerine config.emgConfigs alt nesnesinden erişebilirsiniz. Örneğin, bu yapılandırma verilerine init işlevindeki şu şekilde erişebilirsiniz:

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

Aşağıda, emgConfigs içeren bir veri örneği verilmiştir:

{
    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

Sistem günlük kaydı. Şu anda kullanılan günlük kaydı aracı bu işlevleri dışa aktarır. Bu işlevde nesne bir dize, HTTP isteği, HTTP yanıtı veya Hata örneği olabilir.

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

stats

Bir mikro ağ geçidi örneğinden geçen istek ve yanıtlarla ilgili istek, yanıt, hata ve diğer toplu istatistiklerin sayısını barındıran bir nesnedir.

  • treqErrors - Hatalı hedef isteklerin sayısı.
  • treqErrors - Hatalı hedef yanıtların sayısı.
  • statusCodes - Yanıt kodu sayılarını içeren bir nesne:
{
  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: Toplam istek sayısı.
  • Yanıtlar: Toplam yanıt sayısı.
  • bağlantılar: Etkin hedef bağlantıların sayısı.

Next() işlevi hakkında

Serideki bir sonraki yöntemi işlemeye devam etmek için tüm eklenti yöntemlerinin next() yöntemini çağırması gerekir (aksi takdirde eklenti işlemi askıya alınır). İstek yaşam döngüsünde çağrılan ilk yöntem onrequest(). Çağrılacak bir sonraki yöntem ondata_request() yöntemidir. Ancak ondata_request, yalnızca istek, POST isteği gibi veri içeriyorsa çağrılır. Bir sonraki yöntem, isteğin işlenmesi tamamlandığında çağrılan onend_request() yöntemidir. onerror_* işlevleri yalnızca hata durumunda çağrılır ve dilerseniz hataları özel bir kodla ele almanıza olanak tanır.

İstekte verilerin gönderildiğini ve ondata_request() öğesinin çağrıldığını varsayalım. İşlevin iki parametreyle next() çağrısı yaptığına dikkat edin:

next(null, data);

Kural olarak, ilk parametre hata bilgilerini aktarmak için kullanılır. Daha sonra bu parametreyi, zincirde sonraki bir işlevde işleyebilirsiniz. Bunu hatalı bir bağımsız değişken olan null olarak ayarladığınızda herhangi bir hata olmadığını ve isteğin normal bir şekilde işlenmesi gerektiğini belirtiriz. Bu bağımsız değişken doğruysa (Hata nesnesi gibi) istek işleme durur ve istek hedefe gönderilir.

İkinci parametre, istek verilerini zincirde bir sonraki işleve iletir. Başka bir işlem yapmazsanız istek verileri, API'nin hedefine değişmeden iletilir. Bununla birlikte, hem bu yöntemdeki istek verilerini değiştirme hem de değiştirilen isteği hedefe aktarma şansınız vardır. Örneğin, istek verileri XML ise ve hedef JSON bekliyorsa ondata_request() yöntemine kod ekleyebilirsiniz. Bu sayede (a) istediğiniz yöntemi kullanarak istek başlığının Content-Type değerini application/json olarak değiştirip istek verilerini JSON'a dönüştürebilirsiniz (örneğin, NPM'den aldığınız Node.js xml2json dönüştürücüsünü kullanabilirsiniz).

Nasıl görüneceğine bakalım:

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

Bu durumda, istek verileri (XML olduğu varsayılır) JSON'a dönüştürülür ve dönüştürülen veriler arka uç hedefine geçirilmeden önce next() aracılığıyla istek zincirindeki bir sonraki işleve geçirilir.

Dönüştürülen verileri hata ayıklama amacıyla yazdırmak için başka bir hata ayıklama ifadesi ekleyebileceğinizi unutmayın. Örneğin:

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

Eklenti işleyici yürütme sırası hakkında

Edge Microgateway için eklenti yazıyorsanız eklenti etkinlik işleyicilerinin yürütülme sırasını anlamanız gerekir.

Unutulmaması gereken önemli bir nokta, Edge Microgateway yapılandırma dosyasında bir eklenti sırası belirttiğinizde istek işleyicilerin artan sırada yürütülürken yanıt işleyicilerin azalan sırada yürütülmesidir.

Aşağıdaki örnek, bu yürütme sırasını anlamanıza yardımcı olmak için tasarlanmıştır.

1. Üç basit eklenti oluşturun

Aşağıdaki eklentiyi inceleyin. Yalnızca etkinlik işleyicileri çağrıldığında yazdırma konsolu çıkışı olur:

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

Şimdi, aynı kodla iki eklenti daha (plugin-2 ve plugin-3) oluşturmayı düşünün (console.log() ifadelerini sırasıyla plugin-2 ve plugin-3 olarak değiştirmek hariç).

2. Eklenti kodunu inceleyin

<microgateway-root-dir>/plugins/plugin-1/index.js içindeki dışa aktarılan eklenti işlevleri, istek ve yanıt işleme sırasında belirli zamanlarda yürütülen etkinlik işleyicilerdir. Örneğin, onrequest, alınan istek üst bilgilerinin ilk baytını yürütür. Bununla birlikte onend_response, yanıt verilerinin son baytı alındıktan sonra yürütülür.

Ondata_response işleyicisine göz atın. Bir yanıt verisi yığını her alındığında bu işleyici çağrılır. Bilinmesi gereken önemli nokta, yanıt verilerinin aynı anda alınmadığıdır. Bunun yerine, veriler rastgele uzunlukta parçalar halinde alınabilir.

3. Eklentileri eklenti sırasına ekleyin

Bu örnekten devam ettiğimizde eklentileri, Edge Microgateway yapılandırma dosyasındaki (~./edgemicro/config.yaml) eklenti sırasına aşağıdaki gibi ekleyeceğiz. Sıra önemlidir. Eklenti işleyicilerinin yürütülme sırasını tanımlar.

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

4. Hata ayıklama çıktısını inceleme

Şimdi, bu eklentiler çağrıldığında oluşturulacak çıkışa bakalım. Dikkat edilmesi gereken birkaç önemli nokta vardır:

  • Edge Microgateway yapılandırma dosyasının (~./edgemicro/config.yaml) eklenti sırası, etkinlik işleyicilerin çağrılma sırasını belirtir.
  • İstek işleyicileri artan düzende çağrılır (eklenti sırasında görünme sırası: 1, 2, 3).
  • Yanıt işleyicileri azalan düzende çağrılır: 3, 2, 1.
  • ondata_response işleyici, gelen her veri parçası için bir kez çağrılır. Bu örnekte (çıktı aşağıda gösterilmiştir) iki parça alınmıştır.

Aşağıda, bu üç eklenti kullanımdayken ve Edge Microgateway üzerinden bir istek gönderildiğinde üretilen örnek hata ayıklama çıkışını görebilirsiniz. İşleyicilerin çağrıldığı sıraya dikkat edin:

  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

Özet

İstek veya yanıt verilerinin toplanması ve dönüştürülmesi gibi özel eklenti işlevleri uygulamaya çalışırken eklenti işleyicilerinin çağrılma sırasını anlamak çok önemlidir.

Ancak istek işleyicilerin, eklentilerin Edge Microgateway yapılandırma dosyasında belirtildiği sırada, yanıt işleyicilerin ise ters sırada yürütüldüğünü unutmayın.

Eklentilerde genel değişkenleri kullanma hakkında

Edge Microgateway'e yapılan her istek bir eklentinin aynı örneğine gönderilir. Bu nedenle, başka bir istemciden gelen ikinci bir isteğin durumu ilkin üzerine yazılır. Eklenti durumunu kaydetmenin tek güvenli yolu, istek veya yanıt nesnesindeki durumun bir mülkte depolanmasıdır (bunun kullanım ömrü isteğinle sınırlıdır).

Eklentilerde hedef URL'leri yeniden yazma

Eklendiği sürüm: v2.3.3

Eklenti kodunuzda req.targetHostname ve req.targetPath değişkenlerini değiştirerek bir eklentideki varsayılan hedef URL'yi dinamik bir şekilde geçersiz kılabilirsiniz.

Eklendiği sürüm: v2.4.x

Ayrıca, hedef uç nokta bağlantı noktasını geçersiz kılabilir ve HTTP ile HTTPS arasında seçim yapabilirsiniz. Eklenti kodunuzda şu değişkenleri değiştirin: req.targetPort ve req.targetSecure. HTTPS'yi seçmek için req.targetSecure'u true, HTTP için de false olarak ayarlayın. req.targetSecure politikasını true olarak ayarlarsanız daha fazla bilgi için bu tartışma dizisini inceleyin.

Kaldırıldı: v3.3.3

eurekaclient adlı örnek eklenti, v.3.3.3 sürümünde Edge Microgateway'den kaldırıldı. Sürüm notları başlıklı makaleyi inceleyin.

Bu özelliğin kaldırılması, Edge mikro ağ geçidinin temel işlevini veya hedef URL'lerin yeniden yazılmasını etkilemez. Dinamik uç nokta aramasını yapılandırabilir ve eklenti düzeyinde req.targetHostname, req.targetPath, req.targetPort ve req.targetSecure gibi hedef değişkenlerini geçersiz kılabilirsiniz. Eklentilerde hedef URL'leri yeniden yazma konusuna bakın.


Örnek eklentiler

Bu eklentiler, Edge Microgateway yüklemenizle sağlanır. Bunları şu adresteki Edge Microgateway kurulumunda bulabilirsiniz:

[prefix]/lib/node_modules/edgemicro/plugins

Burada [prefix], Uç Microgateway Yükleme bölümündeki "Edge Microgateway nerede yüklü" bölümünde açıklandığı gibi npm ön ek dizinidir.

biriktirme-isteği

Bu eklenti, istemcideki veri parçalarını istek nesnesine ekli bir dizi mülküne toplar. Tüm istek verileri alındığında, dizi bir arabellekte birleştirilir ve daha sonra, dizideki bir sonraki eklentiye aktarılır. Sıradaki eklentilerin toplanan istek verilerini alabilmesi için bu eklenti sıradaki ilk eklenti olmalıdır.

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

    }

  };

}

birikmiş-yanıt

Bu eklenti, hedefteki veri parçalarını toplayarak yanıt nesnesine ekli bir dizi özelliğine ekler. Tüm yanıt verileri alındığında, dizi bir arabellekte birleştirilir ve daha sonra, dizideki bir sonraki eklentiye aktarılır. Bu eklenti, ters sırada işlenen yanıtlar üzerinde çalıştığından, eklentiyi sıradaki son eklenti olarak yerleştirmeniz gerekir.

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

  };

}

üstbilgi-büyük harf eklentisi

Edge Microgateway dağıtımları, <microgateway-root-dir>/plugins/header-uppercase adlı örnek bir eklenti içerir. Örnek, işlev işleyicilerinin her birini açıklayan yorumlar içerir. Bu örnek, hedef yanıtın bazı basit veri dönüşümünü gerçekleştirir ve istemci isteği ile hedef yanıta özel üstbilgiler ekler.

<microgateway-root-dir>/plugins/header-uppercase/index.js için kaynak kodu şu şekildedir:

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

  };

}


büyük harfle dönüştür

Bu, ne tür bir dönüştürme gerçekleştirmek isterseniz değiştirebileceğiniz genel bir dönüştürme eklentisidir. Bu örnekte, yanıt ve istek verileri büyük harfli olacak şekilde dönüştürülmektedir.

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

  };

}