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

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

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

1 2 3 4 5 6 7 8 9 10 11 12
const mq = require('mq') const rt = new mq.Routing(); // support *.fibjs.org in Routing rt.host('*.fibjs.org', ...) // support api.fibjs.org in Routing rt.host('api.fibjs.org', ...) // support fibjs.org in Routing rt.host('fibjs.org', ...) rt.append('host', 'fibjs.org', ...)

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

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

Простые обработчики файлов

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

1 2 3 4 5 6
const mq = require('mq') const http = require('http') const fileRoutes = new mq.Routing(); // support file.fibjs.org in Routing 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 Биз1 /biz1
http://127.0.0.1:9007 Биз2 /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.

👉 [ Использование сертификата X509 в fibjs ]