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.5 trở lên
Đố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.
- Nếu Edge Microgateway đang chạy, hãy dừng lại ngay:
edgemicro stop
-
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. - Tạo một dự án trình bổ trợ mới có tên là Response-override và
cd
đối với dự án này:
mkdir response-override && cd response-override
- 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. - 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
. - 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"); } }; }
- 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 đóorg
vàenv
là tên môi trường và tổ chức của bạn trong Edge. - 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 ...
- Khởi động lại Edge Microgateway.
- 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.json
vàindex.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, logger và stats. 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_ và 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, logger và stats.
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-2
và plugin-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-2
và plugin-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.targetHostname và req.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.targetPort và req.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.
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); } }; }