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.1.x

Đối tượng

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

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

Trình bổ trợ là một mô-đun Node.js giúp thêm chức năng cho Edge Microgateway. 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 để hệ thống tìm thấy và chạy tự động. Một số trình bổ trợ định sẵn sẽ được cung cấp khi bạn cài đặt Edge Microgateway. Các chính sách này bao gồm các trình bổ trợ để xác thực, chặn tăng đột biến, hạn mức và số liệu 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à khả năng mới vào cổng nhỏ bằng cách viết tùy chỉnh trình bổ trợ. Theo mặc định, Edge Microgateway về cơ bản là một proxy truyền qua an toàn truyền các yêu cầu và phản hồi không thay đổi đến và đi từ dịch vụ đích. Với các trình bổ trợ tuỳ chỉnh, bạn có thể tương tác có lập trình với các yêu cầu và phản hồi diễn ra qua cổng vi mô.

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

Một thư mục chứa các trình bổ trợ tuỳ chỉnh được đưa vào 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 mô tả trong phần "Cài đặt Edge Microgateway ở đâu" trong Installing Edge Cổng nhỏ.

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

Xem xét 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 rằng không có plugin đáp ứng 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. Xem cả " Edge Microgateway được cài đặt ở đâu" trong Installing Edge Cổng nhỏ.

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

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 bạ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ể là gì) bằng chuỗi "Hello, World!" và in nó lên thiết bị đầu cuối.

  1. Nếu Edge Microgateway đang chạy, hãy dừng ứng dụng đó ngay bây giờ:
    edgemicro stop
    
  2. cd đến 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 " Edge Microgateway được lắp đặt ở đâu" trong Installing Edge Cổng nhỏ.

  3. Tạo dự án trình bổ trợ mới có tên là phản hồi-ghi đècd vào cuộc trò chuyện:
    mkdir response-override && cd response-override
    
  4. Tạo dự án Node.js mới:
    npm init
    
    Nhấn nút Return nhiều lần để chấp nhận các chế độ 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ã nguồn sau đây 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. Bây giờ, bạn đã tạo một trình bổ trợ và cần thêm trình bổ trợ này vào cấu hình Edge Microgateway. Mở tệp $HOME/.edgemicro/[org]-[env]-config.yaml, trong đó orgenv là tên tổ chức và tên môi trường của Edge.
  8. Thêm trình bổ trợ response-override vào phần tử plugins:sequence như minh hoạ dưới đây.
          ...
          
          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ư được mô tả trong phần 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 là trong plugins/header-uppercase/index.js.

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

Các hàm trình 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. Việc triển khai các chế độ cài đặt này chức năng nào tuỳ thuộc vào bạn. Mọi chức năng nhất định đều không bắt buộc và một trình bổ trợ thông thường sẽ triển khai lúc ít nhất một tập con của các hàm này.

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

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 Edge Microgateway sẽ nhận được yêu cầu. Hàm này cho phép bạn truy cập vào các 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 phương thức tiếp theo bằng một đối số đầu tiên đáng tin cậy (chẳng hạn như lỗi), thì quá trình xử lý yêu cầu sẽ dừng và yêu cầu mục tiêu không được khởi tạo.

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 dữ liệu tiếp theo trình bổ trợ 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ự được gửi đến mục tiêu. Một trường hợp sử dụng điển hình được minh hoạ bên dưới là biến đổi dữ liệu yêu cầu trước khi gửi đi với 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 tất cả dữ liệu yêu cầu đã được nhận từ ứng dụng.

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 ứng dụng đã đóng. Bạn có thể sử dụng chức năng này trong trường hợp kết nối máy khách không đáng tin cậy. Lệnh này được gọi khi kết nối ổ cắm đến ứng dụng khách được đã đó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 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 Edge Microgateway sẽ nhận được phản hồi. Hàm này cho phép bạn truy cập vào các 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 một phần dữ liệu được nhận 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ể sử dụng chức năng này trong trường hợp kết nối đích không đáng tin cậy. Lệnh này được gọi khi kết nối ổ cắm đến đích được gọi là đã đóng.

Ví dụ:

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


Hàm onerror_response

