Instradamento dei nomi di dominio
A partire dalla versione 0.28.0, fibjs
l'oggetto mq.Routing supporta il metodo HOST come instradamento dei nomi di dominio.
1
2
3
4
5
6
7
8
9
10
11
12const 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', ...)
Diamo un'occhiata ad alcuni esempi.
Esempio semplice
Gestori di file semplici
Supponiamo che il nome di dominio fibjs.org sia stato associato alla macchina su cui si trova la nostra applicazione (a scopo di test, è anche possibile ottenere questo effetto vincolante modificando Hosts localmente), e speriamo di poter file.fibjs.org
scaricare le risorse del file nella FILE_DIR directory sulla macchina, possiamo fare questo:
1
2
3
4
5
6const 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 di risorse front-end
Uno scenario tipico è che l'applicazione front-end compilata possa essere pubblicata sulla macchina, ad esempio salvata nella /home/frontend/assets/
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
E se vogliamo ottenere queste risorse tramite festatic.fibjs.org, possiamo scrivere in questo modo:
1fileRoutes.host('festatic.fibjs.org', http.fileHandlers('/home/frontend/assets/'))
server API
Supponiamo che ci siano server API sul tuo computer e che desideri unificarli a api.fibjs.org
questo nome di dominio, ma assegnare percorsi diversi, come ad esempio:
Server API | Utilizzo | Sentiero |
---|---|---|
http://127.0.0.1:3001 | Servizio utenti | /utente |
http://127.0.0.1:8080 | Biz1 | /biz1 |
http://127.0.0.1:9007 | Biz2 | /biz2 |
Allora puoi:
1
2
3
4
5
6
7
8
9
10const 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`),
})
Inoltre, se desideri che il percorso "/biz1" accetti solo richieste http POST, puoi:
1
2
3
4
5
6
7
8
9const 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`),
})
Tieni presente che api.fibjs.org deve essere associato alla macchina corrente
Esempio complesso
Se non sono presenti altre dichiarazioni, nell'esempio seguente esistono le seguenti funzioni:
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
}
Deviazione del nome di dominio
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
36const 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')
}
Successivamente, devi solo montare i percorsi nell'esempio precedente su un server http(s) e può iniziare a funzionare. Se il server ascolta la porta predefinita della macchina (solitamente 80), allora una distribuzione del traffico basata sulla nome dominio Sono stati impostati servizi gateway per percorsi diversi, ciò significa che per completare la stessa funzione è possibile utilizzare solo mq.Routing di fibjs senza dover installare servizi gateway tradizionali come nginx/apache/tomcat/iis.