가이드 개발 가이드

도메인 이름 라우팅

0.28.0부터 fibjsmq.Routing 객체는 도메인 이름 라우팅으로 HOST 메서드를 지원합니다.

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

몇 가지 예를 살펴보겠습니다.

간단한 예

간단한 파일 핸들러

도메인 이름 fibjs.org가 애플리케이션이 있는 시스템에 바인딩되어 있다고 가정하고(테스트 목적으로 호스트를 로컬에서 수정하여 이 바인딩 효과를 얻을 수도 있음) file.fibjs.orgFILE_DIR에서 파일 리소스를 다운로드할 수 있기를 바랍니다. 디렉토리에서 다음을 수행할 수 있습니다.

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

프런트 엔드 리소스 호스트

일반적인 시나리오는 컴파일된 프런트 엔드 애플리케이션이 컴퓨터에 게시될 수 있다는 것입니다. 예를 들어 /home/frontend/assets/디렉터리 에 저장됩니다.

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

festatic.fibjs.org를 통해 이러한 리소스를 얻으려면 다음과 같이 작성할 수 있습니다.

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

API 서버

컴퓨터에 API 서버가 있고 이를 api.fibjs.org이 도메인 이름으로 통합하고 싶지만 다음과 같은 다른 경로를 할당한다고 가정합니다.

API 서버 용법
http://127.0.0.1:3001 사용자 서비스 /사용자
http://127.0.0.1:8080 비즈1 /biz1
http://127.0.0.1:9007 비즈2 /biz2

그런 다음 다음을 수행할 수 있습니다.

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

또한 '/biz1' 경로가 http POST 요청만 허용하도록 하려면 다음을 수행할 수 있습니다.

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

api.fibjs.org 는 현재 시스템에 바인딩되어야 합니다.

복잡한 예

다른 선언이 없으면 다음 예에는 다음 함수가 존재합니다.

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 }

도메인 이름 전환

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

다음으로 위 예의 경로를 http(s)Server에 마운트하기만 하면 작동을 시작할 수 있습니다. 서버가 시스템의 기본 포트(일반적으로 80)를 수신하는 경우 트래픽 분산은 도메인 이름 다양한 경로에 대한 게이트웨이 서비스가 설정되었습니다. 이는 동일한 기능을 완료하려면 nginx/apache/tomcat/iis와 같은 기존 게이트웨이 서비스를 설치할 필요 없이 fibjs의 mq.Routing만 사용할 수 있음을 의미합니다.

👉 [ fibjs에서 X509 인증서 사용 ]