Phát triển trình bổ trợ tuỳ chỉnh

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến tài liệu về Apigee X.
thông tin

Edge Microgateway phiên bản 3.3.x

Đối tượng người xem

Chủ đề này dành cho các nhà phát triển muốn mở rộng các tính năng của Edge Microgateway bằng cách viết các trình bổ trợ tuỳ chỉnh. Nếu muốn viết một trình bổ trợ mới, bạn phải có kinh nghiệm sử dụng JavaScript và Node.js.

Trình bổ trợ Edge Microgateway tuỳ chỉnh là gì?

Trình bổ trợ là một mô-đun Node.js bổ sung chức năng cho Edge Microgateway. Các mô-đun trình bổ trợ tuân theo một mẫu nhất quán và được lưu trữ tại một vị trí mà Edge Microgateway biết đến, cho phép các mô-đun đó được phát hiện và chạy tự động. Một số trình bổ trợ được xác định trước sẽ được cung cấp khi bạn cài đặt Edge Microgateway. Các trình bổ trợ này bao gồm các trình bổ trợ giúp xác thực, phát hiện tăng đột biến, hạn mức và phân tích. Các trình bổ trợ hiện có này được mô tả trong phần Sử dụng trình bổ trợ.

Bạn có thể thêm các tính năng và chức năng mới vào cổng vào vi mô bằng cách viết trình bổ trợ tuỳ chỉnh. Theo mặc định, Edge Microgateway về cơ bản là một proxy truyền qua bảo mật giúp truyền các yêu cầu và phản hồi không thay đổi đến và đi từ các dịch vụ mục tiêu. Với các trình bổ trợ tuỳ chỉnh, bạn có thể tương tác theo phương thức lập trình với các yêu cầu và phản hồi chuyển qua cổng vi mô.

Vị trí đặt mã trình bổ trợ tuỳ chỉnh

Một thư mục cho các trình bổ trợ tuỳ chỉnh được bao gồm trong quá trình cài đặt Edge Microgateway tại đây:

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

trong đó [prefix] là thư mục tiền tố npm như mô tả trong phần "Cửa sổ nhỏ Edge được cài đặt ở đâu" trong phần Cài đặt Microgateway.

Bạn có thể thay đổi thư mục trình bổ trợ mặc định này. Hãy xem bài viết Cách tìm trình bổ trợ.

Xem lại các trình bổ trợ được xác định trước

Trước khi cố gắng phát triển trình bổ trợ của riêng mình, bạn nên kiểm tra để đảm bảo không có trình bổ trợ nào được xác định trước đáp ứng các yêu cầu của bạn. Những trình bổ trợ này nằm trong:

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

trong đó [prefix] là thư mục tiền tố npm. Hãy xem thêm phần "Thiết bị Edge Microgateway được cài đặt ở đâu" trong bài viết Cài đặt Cổng nhỏ Edge.

Để biết thông tin chi tiết, hãy xem thêm Các trình bổ trợ xác định trước được cung cấp cùng với Edge Microgateway.

Viết một trình bổ trợ đơn giản

