تطوير مكونات إضافية مخصصة

أنت تعرض مستندات Apigee Edge.
انتقل إلى مستندات Apigee X.
معلومات

Edge Microgateway الإصدار 3.3.x

الجمهور

هذا الموضوع مخصّص للمطوّرين الذين يريدون توسيع ميزات Edge Microgateway من خلال كتابة المكونات الإضافية المخصصة. إذا كنت ترغب في كتابة مكون إضافي جديد، فإن تجربة استخدام JavaScript وNode.js هي مطلوبة.

ما هو المكوِّن الإضافي المخصص لـ Edge Microgateway؟

المكون الإضافي هو وحدة Node.js تضيف وظائف إلى بوابة Edge Microgateway. وحدات المكونات الإضافية اتباع نمط ثابت ويتم تخزينها في مكان معروف ببوابة Edge Microgateway، مما يتيح ليتم اكتشافها وتشغيلها تلقائيًا. يتم توفير العديد من المكونات الإضافية المحددة مسبقًا عند تثبيت Edge Microgateway. وهذه تتضمن المكونات الإضافية للمصادقة وزيادة القبض والحصة "إحصاءات YouTube". يتم وصف هذه المكوّنات الإضافية الحالية في استخدام المكوّنات الإضافية.

يمكنك إضافة ميزات وإمكانات جديدة إلى البوابة المصغّرة من خلال كتابة المكونات الإضافية. وبشكل افتراضي، فإن Edge Microgateway عبارة عن خادم وكيل آمن للمرور يمرر الطلبات والردود بدون تغيير من وإلى الخدمات المستهدفة. باستخدام المكونات الإضافية المخصصة، يمكنك يتفاعل آليًا مع الطلبات والاستجابات التي تتدفق من خلال البوابة المصغّرة.

مكان وضع رمز المكون الإضافي المخصص

يتم تضمين مجلد للمكونات الإضافية المخصصة كجزء من تثبيت Edge Microgateway هنا:

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

حيث [prefix] هو دليل البادئة npm باعتباره الموضح في مقالة "أين يتم تثبيت Edge Microgateway" في Installing Edge مدخل مصغّر

يمكنك تغيير دليل المكونات الإضافية التلقائي هذا. الاطّلاع على مكان العثور على ما يلي: المكونات الإضافية.

مراجعة المكونات الإضافية المحددة مسبقًا

قبل أن تحاول تطوير المكون الإضافي الخاص بك، من الجيد التحقق من أنه لا يوجد تلبي المكونات الإضافية متطلباتك. توجد هذه المكوّنات الإضافية في:

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

حيث [prefix] هو دليل البادئة npm. عرض أيضًا "أين يتم تثبيت Edge Microgateway" في مقالة Installing Edge (تثبيت Edge) مدخل مصغّر

لمزيد من التفاصيل، راجع أيضًا محدّد مسبقًا المكونات الإضافية المتوفرة مع Edge Microgateway.

كتابة مكون إضافي بسيط

