Руководство по разработке руководства

Маршрутизация доменного имени

С начала 0.28.0 fibjs объекта mq.Routing поддерживает метод HOST в качестве маршрутизации домена.

1 2 3 4 5 6 7 8 9 10 11 12 13
const mq = require('mq') const rt = new mq.Routing(); // 使得 routes 支持 *.fibjs.org 解析 rt.host('*.fibjs.org', ...) // 使得 routes 支持 api.fibjs.org 解析 rt.host('api.fibjs.org', ...) // 使得 routes 支持 www.fibjs.org, other.fibjs.org, *.fibjs.org 解析 rt.host('fibjs.org', ...) // `rt.host(...args)` 实际上是 `rt.append('host', ...args)` 的别名 rt.append('host', 'fibjs.org', ...)

Давайте посмотрим на некоторые примеры.

Простой пример

Простые fileHandlers

Предположим, что доменное имя fibjs.org было привязано к компьютеру, на котором находится наше приложение (для целей тестирования вы также можете локально изменить хосты для достижения этого эффекта привязки), и мы надеемся загрузить компьютер через file.fibjs.org Файловые ресурсы в каталоге FILE_DIR мы можем сделать так:

1 2 3 4 5 6
const mq = require('mq') const http = require('http') const fileRoutes = new mq.Routing(); // 对域名 file.fibjs.org 的请求, 以 fileHandler 响应 fileRoutes.host('file.fibjs.org', http.fileHandler(FILE_DIR))

Хост внешнего ресурса

Типичный сценарий состоит в том, что скомпилированное приложение переднего плана может быть опубликовано на компьютере, например, сохранено в каталоге /home/frontend/assets/

1 2 3 4 5
/home/frontend/assets/index.html /home/frontend/assets/200.html /home/frontend/assets/app.839ca9.js /home/frontend/assets/common.537a50.js /home/frontend/assets/chunk.d45858.js

И мы надеемся получить эти ресурсы через festatic.fibjs.org, мы можем написать так:

1
fileRoutes.host('festatic.fibjs.org', http.fileHandlers('/home/frontend/assets/'))

API-сервер

Предполагая, что на вашем компьютере есть серверы API, вы хотите объединить их с именем домена api.fibjs.org , но назначить разные пути, такие как:

API-сервер использование Дорожка
http://127.0.0.1:3001 Сервис пользователя / пользователь
http://127.0.0.1:8080 Biz1 / biz1
http://127.0.0.1:9007 Biz2 / biz2

Тогда ты можешь:

1 2 3 4 5 6 7 8 9 10
const mq = require('mq') const apiRoutes = new mq.Routing(); // proxyTo 是代理请求到对应 origin 的函数 apiRoutes.host('api.fibjs.org', { '/user': (req) => proxyTo(req, `http://127.0.0.1:3001`), '/biz1': (req) => proxyTo(req, `http://127.0.0.1:8080`), '/biz2': (req) => proxyTo(req, `http://127.0.0.1:9007`), })

Кроме того, если вы хотите, чтобы путь / biz1 принимал только запросы HTTP POST, вы можете:

1 2 3 4 5 6 7 8 9
const mq = require('mq') const apiRoutes = new mq.Routing(); apiRoutes.host('api.fibjs.org', { '/user': (req) => proxyTo(req, `http://127.0.0.1:3001`), '/biz1': apiRoutes.post((req) => proxyTo(req, `http://127.0.0.1:8080`)), '/biz2': (req) => proxyTo(req, `http://127.0.0.1:9007`), })

Обратите внимание, что api.fibjs.org уже должен быть привязан к текущей машине

Сложный пример

Если нет другого объявления, в следующем примере существуют следующие функции:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
// 生成带特定 host 的请求 function getRequest({ path = '/', host = 'www.fibjs.org' }) { const req = new http.Request() req.value = path req.addHeader('host', host) return req } // 以 method 尝试对 routes 发起一个 header: host=host 的请求 function invokePathFromHost (path, host, method = 'GET') { const req = getRequest({ path, host }) req.method = method mq.invoke(routes, req) const result = req.response.body.readAll() return result ? result.toString() : result }

Распределение доменных имен

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
const mq = require('mq') const http = require('http') const assert = require('assert') const routes = new mq.Routing(); routes.host('api.fibjs.org', [ { '/user/information': req => req.response.json({name: 'xicilion'}), }, req => req.response.body.rewind() ]) // routes.host 方法可以多次调用 routes.host('*.fibjs.org', [ { '/': req => req.response.json({message: 'I am in root'}), '/index.html': req => req.response.body.write(`<html><body>hello fibjs</body></html>`), '/index.js': req => req.response.body.write(`console.log('hello world')`), '*': (req, domain) => { req.response.json({message: 'I am fallback'}) } }, req => req.response.body.rewind() ]) assert.equal( invokePathFromHost('/', 'www.fibjs.org'), `{"message":"I am in root"}` ) assert.equal( invokePathFromHost('/index.html', 'static.fibjs.org'), `<html><body>hello fibjs</body></html>` ) assert.equal( invokePathFromHost('/index.js', 'static.fibjs.org'), `console.log('hello world')` ) assert.equal( invokePathFromHost('/user/information', 'api.fibjs.org'), JSON.stringify({name: 'xicilion'}) ) try { invokePathFromHost('/', 'fibjs.org') } catch (error) { assert.equal(error, 'Error: Routing: unknown routing: fibjs.org') }

Затем вам нужно только смонтировать маршруты в вышеприведенном примере к серверу http (s), и он может начать работать. Если сервер прослушивает порт по умолчанию на машине, на которой он расположен (обычно 80), тогда один из них основан на имени домена. Сервисы шлюза для разных маршрутов встроены - это означает, что для выполнения одной и той же функции вы можете использовать только mq.Routing от fibjs вместо установки традиционных сервисов шлюза, таких как nginx / apache / tomcat / iis.