Trong phần này, chúng tôi sẽ hướng dẫn các bước cần thiết để tạo một trình bổ trợ đơn giản. Trình bổ trợ này ghi đè dữ liệu phản hồi (bất kể dữ liệu) bằng chuỗi "Hello, World!" và in ra thiết bị đầu cuối.

  1. Nếu Edge Microgateway đang chạy, hãy dừng lại ngay:
    edgemicro stop
    
  2. cd vào thư mục trình bổ trợ tuỳ chỉnh:

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

    trong đó [prefix] là thư mục tiền tố npm như mô tả trong phần "Cửa sổ Edge Micro được cài đặt ở đâu" trong phần Cài đặt Microgateway.

  3. Tạo một dự án trình bổ trợ mới có tên là Response-overridecd đối với dự án này:
    mkdir response-override && cd response-override
    
  4. Tạo một dự án Node.js mới:
    npm init
    
    Nhấn vào Return nhiều lần để chấp nhận các giá trị mặc định.
  5. Sử dụng trình chỉnh sửa văn bản để tạo tệp mới có tên là index.js.
  6. Sao chép mã sau vào index.js rồi lưu tệp.
    '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. Lúc này, bạn đã tạo một trình bổ trợ và cần thêm trình bổ trợ đó vào cấu hình Edge Microgateway. Mở tệp $HOME/.edgemicro/[org]-[env]-config.yaml, trong đó orgenv là tên môi trường và tổ chức của bạn trong Edge.
  8. Thêm trình bổ trợ response-override vào phần tử plugins:sequence như minh hoạ bên dưới.
          ...
          
          plugins:
            dir: ../plugins
            sequence:
              - oauth
              - response-override
              
          ...
    
  9. Khởi động lại Edge Microgateway.
  10. Gọi API thông qua Edge Microgateway. (Lệnh gọi API này giả định bạn đã thiết lập cùng một cấu hình như hướng dẫn về bảo mật khoá API, như mô tả trong bài viết Thiết lập và định cấu hình Edge Microgateway:
    curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo
    Hello, World!
    

Cấu tạo của một trình bổ trợ

Trình bổ trợ mẫu Edge Microgateway sau đây minh hoạ mẫu cần tuân theo khi phát triển trình bổ trợ của riêng bạn. Mã nguồn cho trình bổ trợ mẫu được thảo luận trong phần này nằm trong plugins/header-uppercase/index.js.

  • Trình bổ trợ là các mô-đun MAP tiêu chuẩn có package.jsonindex.js trong thư mục gốc.
  • Trình bổ trợ phải xuất một hàm init().
  • Hàm init() nhận 3 đối số: config, loggerstats. Các đối số này được mô tả trong các đối số hàm init() của trình bổ trợ.
  • init() trả về một đối tượng có các trình xử lý hàm có tên được gọi khi một số sự kiện nhất định xảy ra trong suốt thời gian hoạt động của yêu cầu.

Hàm xử lý sự kiện

Một trình bổ trợ phải triển khai một số hoặc tất cả các hàm của trình xử lý sự kiện này. Bạn là người quyết định việc triển khai các hàm này. Bất kỳ hàm nào cũng là không bắt buộc và một trình bổ trợ thông thường sẽ triển khai ít nhất một tập hợp con các hàm này.

Trình xử lý sự kiện luồng yêu cầu

Các hàm này được gọi trên các sự kiện yêu cầu trong Edge Microgateway.

  • onrequest
  • ondata_request
  • onend_request
  • onclose_request
  • onerror_request

onrequest hàm

Được gọi khi bắt đầu yêu cầu ứng dụng. Hàm này kích hoạt khi byte đầu tiên của yêu cầu mà Edge Microgateway nhận được. Hàm này cho phép bạn truy cập vào tiêu đề của yêu cầu, URL, tham số truy vấn và phương thức HTTP. Nếu bạn gọi tiếp theo với một đối số đầu tiên trung thực (chẳng hạn như trường hợp Lỗi), thì quá trình xử lý yêu cầu sẽ dừng và yêu cầu mục tiêu sẽ không được bắt đầu.

Ví dụ:

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

ondata_request hàm

Được gọi khi một phần dữ liệu được nhận từ ứng dụng. Chuyển dữ liệu yêu cầu đến trình bổ trợ tiếp theo trong trình tự trình bổ trợ. Giá trị trả về từ trình bổ trợ cuối cùng trong trình tự sẽ được gửi đến mục tiêu. Một trường hợp sử dụng điển hình như dưới đây là để biến đổi dữ liệu yêu cầu trước khi gửi đến mục tiêu.

Ví dụ:

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

onend_request hàm

Được gọi khi ứng dụng đã nhận được tất cả dữ liệu yêu cầu.

Ví dụ:

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

Hàm onclose_request

Cho biết kết nối máy khách đã đóng. Bạn có thể dùng hàm này trong trường hợp kết nối ứng dụng không đáng tin cậy. Lệnh này được gọi khi kết nối ổ cắm với ứng dụng bị đóng.

Ví dụ:

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

Hàm onerror_request

Được gọi nếu có lỗi khi nhận yêu cầu ứng dụng.

Ví dụ:

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

Trình xử lý sự kiện của luồng phản hồi

Các hàm này được gọi trên các sự kiện phản hồi trong Edge Microgateway.

  • onresponse
  • ondata_response
  • onend_response
  • onclose_response
  • onerror_response

Hàm onresponse

Được gọi khi bắt đầu phản hồi mục tiêu. Hàm này kích hoạt khi byte đầu tiên của phản hồi mà Edge Microgateway nhận được. Hàm này cho phép bạn truy cập vào tiêu đề phản hồi và mã trạng thái.

Ví dụ:

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


Hàm ondata_response

Được gọi khi nhận được một đoạn dữ liệu từ mục tiêu.

Ví dụ:

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


Hàm onend_response

Được gọi khi mục tiêu đã nhận được tất cả dữ liệu phản hồi.

Ví dụ:

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

Hàm onclose_response

Cho biết kết nối đích đã đóng. Bạn có thể dùng hàm này trong trường hợp kết nối mục tiêu không đáng tin cậy. Lệnh này được gọi khi kết nối ổ cắm với mục tiêu bị đóng.

Ví dụ:

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


Hàm onerror_response

Được gọi nếu có lỗi khi nhận phản hồi mục tiêu.

Ví dụ:

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

Những điều bạn cần biết về các hàm của trình xử lý sự kiện của trình bổ trợ

Các hàm trình xử lý sự kiện của trình bổ trợ được gọi để phản hồi các sự kiện cụ thể xảy ra trong khi Edge Microgateway xử lý một yêu cầu API nhất định.

  • Mỗi trình xử lý hàm init() (ondata_request, ondata_Response, v.v.) phải gọi lệnh gọi lại next() khi quá trình xử lý hoàn tất. Nếu bạn không gọi next(), quá trình xử lý sẽ dừng và yêu cầu sẽ bị treo.
  • Đối số đầu tiên cho next() có thể là một lỗi khiến quá trình xử lý yêu cầu bị chấm dứt.
  • Trình xử lý ondata_onend_ phải gọi next() với đối số thứ hai chứa dữ liệu sẽ được truyền đến mục tiêu hoặc ứng dụng. Đối số này có thể rỗng nếu trình bổ trợ đang lưu vào bộ đệm và không có đủ dữ liệu để chuyển đổi tại thời điểm này.
  • Lưu ý rằng một phiên bản duy nhất của trình bổ trợ được dùng để phục vụ tất cả yêu cầu và phản hồi. Nếu một trình bổ trợ muốn giữ lại trạng thái theo yêu cầu giữa các lệnh gọi, thì trình bổ trợ đó có thể lưu trạng thái đó trong một thuộc tính được thêm vào đối tượng yêu cầu đã cung cấp (req). Đối tượng này có thời gian tồn tại là thời lượng của lệnh gọi API.
  • Hãy cẩn thận để phát hiện tất cả các lỗi và gọi next() khi gặp lỗi đó. Nếu không thể gọi next(), lệnh gọi API sẽ bị treo.
  • Hãy cẩn thận để tránh làm rò rỉ bộ nhớ, vì điều đó có thể ảnh hưởng đến hiệu suất tổng thể của Edge Microgateway và khiến ứng dụng gặp sự cố nếu hết bộ nhớ.
  • Hãy cẩn thận tuân theo mô hình Node.js bằng cách không thực hiện các tác vụ nặng về điện toán trong luồng chính, vì điều này có thể ảnh hưởng xấu đến hiệu suất của Edge Microgateway.

Giới thiệu về hàm init() của trình bổ trợ

Phần này mô tả các đối số được chuyển đến hàm init(): config, loggerstats.

cấu hình

Dữ liệu cấu hình thu được bằng cách hợp nhất tệp cấu hình Edge Microgateway với dữ liệu được tải xuống qua Apigee Edge sẽ được đặt trong một đối tượng có tên là: config.

Để thêm một thông số cấu hình có tên là param (tham số) có giá trị là foo vào một trình bổ trợ có tên là Response-override (ghi đè phản hồi), hãy đặt nội dung này trong tệp default.yaml:

response-override:
    param: foo

Sau đó, bạn có thể truy cập tham số trong mã trình bổ trợ như sau:

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

Trong trường hợp này, bạn sẽ thấy foo được in trong kết quả gỡ lỗi của trình bổ trợ:

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

Bạn có thể truy cập vào cấu hình micrô cổng đã hợp nhất và tải dữ liệu Apigee Edge xuống trong đối tượng con config.emgConfigs. Ví dụ: bạn có thể truy cập vào dữ liệu cấu hình này trong hàm init như sau:

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

Dưới đây là ví dụ về dữ liệu mà emgConfigs chứa:

{
    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

Trình ghi nhật ký hệ thống. Trình ghi nhật ký đang được sử dụng sẽ xuất các hàm này, trong đó đối tượng có thể là một chuỗi, yêu cầu HTTP, phản hồi HTTP hoặc một thực thể Lỗi.

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

số liệu thống kê

Một đối tượng lưu giữ số lượng yêu cầu, phản hồi, lỗi và các số liệu thống kê tổng hợp khác liên quan đến các yêu cầu và phản hồi chuyển qua một thực thể cổng vào nhỏ.

  • treqErrors – Số lượng yêu cầu mục tiêu có lỗi.
  • treqErrors – Số lượng phản hồi mục tiêu có lỗi.
  • statusCodes – Đối tượng chứa số mã phản hồi:
{
  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
  }
  
  • yêu cầu – Tổng số yêu cầu.
  • phản hồi – Tổng số câu trả lời.
  • kết nối – Số lượng kết nối mục tiêu đang hoạt động.

Giới thiệu về hàm next()

Mọi phương thức trình bổ trợ phải gọi next() để tiếp tục xử lý phương thức tiếp theo trong chuỗi (nếu không quy trình của trình bổ trợ sẽ bị treo). Trong vòng đời yêu cầu, phương thức đầu tiên được gọi là onrequest(). Phương thức tiếp theo sẽ được gọi là phương thức ondata_request(); tuy nhiên, ondata_request chỉ được gọi nếu yêu cầu chứa dữ liệu, như trong trường hợp yêu cầu POST. Phương thức tiếp theo được gọi sẽ là onend_request(). Phương thức này sẽ được gọi khi quá trình xử lý yêu cầu hoàn tất. Hàm onerror_* chỉ được gọi trong trường hợp xảy ra lỗi và cho phép bạn xử lý lỗi bằng mã tuỳ chỉnh nếu muốn.

Giả sử dữ liệu được gửi trong yêu cầu và ondata_request() được gọi. Xin lưu ý rằng hàm này gọi next() bằng 2 tham số:

next(null, data);

Theo quy ước, tham số đầu tiên được dùng để truyền tải thông tin lỗi mà sau đó bạn có thể xử lý trong hàm tiếp theo trong chuỗi. Khi đặt giá trị này thành null (một đối số giả), chúng tôi sẽ cho biết không có lỗi nào và quá trình xử lý yêu cầu sẽ diễn ra như bình thường. Nếu đối số này là chính xác (chẳng hạn như đối tượng Lỗi), thì quá trình xử lý yêu cầu sẽ dừng và yêu cầu sẽ được gửi đến mục tiêu.

Tham số thứ hai truyền dữ liệu yêu cầu đến hàm tiếp theo trong chuỗi. Nếu bạn không xử lý thêm, dữ liệu yêu cầu sẽ không thay đổi thành mục tiêu của API. Tuy nhiên, bạn có thể sửa đổi dữ liệu yêu cầu trong phương thức này và chuyển yêu cầu đã sửa đổi đến mục tiêu. Ví dụ: nếu dữ liệu yêu cầu là XML và mục tiêu yêu cầu JSON, thì bạn có thể thêm mã vào phương thức ondata_request() (a) thay đổi Content-Type của tiêu đề yêu cầu thành application/json và chuyển đổi dữ liệu yêu cầu thành JSON bằng bất kỳ phương thức nào bạn muốn (ví dụ: bạn có thể sử dụng trình chuyển đổi Node.js xml2json lấy từ MAP).

Hãy cùng xem:

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

Trong trường hợp này, dữ liệu yêu cầu (được giả định là XML) sẽ được chuyển đổi thành JSON, và dữ liệu đã chuyển đổi sẽ được chuyển qua next() đến hàm tiếp theo trong chuỗi yêu cầu, trước khi được chuyển đến mục tiêu phụ trợ.

Xin lưu ý rằng bạn có thể thêm một câu lệnh gỡ lỗi khác để in dữ liệu đã chuyển đổi cho mục đích gỡ lỗi. Ví dụ:

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

Giới thiệu về thứ tự thực thi trình xử lý trình bổ trợ

Nếu viết trình bổ trợ cho Edge Microgateway, bạn cần hiểu rõ thứ tự thực thi các trình xử lý sự kiện của trình bổ trợ.

Điểm quan trọng cần nhớ là khi bạn chỉ định một trình tự trình bổ trợ trong tệp cấu hình Edge Microgateway, trình xử lý yêu cầu sẽ thực thi theo thứ tự tăng dần, trong khi trình xử lý phản hồi sẽ thực thi theo thứ tự giảm dần.

Ví dụ sau đây được thiết kế để giúp bạn hiểu về trình tự thực thi này.

1. Tạo 3 trình bổ trợ đơn giản

Hãy cân nhắc sử dụng trình bổ trợ sau đây. Tất cả những gì chỉ có ở đầu ra của bảng điều khiển in khi trình xử lý sự kiện được gọi:

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

Bây giờ, hãy cân nhắc tạo thêm 2 trình bổ trợ là plugin-2plugin-3 bằng cùng một mã (ngoại trừ lần lượt thay đổi câu lệnh console.log() thành plugin-2plugin-3).

2. Xem xét mã trình bổ trợ

Các hàm trình bổ trợ đã xuất trong <microgateway-root-dir>/plugins/plugin-1/index.js là các trình xử lý sự kiện sẽ thực thi tại các thời điểm cụ thể trong quá trình xử lý yêu cầu và phản hồi. Ví dụ: onrequest thực thi byte đầu tiên của tiêu đề yêu cầu nhận được. Trong khi, onend_response thực thi sau khi nhận byte dữ liệu phản hồi cuối cùng.

Hãy xem trình xử lý ondata_Response – trình xử lý này được gọi mỗi khi nhận được một đoạn dữ liệu phản hồi. Điều quan trọng cần biết là dữ liệu phản hồi không phải lúc nào cũng được nhận cùng một lúc. Thay vào đó, dữ liệu có thể được nhận theo đoạn có độ dài tuỳ ý.

3. Thêm trình bổ trợ vào trình tự trình bổ trợ

Tiếp tục với ví dụ này, chúng tôi sẽ thêm các trình bổ trợ vào trình tự trình bổ trợ trong tệp cấu hình Edge Microgateway (~./edgemicro/config.yaml) như sau. Trình tự này rất quan trọng. Mã này xác định thứ tự thực thi của các trình xử lý trình bổ trợ.

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

4. Kiểm tra kết quả gỡ lỗi

Bây giờ, hãy xem kết quả sẽ được tạo khi các trình bổ trợ này được gọi. Có một vài điểm quan trọng cần lưu ý:

  • Trình tự trình bổ trợ mà tệp cấu hình Edge Microgateway (~./edgemicro/config.yaml) sẽ chỉ định thứ tự gọi các trình xử lý sự kiện.
  • Trình xử lý yêu cầu được gọi theo thứ tự tăng dần (thứ tự xuất hiện trong trình tự trình bổ trợ – 1, 2, 3).
  • Trình xử lý phản hồi được gọi theo thứ tự giảm dần – 3, 2, 1.
  • Trình xử lý ondata_response được gọi một lần cho mỗi phần dữ liệu xuất hiện. Trong ví dụ này (kết quả hiển thị bên dưới), hệ thống nhận được 2 phần.

Dưới đây là kết quả gỡ lỗi mẫu được tạo ra khi 3 trình bổ trợ này đang được sử dụng và một yêu cầu được gửi qua Edge Microgateway. Chỉ cần lưu ý thứ tự gọi các trình xử lý:

  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

Tóm tắt

Việc hiểu thứ tự gọi các trình xử lý trình bổ trợ là rất quan trọng khi bạn cố gắng triển khai chức năng của trình bổ trợ tuỳ chỉnh, chẳng hạn như tích luỹ và chuyển đổi dữ liệu yêu cầu hoặc phản hồi.

Hãy nhớ rằng trình xử lý yêu cầu được thực thi theo thứ tự các trình bổ trợ được chỉ định trong tệp cấu hình Edge Microgateway và trình xử lý phản hồi được thực thi theo thứ tự ngược lại.

Giới thiệu về cách sử dụng biến toàn cục trong trình bổ trợ

Mọi yêu cầu gửi đến Edge Microgateway đều được gửi đến cùng một phiên bản trình bổ trợ. Do đó, trạng thái của yêu cầu thứ hai từ một ứng dụng khác sẽ ghi đè yêu cầu đầu tiên. Nơi an toàn duy nhất để lưu trạng thái trình bổ trợ là lưu trữ trạng thái trong một thuộc tính trên đối tượng yêu cầu hoặc phản hồi (thời gian tồn tại của nó bị giới hạn trong thời gian hoạt động của yêu cầu).

Viết lại URL mục tiêu trong trình bổ trợ

Đã thêm vào: phiên bản 2.3.3

Bạn có thể ghi đè URL mục tiêu mặc định trong trình bổ trợ một cách linh động bằng cách sửa đổi các biến này trong mã trình bổ trợ: req.targetHostnamereq.targetPath.

Đã thêm trong: phiên bản 2.4.x

Bạn cũng có thể ghi đè cổng điểm cuối đích, rồi chọn giữa HTTP và HTTPS. Sửa đổi các biến này trong mã trình bổ trợ: req.targetPortreq.targetSecure. Để chọn HTTPS, hãy đặt req.targetSecure thành true; đối với HTTP, hãy đặt thành false. Nếu bạn đặt req.targetSecure thành true, hãy xem chuỗi thảo luận này để biết thêm thông tin.

Một trình bổ trợ mẫu có tên eurekaclient đã được thêm vào Edge Microgateway. Trình bổ trợ này minh hoạ cách sử dụng các biến req.targetPort và req.targetSecure, đồng thời minh hoạ cách Edge Microgateway có thể thực hiện việc tra cứu điểm cuối động bằng cách sử dụng Eureka làm danh mục điểm cuối của dịch vụ.


Trình bổ trợ mẫu

Các trình bổ trợ này được cung cấp trong quá trình cài đặt Edge Microgateway. Bạn có thể tìm thấy các bộ mã hoá này trong quá trình cài đặt Edge Microgateway tại đây:

[prefix]/lib/node_modules/edgemicro/plugins

trong đó [prefix] là thư mục tiền tố npm như mô tả trong phần "Cửa sổ nhỏ Edge được cài đặt ở đâu" trong phần Cài đặt Microgateway.

yêu cầu tích luỹ

Trình bổ trợ này tích luỹ các phần dữ liệu của ứng dụng vào một thuộc tính mảng được đính kèm với đối tượng yêu cầu. Khi nhận được tất cả dữ liệu yêu cầu, mảng này được liên kết vào một Vùng đệm, sau đó được chuyển đến trình bổ trợ tiếp theo trong trình tự. Trình bổ trợ này nên là trình bổ trợ đầu tiên trong trình tự để các trình bổ trợ tiếp theo nhận được dữ liệu yêu cầu tích luỹ.

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

    }

  };

}