في هذا القسم، سنتعرف على الخطوات المطلوبة لإنشاء مكون إضافي بسيط. هذا المكون الإضافي بيانات الاستجابة (مهما كانت) بسلسلة "Hello, World!" وطباعته في الطرفية.

  1. إذا كانت ميزة Edge Microgateway قيد التشغيل، أوقِفها الآن:
    edgemicro stop
    
  2. cd إلى دليل المكونات الإضافية المخصص:

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

    حيث [prefix] هو دليل البادئة npm كما هو موضح في "أين يتم تثبيت Edge Microgateway" في Installing Edge مدخل مصغّر

  3. أنشئ مشروعًا جديدًا للمكوّن الإضافي باسم response-override وcd إليه:
    mkdir response-override && cd response-override
    
  4. إنشاء مشروع Node.js جديد:
    npm init
    
    انقر على "إرجاع" عدة مرات لقبول الإعدادات التلقائية.
  5. استخدِم محرِّر نصوص لإنشاء ملف جديد باسم index.js.
  6. انسخ الرمز التالي إلى index.js، واحفظ الملف.
    '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. لقد أنشأت الآن مكونًا إضافيًا، وتحتاج إلى إضافته إلى تهيئة Edge Microgateway. افتح الملف $HOME/.edgemicro/[org]-[env]-config.yaml، حيث يتم حفظ org env هي أسماء المؤسسة والبيئة في Edge.
  8. إضافة المكوّن الإضافي response-override إلى العنصر plugins:sequence كما هو موضح أدناه.
          ...
          
          plugins:
            dir: ../plugins
            sequence:
              - oauth
              - response-override
              
          ...
    
  9. أعِد تشغيل Edge Microgateway.
  10. يمكنك استدعاء واجهة برمجة تطبيقات من خلال Edge Microgateway. (ويفترض طلب بيانات من واجهة برمجة التطبيقات هذا أنك أجريت إعدادات على النحو الموضَّح في البرنامج التعليمي مع أمان مفتاح واجهة برمجة التطبيقات، كما هو موضّح في مقالة إعداد وإعداد Edge Microgateway:
    curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo
    Hello, World!
    

تركيب المكوّن الإضافي

يوضح نموذج المكوّن الإضافي Edge Microgateway التالي النمط الذي يجب اتباعه عند وتطوير المكونات الإضافية الخاصة بك. رمز المصدر لنموذج المكون الإضافي الذي تمت مناقشته في هذا القسم هو في plugins/header-uppercase/index.js.

  • المكوّنات الإضافية هي وحدتا NPM عادية مع package.json وindex.js في المجلد الجذر.
  • يجب أن يصدِّر المكوّن الإضافي الدالة init().
  • تستخدم الدالة init() ثلاث وسيطات: config، logger وstats. يتم وصف هذه الوسيطات في المكون الإضافي init().
  • تعرض init() كائنًا بمعالجات دوال مُسمّاة يتم استدعاؤها عند بعض الأحداث أثناء عمر الطلب.

دوال معالج الأحداث

يجب أن ينفذ المكوّن الإضافي بعض دوال معالج الأحداث هذه أو جميعها. تنفيذ هذه السياسات والدوال متروك لك. تكون أي دالة معينة اختيارية، وسيتم تنفيذ المكون الإضافي النموذجي على على الأقل مجموعة فرعية من هذه الدوال.

معالِجات أحداث مسار الطلب

يتم استدعاء هذه الدوال بناءً على أحداث الطلب في Edge Microgateway.

  • onrequest
  • ondata_request
  • onend_request
  • onclose_request
  • onerror_request

الوظيفة onrequest

يتم الاتصال في بداية طلب العميل. يتم تنشيط هذه الدالة عندما يتم تنشيط البايت الأول من استلام الطلب من خلال Edge Microgateway. تتيح لك هذه الدالة الوصول إلى عناوين الطلبات عنوان URL ومعلَمات طلب البحث وطريقة HTTP. إذا قمت باستدعاء بعد ذلك باستخدام وسيطة أولى صادقة (مثل حالة خطأ)، ثم تتوقف معالجة الطلب ولا يتم بدء طلب هدف.

مثال:

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

الوظيفة ondata_request

يتم استدعاء عندما يتم تلقي مجموعة من البيانات من العميل. تمرير البيانات إلى المرحلة التالية المكون الإضافي في تسلسل المكون الإضافي. يتم إرسال القيمة التي تم عرضها من المكون الإضافي الأخير في التسلسل إلى الهدف. وتتمثّل حالة الاستخدام النموذجية الموضّحة أدناه في تحويل بيانات الطلب قبل إرسالها. الهدف.

مثال:

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

الوظيفة onend_request

يتم استدعاء هذا الإجراء عند استلام جميع بيانات الطلب من العميل.

مثال:

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

دالة onclose_request

تشير إلى إغلاق اتصال العميل. يمكنك استخدام هذه الدالة في الحالات التي اتصال العميل غير موثوق به. ويتم استدعاؤه عندما يتم اتصال المقبس بالعميل مُغْلَق.

مثال:

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

دالة onerror_request

يتم الاتصال في حال حدوث خطأ أثناء تلقّي طلب العميل.

مثال:

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

معالِجات أحداث مسار الردّ

يتم استدعاء هذه الدوال في أحداث الاستجابة في Edge Microgateway.

  • onresponse
  • ondata_response
  • onend_response
  • onclose_response
  • onerror_response

دالة onresponse

يتم استدعاؤه في بداية الاستجابة المستهدفة. يتم تنشيط هذه الدالة عندما يتم تنشيط البايت الأول من تم استلام الرد بواسطة Edge Microgateway. تتيح لك هذه الدالة الوصول إلى عناوين الردود ورمز الحالة.

مثال:

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

يتم استدعاء هذه الدالة عند تلقي مجموعة من البيانات من الهدف.

مثال:

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


الدالة onend_response

يتم استدعاء هذا الإجراء عند استلام جميع بيانات الاستجابة من الهدف.

مثال:

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

دالة onclose_response

يشير إلى إغلاق الاتصال المستهدَف. يمكنك استخدام هذه الدالة في الحالات التي الاتصال المستهدف غير موثوق به. يتم استدعاؤه عندما يكون اتصال المقبس بالهدف مُغْلَق.

مثال:

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


الدالة onerror_response

يتم الاتصال في حال حدوث خطأ أثناء تلقّي الاستجابة المستهدفة.

مثال:

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

ما تحتاج إلى معرفته عن دوال معالج أحداث المكوّنات الإضافية

يتم استدعاء وظائف معالج حدث المكون الإضافي استجابةً لأحداث معينة تحدث أثناء تعالج Edge Microgateway طلب واجهة برمجة تطبيقات معينًا.

  • كل معالج من معالِجات الدوال init() (ondata_request، ondata_response، وغيرها) يجب أن تستدعي استدعاء next() عند الانتهاء قيد المعالجة. في حال عدم استدعاء next()، ستتوقف المعالجة وسيتم إرسال الطلب يتم تعليقها.
  • قد تكون الوسيطة الأولى إلى next() خطأ سيؤدي إلى إرسال الطلب المعالجة لإنهاء.
  • يجب أن تستدعي المعالِجات ondata_ وonend_. next() مع وسيطة ثانية تحتوي على البيانات التي سيتم تمريرها إلى الهدف أو العميل. يمكن أن تكون هذه الوسيطة فارغة إذا كان المكون الإضافي في حالة تخزين مؤقت ولا يتضمن بيانات كافية تتحول في الوقت الحالي.
  • تجدر الإشارة إلى أنّه يتم استخدام مثيل واحد من المكوّن الإضافي لمعالجة جميع الطلبات والاستجابات. إذا كان المكوّن الإضافي يرغب في الاحتفاظ بحالة الطلب لكل طلب بين الطلبات، يمكنه حفظ هذه الحالة في السمة إلى كائن request المقدّم (req)، الذي مدى الحياة هي مدة طلب بيانات من واجهة برمجة التطبيقات.
  • احرص على اكتشاف جميع الأخطاء واستدعاء next() مع الخطأ. تعذّر سيؤدي طلب next() إلى تعليق طلب البيانات من واجهة برمجة التطبيقات.
  • احرص على عدم تضمين تسرّبات الذاكرة لأنّ ذلك قد يؤثر في الأداء العام لجهاز Edge. تؤدي هذه الطريقة الصغيرة إلى تعطُّلها في حال نفاد الذاكرة.
  • كن حريصًا على اتباع نموذج Node.js من خلال عدم إجراء المهام الكثيفة الحوسبة في الجزء الرئيسي لأن ذلك قد يؤثر سلبًا في أداء Edge Microgateway.

حول دالة المكون الإضافي init()

يصف هذا القسم الوسيطات التي تم تمريرها إلى الدالة init(): config وlogger وstats.

config

بيانات التهيئة التي تم الحصول عليها عن طريق دمج ملف إعداد Edge Microgateway مع يتم وضع البيانات التي تم تنزيلها من Apigee Edge في كائن باسم: config.

لإضافة مَعلمة إعداد تُسمى param بقيمة foo إلى مكوّن إضافي يسمى response-override، ضَع هذا في قسم default.yaml الملف:

response-override:
    param: foo

بعد ذلك، يمكنك الوصول إلى المعلمة في رمز المكون الإضافي، كما يلي:

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

في هذه الحالة، ستظهر لك "foo" مطبوعة في إخراج تصحيح أخطاء المكوّن الإضافي:

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

إِنْتَ الوصول إلى إعدادات المدخل المصغّر المدمجة وتنزيل بيانات Apigee Edge من خلال العنصر الثانوي config.emgConfigs. على سبيل المثال: يمكنك الوصول إلى بيانات الإعداد هذه في الدالة init على النحو التالي:

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

في ما يلي مثال على البيانات التي تحتوي عليها السمة 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: []
  }

