Routing von Domainnamen
Ab 0.28.0 fibjs
unterstützt das mq.Routing-Objekt die HOST-Methode als Domänennamen-Routing.
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', ...)
Schauen wir uns einige Beispiele an.
Einfaches Beispiel
Einfache FileHandler
Angenommen, der Domänenname fibjs.org wurde an den Computer gebunden, auf dem sich unsere Anwendung befindet (zu Testzwecken können Sie diesen Bindungseffekt auch durch lokales Ändern von Hosts erzielen), und wir hoffen, file.fibjs.org
Dateiressourcen im FILE_DIR herunterladen zu können Verzeichnis auf der Maschine, können wir Folgendes tun:
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))
Front-End-Ressourcenhost
Ein typisches Szenario besteht darin, dass die kompilierte Front-End-Anwendung auf dem Computer veröffentlicht und beispielsweise im /home/frontend/assets/
Verzeichnis gespeichert wird
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
Und wenn wir diese Ressourcen über festatic.fibjs.org erhalten möchten, können wir so schreiben:
1fileRoutes.host('festatic.fibjs.org', http.fileHandlers('/home/frontend/assets/'))
API-Server
Angenommen, es gibt API-Server auf Ihrem Computer und Sie möchten diese mit api.fibjs.org
diesem Domänennamen vereinheitlichen, aber unterschiedliche Pfade zuweisen, wie zum Beispiel:
API-Server | Verwendung | Weg |
---|---|---|
http://127.0.0.1:3001 | Benutzerservice | /Benutzer |
http://127.0.0.1:8080 | Biz1 | /biz1 |
http://127.0.0.1:9007 | Biz2 | /biz2 |
Dann kannst du:
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`),
})
Wenn Sie außerdem möchten, dass der Pfad „/biz1“ nur HTTP-POST-Anfragen akzeptiert, können Sie Folgendes tun:
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`),
})
Beachten Sie, dass api.fibjs.org an den aktuellen Computer gebunden sein muss
Komplexes Beispiel
Wenn keine anderen Deklarationen vorhanden sind, existieren im folgenden Beispiel die folgenden Funktionen:
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
}
Umleitung von Domainnamen
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')
}
Als nächstes müssen Sie nur noch die Routen im obigen Beispiel auf einem http(s)-Server mounten, und schon kann es losgehen. Wenn der Server auf den Standard-Port der Maschine lauscht (normalerweise 80), dann erfolgt eine Verkehrsverteilung basierend auf dem Domänenname Die Gateway-Dienste für verschiedene Routen wurden eingerichtet. Dies bedeutet, dass Sie zum Ausführen derselben Funktion nur mq.Routing von fibjs verwenden können, ohne herkömmliche Gateway-Dienste wie nginx/Apache/Tomcat/iis installieren zu müssen.