Routering van domeinnamen
Vanaf 0.28.0 fibjs
ondersteunt het mq.Routing-object de HOST-methode als domeinnaamroutering.
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', ...)
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.org
bestandsbronnen te kunnen downloaden in de FILE_DIR map op de machine, kunnen we dit doen:
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 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:
1fileRoutes.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.org
deze 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
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`),
})
Als u bovendien wilt dat het pad '/biz1' alleen http POST-verzoeken accepteert, kunt u:
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`),
})
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
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')
}
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.