Được gọi nếu xảy ra 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 trình xử lý sự kiện của trình bổ trợ

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 sẽ 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 hoàn tất đang xử lý. 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 và sẽ dẫn đến yêu cầu đang xử lý để 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 máy khách. Đố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 chỉ một phiên bản trình bổ trợ được dùng để phục vụ tất cả các yêu cầu và phản hồi. Nếu muốn giữ lại trạng thái mỗi yêu cầu giữa các lệnh gọi, trình bổ trợ có thể lưu trạng thái đó trong thuộc tính được thêm vào đối tượng request đã cung cấp (req), có vòng đời là thời lượng của lệnh gọi API.
  • Hãy thận trọng để phát hiện tất cả các lỗi và gọi lệnh next() với lỗi đó. Không thể lệnh gọi next() sẽ dẫn đến lệnh gọi API bị treo.
  • Hãy cẩn thận để không làm rò rỉ bộ nhớ vì việc này có thể ảnh hưởng đến hiệu suất tổng thể của Edge Microgateway và khiến nó 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ụ cần nhiều điện toán trong 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 truyền đến hàm init(): config, trình ghi nhật kýsố liệu thống kê.

cấu hình

Đối tượng cấu hình thu được sau khi hợp nhất tệp cấu hình Edge Microgateway với thông tin được tải xuống từ Apigee Edge, chẳng hạn như sản phẩm và hạn mức. Bạn có thể tìm thấy cấu hình dành riêng cho trình bổ trợ trong đối tượng này: config.<plugin-name>.

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

response-override:
    param: foo

Sau đó, bạn có thể truy cập vào tham số này trong mã trình bổ trợ, như dưới đây:

// 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 trình bổ trợ:

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

trình ghi nhật ký

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

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

số liệu thống kê

Đố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 đi qua thực thể cổng vi mô (microgateway).

  • 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 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ố phản hồi.
  • kết nối – Số lượng kết nối đích đang hoạt động.

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