tích luỹ-phản hồi

Trình bổ trợ này tích luỹ các phần dữ liệu từ mục tiêu vào một thuộc tính mảng đính kèm với đối tượng phản hồi. Khi nhận được tất cả dữ liệu phản hồi, mảng này được nối vào một Vùng đệm, sau đó được truyền đến trình bổ trợ tiếp theo trong trình tự. Vì trình bổ trợ này hoạt động trên các phản hồi được xử lý theo thứ tự đảo ngược, nên bạn nên đặt trình bổ trợ này làm trình bổ trợ cuối cùng trong trình tự.

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

  };

}

Trình bổ trợ viết hoa ở đầu dòng

Các bản phân phối Edge Microgateway bao gồm một trình bổ trợ mẫu có tên là <microgateway-root-dir>/plugins/header-uppercase. Mẫu này bao gồm các nhận xét mô tả từng trình xử lý hàm. Mẫu này thực hiện một số biến đổi dữ liệu đơn giản của phản hồi mục tiêu, đồng thời thêm các tiêu đề tuỳ chỉnh vào yêu cầu và phản hồi mục tiêu.

Dưới đây là mã nguồn của <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();
    }

  };

}


chữ hoa chữ thường

Đây là một trình bổ trợ chuyển đổi chung mà bạn có thể sửa đổi để thực hiện bất kỳ loại biến đổi nào bạn muốn. Ví dụ này chỉ chuyển đổi dữ liệu phản hồi và yêu cầu thành chữ hoa.

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

  };

}