Özel eklentiler geliştirme

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

Edge Microgateway v. 3.2.x

Kitle

Bu konu, özel eklentiler yazarak Edge Microgateway özelliklerini geliştirmek isteyen geliştiriciler için hazırlanmıştır. Yeni bir eklenti yazmak istiyorsanız JavaScript ve Node.js konusunda deneyim sahibi olmanız gerekir.

Özel Edge Mikro Geçit eklentisi nedir?

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

Özel eklentiler yazarak mikro ağ geçidine yeni özellikler ve imkanlar ekleyebilirsiniz. Varsayılan olarak Edge Microgateway, hedef hizmetlere ve hedef hizmetlerden 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?

Edge Microgateway kurulumunun parçası olarak özel eklentilere ait bir klasör eklenir:

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

Burada [prefix], Uç Ağ Geçidini 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? bölümünü inceleyin.

Önceden tanımlanmış eklentileri inceleme

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

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

Burada [prefix], npm ön ek dizinidir. 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 Mikro Ağ Geçidi ile sağlanan önceden tanımlanmış eklentiler başlıklı makaleye de göz atın.

Basit bir eklenti yazın

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

  1. Edge Mikro Ağ Geçidi çalışıyorsa hemen durdurun:
    edgemicro stop
    
  2. Özel eklenti dizinine cd ekleyin:

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

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

  3. Yanıt-geçersiz kılma adlı yeni bir eklenti projesi oluşturun ve bu proje için cd 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 birden fazla 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");
        }
      };
    }
    
    içinde geçersiz kılınsa da geçersiz kılınmasa da varsayılan olarak yanıta aktarılır.
  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 Mikro Ağ Geçidi'ni yeniden başlatın.
  10. Edge Mikro Ağ Geçidi üzerinden bir API çağırın. (Bu API çağrısı, Edge Microgateway'i kurma ve yapılandırma 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 şablon 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.
  • Eklentiler, init() işlevini dışa aktarmalıdır.
  • 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.

Olay 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. Belirli bir işlev isteğe bağlıdır ve tipik bir eklenti, bu işlevlerin en az bir alt kümesini uygular.

İstek akışı etkinlik işleyicileri

Bu işlevler, Edge Mikro Ağ Geçidi'nde istek etkinliklerinde çağrılır.

  • onrequest
  • ondata_request
  • onend_request
  • onclose_request
  • onerror_request

onrequest işlevi

İstemci isteğinin başlangıcı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. Doğru bir ilk bağımsız değişkenle çağrı yaparsanız (Hata örneği gibi) istek işleme 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 alanı, istek verilerinin hedefe gönderilmeden önce dönüştürülmesidir.

Ö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

Tüm istek verileri istemciden 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. İstemci ile 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 Mikro Ağ Geçidi'ndeki 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

Hedeften tüm yanıt verileri 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. Hedef bağlantının güvenilir olmadığı durumlarda bu işlevi kullanabilirsiniz. Hedefe yönelik 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 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.

  • init() işlev işleyicilerinin her biri (ondata_request, ondata_response vb.) işleme tamamlandığında next() geri çağırmasını çağırmalıdır. next() çağrısı yapmazsanız işleme durdurulur ve istek askıya alınır.
  • next() işlevinin ilk bağımsız değişkeni, istek işlemenin sonlandırılmasına 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ürülmek için yeterli veriye sahip değilse bu bağımsız değişken boş olabilir.
  • Tüm istek ve yanıtların hizmet vermesi 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 mülke kaydedebilir. Bu nesne ömrü, API çağrısının süresi kadardır.
  • 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.
  • Bellek sızıntılarına yol açmamaya dikkat edin. Bu durum, Edge Mikro Ağ Geçidi'nin genel performansını etkileyebilir ve bellek bitmesi durumunda kilitlenmesine neden olabilir.
  • Edge Mikro Ağ Geçidi'nin performansını olumsuz yönde etkileyebileceği için ana iş parçacığında yoğun işlem gerektiren görevler gerçekleştirmeden Node.js modelini uygulamaya 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 şu ş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 örnekte, eklentinin hata ayıklama çıkışında foo hatası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, init işlevindeki bu yapılandırma verilerine aşağıdaki şekilde erişebilirsiniz:

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

Aşağıda, emgConfigs verilerini içeren bir örnek 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 kaydedicisi. Şu anda kullanılan günlük kaydedici 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 isteklerinin 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, veri içeriyorsa (ör. 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 olması durumunda çağrılır ve dilerseniz hataları özel bir kodla ele almanıza olanak tanır.

İstekte veri gönderildiğini ve ondata_request() ç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. Bu bilgileri, daha sonra zincirde yer alan sonraki bir işlevde işleyebilirsiniz. Bu değeri hatalı bir bağımsız değişken olan null olarak ayarlayarak herhangi bir hata olmadığını ve istek işlemenin normal bir şekilde devam etmesi 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. Ek işlem yapmazsanız istek verileri, API'nin hedefine değişmeden aktarılır. Bununla birlikte, bu yöntem içindeki istek verilerini değiştirebilir ve değiştirilen isteği hedefe aktarabilirsiniz. Örneğin, istek verileri XML ise ve hedef JSON bekliyorsa ondata_request() yöntemine kod ekleyebilirsiniz. Bu kod, (a) istediğiniz şekilde istek başlığının Content-Type değerini application/json olarak değiştirir ve istek verilerini JSON'a dönüştürür. Örneğin, NPM'den alınan bir 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 iletilmeden ö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, yanıt işleyicilerin ise 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. Üç tane basit eklenti oluşturun

Aşağıdaki eklentiyi kullanmayı düşünün. Tek yaptığı, etkinlik işleyicileri çağrıldığında yazdırma konsolu çıkışıdır:

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 (hariç console.log() ifadelerini sırasıyla plugin-2 ve plugin-3 olarak değiştirin).

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_yanıt işleyiciye göz atın. Yanıt verileri kümesi her alındığında çağrılır. Bilinmesi gereken önemli nokta, yanıt verilerinin aynı anda alınmadığıdır. Aksine, veriler rastgele uzunlukta parçalar halinde alınabilir.

3. Eklentileri eklenti sırasına ekleyin

Bu örnekten devam edersek 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 çıkışını inceleme

Şimdi de bu eklentiler çağrıldığında oluşturulacak çıkışa göz atalı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 (eklenti sırasında göründükleri sıra: 1, 2, 3) çağrılır.
  • 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ılırken ve Edge Microgateway üzerinden bir istek gönderildiğinde üretilen hata ayıklama çıkışı örneğini görebilirsiniz. İşleyicilerin çağrılma sırasına 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, Edge Microgateway yapılandırma dosyasında eklentilerin belirtildiği sırada ve 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 isteğin durumu, ilkinin üzerine yazılır. Eklenti durumunu kaydedebileceğiniz tek güvenli yer, durumun istek veya yanıt nesnesindeki bir mülkte depolanmasıdır (bunun kullanım ömrü, isteğin kullanım ömrüyle sınırlıdır).

Eklentilerde hedef URL'leri yeniden yazma

Eklendiği sürüm: 2.3.3 sürümü

Eklenti kodunuzdaki 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 alanını true, HTTP için ise false olarak ayarlayın. req.targetSecure ayarını true olarak ayarlarsanız daha fazla bilgi için bu tartışma dizisini inceleyin.

Edge Mikro Ağ Geçidi'ne eurekaclient adlı örnek bir eklenti eklendi. Bu eklenti, req.targetPort ve req.targetSecure değişkenlerinin nasıl kullanılacağını gösterirken Edge Microgateway'in Eureka'yı hizmet uç noktası kataloğu olarak kullanarak nasıl dinamik uç nokta araması yapabileceğini gösterir.


Örnek eklentiler

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

[prefix]/lib/node_modules/edgemicro/plugins

Burada [prefix], Uç Ağ Geçidini 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 özelliği olarak toplar. Tüm istek verileri alındığında dizi bir Tampon’da birleştirilir ve daha sonra sıradaki bir sonraki eklentiye aktarılır. Bu eklenti, sıradaki eklentilerin biriken istek verilerini alabilmesi için 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);

    }

  };

}

toplama-yanıt

Bu eklenti, hedefteki veri parçalarını toplayarak yanıt nesnesine ekli bir dizi özelliği oluşturur. Tüm yanıt verileri alındığında dizi bir Tampon’da birleştirilir ve daha sonra, sıradaki bir sonraki eklentiye aktarılır. Bu eklenti ters sırayla işlenen yanıtlar üzerinde çalıştığından, sıradaki son eklenti olarak konumlandırmanız 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);
    }

  };

}

büyük harfli başlık eklentisi

Edge Microgateway dağıtımları, <microgateway-root-dir>/plugins/header-uppercase adlı örnek bir eklenti içerir. Örnek, işlev işleyicilerin her birini açıklayan yorumlar içerir. Bu örnek, hedef yanıtın basit bir veri dönüştürme işlemini gerçekleştirir ve istemci isteği ile hedef yanıta özel başlıklar 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 harf dönüştür

Bu, istediğiniz türde bir dönüştürme yapmak için değişiklik yapabileceğiniz genel bir dönüştürme eklentisidir. Bu örnek sadece yanıtı dönüştürür ve istek verilerini büyük harfe dönüştürür.

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

  };

}