المسجّل

مسجّل النظام يصدِّر المسجِّل المستخدَم حاليًا هذه الدوال، حيث يمكن سلسلة أو طلب HTTP أو استجابة HTTP أو مثيل خطأ.

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

الإحصائيات

عنصر يحتوي على أعداد الطلبات والردود والأخطاء والإحصاءات المجمَّعة الأخرى المتعلقة بالطلبات والاستجابات التي تتدفق من خلال مثيل المدخل الدقيق.

  • treqErrors: عدد الطلبات المستهدفة التي تتضمّن أخطاءً.
  • treqErrors: عدد الردود المستهدفة التي تحتوي على أخطاء.
  • statusCodes - كائن يحتوي على عدد رموز الاستجابة:
{
  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: إجمالي عدد الطلبات
  • الردود: إجمالي عدد الردود
  • الاتصالات: عدد الاتصالات المستهدفة النشطة.

حول الدالة next()

يجب أن تستدعي جميع طرق المكوّنات الإضافية next() لمتابعة معالجة الطريقة التالية في السلسلة (أو تعلق عملية المكون الإضافي). في دورة حياة الطلب، الطريقة الأولى التي تسمى onrequest(). والطريقة التالية التي سيتم طلبها هي طريقة ondata_request()، وَلَكِنْ لا يتم استدعاء الدالة ondata_request إلا إذا كان الطلب يتضمن بيانات، كما في على سبيل المثال، طلب POST. ستكون الطريقة التالية التي تسمى onend_request()، ويتم الاتصال عند اكتمال معالجة الطلب. تشير رسالة الأشكال البيانية يتم استدعاء دوال onerror_* فقط في حالة حدوث خطأ، وهي تسمح لك التعامل مع الأخطاء باستخدام الرمز المخصّص إذا أردت ذلك.

لنفترض أنه تم إرسال البيانات في الطلب وتم استدعاء ondata_request(). إشعار التي تستدعي استدعاء الدالة next() بمعلمتين:

next(null, data);

حسب الاصطلاح، يتم استخدام المعلمة الأولى لنقل معلومات الخطأ، والتي يمكنك بعد ذلك في دالة لاحقة في السلسلة. من خلال الضبط على null، يمكنك الوسيطة، نقول إنه ليست هناك أخطاء، ومن المفترض أن تتم معالجة الطلب بشكل طبيعي. في حال حذف هذه الوسيطة صحيحة (مثل كائن خطأ)، ثم تتوقف معالجة الطلب إرسال إلى الهدف.

وتمرّر المعلمة الثانية بيانات الطلب إلى الدالة التالية في السلسلة. إذا لم تفعل معالجة إضافية، يتم تمرير بيانات الطلب بدون تغيير إلى هدف واجهة برمجة التطبيقات. ومع ذلك، لديك فرصة لتعديل بيانات الطلب باستخدام هذه الطريقة واجتياز إلى الهدف. على سبيل المثال، إذا كانت بيانات الطلب بتنسيق XML، وكان الهدف يتوقع تنسيق JSON، ثم يمكنك إضافة رمز إلى طريقة ondata_request() التي (أ) تغيّر Content-نوع عنوان الطلب إلى application/json وتحويل بيانات الطلب إلى JSON باستخدام أي وسيلة تريدها (على سبيل المثال، يمكنك استخدام Node.js المحوّل xml2json الذي يتم الحصول عليه من NPM).

لنرى كيف يمكن أن يبدو ذلك:

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

وفي هذه الحالة، يتم تحويل بيانات الطلب (التي يُفترض أن تكون بتنسيق XML) إلى تنسيق JSON يتم تمرير البيانات المحوَّلة عبر next() إلى الدالة التالية في سلسلة الطلب، قبل تمريره إلى الواجهة الخلفية.

تجدر الإشارة إلى أنّه يمكنك إضافة عبارة تصحيح أخطاء أخرى لطباعة البيانات التي تم تحويلها لتصحيح الأخطاء. الأهداف. على سبيل المثال:

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

لمحة ترتيب تنفيذ معالج المكوّنات الإضافية

إذا كتبت مكونات إضافية لـ Edge Microgateway، فأنت بحاجة إلى فهم الترتيب الذي سيتم به المكون الإضافي يتم تنفيذ معالِجات الأحداث.

وأهم نقطة مهمة ينبغي لك تذكرها هي أنه عند تحديد تسلسل مكون إضافي في قائمة Edge ملف تهيئة Microgateway، يتم تنفيذ معالِجات الطلبات بترتيب تصاعدي، بينما يتم تنفيذ معالِجات الاستجابة بترتيب تنازلي.

تم تصميم المثال التالي لمساعدتك على فهم تسلسل التنفيذ هذا.

1. إنشاء ثلاث طرق بسيطة المكونات الإضافية

ضع في الاعتبار المكون الإضافي التالي. كل ما تفعله هو إخراج وحدة التحكم في الطباعة عندما تكون معالِجات الأحداث المسمى:

المكوّنات الإضافية/المكوّنات الإضافية-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);
    }
  };
}

