Gids voor ontwikkeling

Routering van domeinnamen

Vanaf 0.28.0 fibjsondersteunt het mq.Routing-object de HOST-methode als domeinnaamroutering.

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', ...)

Laten we eens kijken naar enkele voorbeelden.

Eenvoudig voorbeeld

Eenvoudige bestandshandlers

Stel dat de domeinnaam fibjs.org is gekoppeld aan de machine waarop onze applicatie zich bevindt (voor testdoeleinden kunt u dit bindende effect ook bereiken door Hosts lokaal aan te passen), en we hopen file.fibjs.orgbestandsbronnen te kunnen downloaden in de FILE_DIR map op de machine, kunnen we dit doen:

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

Host van front-endbronnen

Een typisch scenario is dat de gecompileerde front-end-applicatie naar de machine kan worden gepubliceerd, bijvoorbeeld opgeslagen in /home/frontend/assets/de directory

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

En als we deze bronnen willen verkrijgen via festatic.fibjs.org, kunnen we als volgt schrijven:

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

API-server

Stel dat er API-servers op uw computer staan ​​en u deze wilt verenigen met api.fibjs.orgdeze domeinnaam, maar verschillende paden wilt toewijzen, zoals:

API-server Gebruik Pad
http://127.0.0.1:3001 Gebruikersservice /gebruiker
http://127.0.0.1:8080 Biz1 /biz1
http://127.0.0.1:9007 Biz2 /biz2

Dan kunt u:

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

Als u bovendien wilt dat het pad '/biz1' alleen http POST-verzoeken accepteert, kunt u:

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

Merk op dat api.fibjs.org gebonden moet zijn aan de huidige machine

Complex voorbeeld

Als er geen andere declaraties zijn, bestaan ​​in het volgende voorbeeld de volgende functies:

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 }

Domeinnaamomleiding

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

Vervolgens hoeft u alleen maar de routes uit bovenstaand voorbeeld aan te koppelen aan een http(s)Server, en deze kan gaan werken.Als de server naar de standaardpoort van de machine luistert (meestal 80), dan wordt er een verkeersverdeling gebaseerd op de domeinnaam De gatewayservices voor verschillende routes zijn ingesteld - dit betekent dat om dezelfde functie te voltooien, u alleen mq.Routing van fibjs kunt gebruiken zonder dat u traditionele gatewayservices zoals nginx/apache/tomcat/iis hoeft te installeren.

👉 [ Gebruik van X509-certificaat in fibjs ]