Routage de nom de domaine
À partir de la version 0.28.0, fibjs
l'objet mq.Routing prend en charge la méthode HOST comme routage de nom de domaine.
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', ...)
Regardons quelques exemples.
Exemple simple
Gestionnaires de fichiers simples
Supposons que le nom de domaine fibjs.org ait été lié à la machine sur laquelle se trouve notre application (à des fins de test, vous pouvez également obtenir cet effet de liaison en modifiant les hôtes localement), et nous espérons pouvoir file.fibjs.org
télécharger les ressources du fichier dans le FILE_DIR. répertoire sur la machine, on peut faire ceci :
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))
Hôte de ressources frontales
Un scénario typique est que l'application frontale compilée peut être publiée sur la machine, par exemple enregistrée dans /home/frontend/assets/
le répertoire
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
Et si nous voulons obtenir ces ressources via festatic.fibjs.org, nous pouvons écrire comme ceci :
1fileRoutes.host('festatic.fibjs.org', http.fileHandlers('/home/frontend/assets/'))
serveur API
Supposons qu'il y ait des serveurs API sur votre machine et que vous souhaitiez les unifier avec api.fibjs.org
ce nom de domaine, mais attribuer des chemins différents, tels que :
Serveur API | Usage | Chemin |
---|---|---|
http://127.0.0.1:3001 | Service utilisateur | /utilisateur |
http://127.0.0.1:8080 | Entreprise1 | /biz1 |
http://127.0.0.1:9007 | Biz2 | /biz2 |
Ensuite vous pouvez:
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`),
})
De plus, si vous souhaitez que le chemin '/biz1' n'accepte que les requêtes http POST, vous pouvez :
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`),
})
Notez que api.fibjs.org doit être lié à la machine actuelle
Exemple complexe
S'il n'y a pas d'autres déclarations, dans l'exemple suivant, les fonctions suivantes existent :
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
}
Détournement de nom de domaine
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')
}
Ensuite, il vous suffit de monter les routes de l'exemple ci-dessus sur un serveur http(s), et il peut commencer à fonctionner. Si le serveur écoute le port par défaut de la machine (généralement 80), alors une répartition du trafic basée sur le nom de domaine Les services de passerelle pour différentes routes ont été configurés - cela signifie que pour remplir la même fonction, vous ne pouvez utiliser que le mq.Routing de fibjs sans avoir à installer des services de passerelle traditionnels tels que nginx/apache/tomcat/iis.