يمكنك الآن إنشاء مكوّنَين إضافيَّين، هما plugin-2 وplugin-3، باستخدام نفس الرمز (باستثناء تغيير عبارات console.log() إلى plugin-2 وplugin-3 على التوالي).

2. مراجعة رمز المكوّن الإضافي

يعمل المكون الإضافي الذي تم تصديره في <microgateway-root-dir>/plugins/plugin-1/index.js هي معالِجات الأحداث التي وتنفيذها في أوقات محددة أثناء معالجة الطلب والاستجابة. على سبيل المثال: ينفذ onrequest البايت الأول من عناوين الطلبات التي يتم استلامها. في حين، يتم تنفيذ onend_response بعد تلقّي آخر بايت من بيانات الاستجابة.

ألق نظرة على المعالج ondata_response - يتم استدعاؤه عندما يكون جزء من بيانات الاستجابة المستلم. من المهم أن تعرف أن بيانات الاستجابة لا يتم تلقيها بالضرورة مرة واحدة. وإنما يمكن تلقي البيانات في أجزاء عشوائية من الطول.

3- أضف المكونات الإضافية إلى تسلسل المكون الإضافي

استمرارًا لهذا المثال، سنضيف المكونات الإضافية إلى تسلسل المكونات الإضافية في Edge ملف إعداد Microgateway (~./edgemicro/config.yaml) على النحو التالي. التسلسل هو التحليل. وتحدد ترتيب تنفيذ معالجات المكوّن الإضافي.

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