Tất cả các 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 (hoặc quá trình 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 có chứa dữ liệu, như trong trường hợp của yêu cầu POST. Phương thức tiếp theo được gọi sẽ là onend_request() được gọi khi quá trình xử lý yêu cầu đã hoàn tất. Chiến lược phát hành đĩa đơn Các hàm onerror_* chỉ được gọi khi xảy ra lỗi và cho phép bạn xử lý lỗi với 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. Lưu ý mà hàm gọi next() bằng hai tham số:

next(null, data);

Theo quy ước, tham số đầu tiên được dùng để truyền tải thông tin về lỗi, sau đó bạn có thể xử lý trong một hàm tiếp theo trong chuỗi. Bằng cách đặt giá trị này thành null, , chúng ta sẽ cho biết rằng không có lỗi và quá trình xử lý yêu cầu sẽ tiến hành bình thường. Nếu đối số này là đáng tin cậy (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ẽ 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 sau đó dữ liệu yêu cầu sẽ không thay đổi được chuyển sang 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 giá trị được 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 mong đợi JSON, thì bạn có thể thêm mã vào phương thức ondata_request() để (a) thay đổi Loại nội dung của tiêu đề yêu cầu thành application/json và chuyển đổi dữ liệu yêu cầu sang JSON bằng bất kỳ cách nào bạn muốn (ví dụ: bạn có thể sử dụng Node.js công cụ chuyển đổi xml2json lấy từ TLD).

Hãy xem quá trình đó trông như thế nào:

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) được chuyển đổi sang JSON và dữ liệu được chuyển đổi sẽ được chuyển qua next() sang hàm tiếp theo trong chuỗi yêu cầu, trước khi được truyền đến mục tiêu phụ trợ.

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 nhằm 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 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 thứ tự trình bổ trợ trình xử lý sự kiện được thực thi.

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

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

1. Tạo ba bước đơn giản trình bổ trợ

Hãy xem xét trình bổ trợ sau. Tất cả những gì cần làm là đầu ra của bảng điều khiển in khi trình xử lý sự kiện của bảng điều khiển là đã gọi:

trình bổ trợ/trình bổ trợ-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 hai trình bổ trợ, plugin-2plugin-3, với cùng một mã (ngoại trừ thay đổi câu lệnh console.log() thành plugin-2plugin-3 tương ứng).

2. Xem lại 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à những trình xử lý sự kiện 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 được byte dữ liệu phản hồi cuối cùng.

Hãy xem trình xử lý ondata_response -- nó được gọi mỗi khi một đoạn dữ liệu phản hồi đã được nhận. Điều quan trọng cần biết là không nhất thiết phải nhận được toàn bộ dữ liệu phản hồi một lần. 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 ta sẽ thêm các trình bổ trợ vào trình tự trình bổ trợ trong Edge Tệp cấu hình Microgateway (~./edgemicro/config.yaml) như sau. Trình tự là rất quan trọng. Tệp này xác định thứ tự thực thi 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 ra 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ợ cho tệp cấu hình Edge Microgateway (~./edgemicro/config.yaml) chỉ định thứ tự các trình xử lý sự kiện có tên.
  • Trình xử lý yêu cầu được gọi theo thứ tự tăng dần (thứ tự mà chúng xuất hiện trong trình tự plugin -- 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 đến. Trong ví dụ này (kết quả như bên dưới), hệ thống nhận được 2 đoạn.

Dưới đây là kết quả gỡ lỗi mẫu được tạo khi 3 trình bổ trợ này đang được sử dụng và có một yêu cầu được gửi thông qua Edge Microgateway. Bạn chỉ cần chú ý 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 rõ thứ tự gọi của 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 trình bổ trợ tuỳ chỉnh, chẳng hạn như tích luỹ và chuyển đổi yêu cầu hoặc phản hồi .

Chỉ cần nhớ rằng các 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à các trình xử lý phản hồi được thực thi trong 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 đến Edge Microgateway đều được gửi đến cùng một phiên bản trình bổ trợ; do đó, một trạng thái của yêu cầu thứ hai từ một ứng dụng khác sẽ ghi đè trạng thái của 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à bằng cách 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 (có thời gian tồn tại bị giới hạn trong thời gian tồn tại của yêu cầu).

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

Đã thêm trong: phiên bản 2.3.3

Bạn có thể tự động ghi đè URL mục tiêu mặc định trong trình bổ trợ bằng cách sửa đổi các biến này trong mã trình bổ trợ của bạn: 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 trong mã trình bổ trợ của bạn: req.targetPortreq.targetSecure. Để chọn HTTPS, hãy đặt req.targetSecure thành true; cho HTTP, hãy đặt thành false. Nếu bạn đặt req.targetSecure thành true, xem cuộc thảo luận này luồng để biết thêm thông tin.

Chúng tôi đã thêm một trình bổ trợ mẫu có tên là eurekaclient vào Edge Microgateway. Chiến dịch này trình bổ trợ minh hoạ cách sử dụng các biến req.targetPort và req.targetSecure và minh hoạ cách Edge Microgateway có thể thực hiện quá trình tra cứu điểm cuối động bằng cách sử dụng Eureka làm dịch vụ danh mục điểm cuối.


Trình bổ trợ mẫu

Các trình bổ trợ này được cung cấp khi bạn cài đặt Edge Microgateway. Bạn có thể tìm thấy chúng trong Lắp đặt Edge Microgateway tại đây:

[prefix]/lib/node_modules/edgemicro/plugins

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

accumulate-request

Trình bổ trợ này tích luỹ các phần dữ liệu từ ứng dụng vào một thuộc tính mảng được đính kèm với . Khi nhận được tất cả dữ liệu yêu cầu, mảng này sẽ được nối với một vùng đệm sau đó, lệnh này sẽ được truyền đến trình bổ trợ tiếp theo trong trình tự. Trình bổ trợ này phải là trình bổ trợ đầu tiên theo trình tự để các trình bổ trợ tiếp theo nhận được dữ liệu yêu cầu được 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);

    }

  };

}

accumulate-response

Trình bổ trợ này tích luỹ các đoạn dữ liệu từ mục tiêu vào một thuộc tính mảng được đính kèm với của bạn. Khi nhận được tất cả dữ liệu phản hồi, mảng sẽ được nối vào một vùng đệm sau đó, lệnh này sẽ được truyền đến trình bổ trợ tiếp theo trong trình tự. Bởi 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, bạn nên đặt nó 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 trang

Bản phân phối Edge Microgateway bao gồm một trình bổ trợ mẫu được gọi là <microgateway-root-dir>/plugins/header-uppercase. Mẫu bao gồm 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ố phép biến đổi dữ liệu đơn giản của phản hồi mục tiêu và thêm tiêu đề tuỳ chỉnh vào yêu cầu ứng dụng khách cũng như 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();
    }

  };

}

biến đổi chữ hoa

Đâ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 trình bổ trợ chuyển đổi nào biến đổi mình muốn. Ví dụ này chỉ chuyển đổi phản hồi và yêu cầu dữ liệ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);
    }

  };

}