4. فحص نتائج تصحيح الأخطاء

لنلقِ الآن نظرة على الإخراج الذي سيتم إنتاجه عند استدعاء هذه المكوّنات الإضافية. تتوفر بعض النقاط المهمة التي يجب ملاحظتها:

  • تسلسل المكون الإضافي لملف تهيئة Edge Microgateway تحدّد (~./edgemicro/config.yaml) ترتيب معالِجات الأحداث. استدعيت.
  • يتم استدعاء معالِجات الطلبات ترتيبًا تصاعديًا (الترتيب الذي تظهر في تسلسل المكون الإضافي -- 1، 2، 3).
  • يتم استدعاء معالِجات الاستجابة بترتيب تنازلي -- 3، 2، 1.
  • يتم استدعاء معالج ondata_response مرة واحدة لكل مجموعة بيانات يصل. في هذا المثال (الناتج الموضح أدناه)، يتم استلام مقطعين.

في ما يلي نموذج ناتج تصحيح الأخطاء يتم إنشاؤه عندما تكون هذه المكوّنات الإضافية الثلاثة قيد الاستخدام ويتم إرسال طلب. عبر بوابة Edge Microgateway. ما عليك سوى ملاحظة الترتيب الذي يتم به استدعاء المعالجات:

  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

ملخّص

إن فهم ترتيب استدعاء معالجات المكوّنات الإضافية أمر مهم للغاية عند محاولة تنفيذ الوظائف المخصصة للمكوّن الإضافي، مثل تجميع وتحويل الطلب أو الاستجابة البيانات.

فقط تذكر أنه يتم تنفيذ معالِجات الطلب بالترتيب الذي يتم به تنفيذ المكوّنات الإضافية المحددة في ملف تهيئة Edge Microgateway، ويتم تنفيذ معالِجات الاستجابة في الترتيب المعاكس.

لمحة عن استخدام المتغيّرات العمومية في المكوّنات الإضافية

يتم إرسال كل طلب إلى Edge Microgateway إلى نفس مثيل المكون الإضافي؛ وبالتالي، ستحل حالة الطلب الثاني من عميل آخر محل الطلب الأول. المكان الآمن الوحيد حفظ حالة المكوِّن الإضافي عن طريق تخزين الحالة في خاصية على كائن الطلب أو الاستجابة (الذي المدة الزمنية على مدة الطلب).

إعادة كتابة عناوين URL المستهدفة في المكونات الإضافية

تمت الإضافة في: الإصدار 2.3.3

يمكنك إلغاء عنوان URL المستهدف التلقائي في مكوّن إضافي ديناميكيًا من خلال تعديل هذه المتغيّرات. في رمز المكوّن الإضافي: req.targetHostname وreq.targetPath.

تمت الإضافة في: الإصدار 2.4.x

يمكنك أيضًا إلغاء منفذ نقطة النهاية المستهدَف والاختيار بين HTTP وHTTPS. تعديل هذه العناصر المتغيرات في رمز المكون الإضافي: req.targetPort و req.targetSecure. لاختيار HTTPS، اضبط req.targetSecure على true; بالنسبة إلى HTTP، اضبطه على false. في حال ضبط req.targetSecure على صحيح، راجع هذه المناقشة الموضوع للاطّلاع على مزيد من المعلومات.

تمت الإزالة في: الإصدار 3.3.3

تمت إزالة نموذج المكوِّن الإضافي المسمى eurekaclient من Edge Microgateway في الإصدار 3.3.3 يُرجى الاطّلاع على ملاحظات الإصدار.

لن تؤثر إزالة هذه الميزة على الوظيفة الأساسية لبوابة Edge المصغّرة في Edge. أو إعادة كتابة عناوين URL المستهدفة. يمكنك ضبط ميزة "البحث الديناميكي عن نقاط النهاية" وتجاوزها المتغيرات المستهدفة مثل req.targetHostname وreq.targetPath وreq.targetPort وreq.targetSecure في مستوى المكون الإضافي. اطلِع على إعادة كتابة عناوين URL المستهدفة في المكوّنات الإضافية.


نماذج مكوّنات إضافية

يتم توفير هذه المكوّنات الإضافية مع تثبيت Edge Microgateway. يمكنك العثور عليهم في تثبيت Edge Microgateway هنا:

[prefix]/lib/node_modules/edgemicro/plugins

حيث [prefix] هو دليل البادئة npm باعتباره الموضح في مقالة "أين يتم تثبيت Edge Microgateway" في Installing Edge مدخل مصغّر

accumulate-request

يجمع هذا المكون الإضافي مجموعات البيانات من العميل في خاصية صفيف مرتبطة عنصر الطلب. عند استلام جميع بيانات الطلب، يتم إنشاء تسلسل للصفيف في مستودع مؤقت والذي يتم تمريره بعد ذلك إلى المكون الإضافي التالي في التسلسل. يجب أن يكون هذا المكون الإضافي هو المكون الإضافي الأول في التسلسل، بحيث تتلقى المكونات الإضافية اللاحقة بيانات الطلب المتراكمة.

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

يجمع هذا المكون الإضافي مجموعات البيانات من الهدف في خاصية صفيف مرتبطة كائن الاستجابة. عند استلام جميع بيانات الاستجابة، يتم إنشاء تسلسل للصفيف في "مخزن مؤقت" والذي يتم تمريره بعد ذلك إلى المكون الإضافي التالي في التسلسل. نظرًا لأن هذا المكون الإضافي يعمل على الردود، التي تتم معالجتها بترتيب عكسي، يجب وضعه على أنه المكون الإضافي الأخير في التسلسل.

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

  };

}

المكوّن الإضافي للأحرف الكبيرة

تتضمن توزيعات Edge Microgateway نموذج مكون إضافي يسمى <microgateway-root-dir>/plugins/header-uppercase يتضمن العيّنة تعليقات لوصف كل معالج من معالِجات الدوال. تقوم هذه العينة ببعض عمليات التحويل البسيطة للبيانات تستهدف الاستجابة وتضيف عناوين مخصصة إلى طلب العميل والاستجابة المستهدفة.

إليك رمز المصدر <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();
    }

  };

}

تحويل الأحرف الكبيرة

هذا هو مكون إضافي لتحويل عام يمكنك تعديله للقيام بأي نوع من التحويل الذي تريده. يحول هذا المثال ببساطة بيانات الاستجابة والطلب بأحرف كبيرة.

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

  };

}