Moleculer Runner 是一個輔助腳本,它可以幫你管理 Moleculer 服務。有了它,你就不用自己建立帶有選項的 ServiceBroker 實例,只要在根目錄新增一個 moleculer.config.js
配置檔,將 Broker 的選項寫在文件內即可。使用時僅需在 npm
腳本中加入 moleculer-runner
來執行,它就會自動載入配置檔,然後創建所有的 Broker 並載入服務。
你可以在配置檔中設定開發用的選項,然後將參數宣告為環境變數,如此一來就可以在生產環境中使用環境變數來替換參數值。
$ moleculer-runner [options] [service files or directories or glob masks]
這個語法只能在 npm 腳本上執行,如果你需要直接在主控台執行的話,請使用
./node_modules/.bin/moleculer-runner --repl
或node ./node_modules/moleculer/bin/moleculer-runner.js --repl
來執行。
名稱 | 類型 | 預設值 | 說明 |
---|---|---|---|
-r , --repl |
Boolean |
false |
是否在 Broker 啟動後切換到 REPL 模式。 |
-s , --silent |
Boolean |
false |
禁用 Log 紀錄,主控台將不會顯示任何東西。 |
-H , --hot |
Boolean |
false |
服務改變時就 Hot Reload |
-c , --config <file> |
String |
null |
配置檔的路徑 |
-e , --env |
Boolean |
false |
從當前目錄的 .env 檔案讀取環境變數 |
-E , --envfile <file> |
String |
null |
從指定檔案讀取環境變數 |
-i , --instances |
Number |
null |
指定 Node 實例數量或是設定 max 使用完整 CPU 核心 |
範例:
{
"scripts": {
"dev": "moleculer-runner --repl --hot --config moleculer.dev.config.js services",
"start": "moleculer-runner --instances=max services"
}
}
dev
腳本會讀取moleculer.dev.config.js
配置檔,會啟動所有services
目錄下的服務並開始 REPL 模式,如果服務改變時會 Hot Reload 。start
腳本預設會讀取moleculer.config.js
配置檔,如果檔案不存在的話則使用環境變數,接著會啟動所有services
目錄下的服務。根據 CPU 數量啟動對應數量的 Broker 實例,最後啟動所有services
目錄下的服務。
Runner 會根據以下步驟來讀取與合併配置:
MOLECULER_CONFIG
環境變數讀取配置檔,如果檔案不存在則會拋出錯誤。MOLECULER_CONFIG
存在則會被優先使用。moleculer.config.js
配置檔。如果不存在則會讀取 moleculer.config.json
檔案。ServiceBroker
的預設選項。logLevel: "warn"
,但是環境變數也定義了 LOGLEVEL=debug
,這時候 Runner 會覆蓋它變成 logLevel: "debug"
。假如你想在
.env
環境變數中對不存在於配置檔的深層對象做設定,請使用MOL_
作為前綴表示它是一個 Moleculer 的環境變數,以及雙底線__
作為巢狀屬性分隔符號。例如要將cacher.options.prefix
設為MOL
,會是這樣宣告MOL_CACHER__OPTIONS__PREFIX=MOL
。
配置檔的格式與 Broker 選項相同,每個屬性設定的名稱都相同。
範例:
moleculer.config.js
module.exports = {
nodeID: "node-test",
logger: true,
logLevel: "debug",
transporter: "nats://localhost:4222",
requestTimeout: 5 * 1000,
circuitBreaker: {
enabled: true
},
metrics: true
};
由於 Runner 也是一個 JS 程式,所以你可以使用異步的方式取得配置檔。這種情況下, moleculer.config.js
必須透過 Function
來返回一個 Promise
。
範例:
moleculer.config.js
const fetch = require("node-fetch");
module.exports = async function() {
const res = await fetch("https://pastebin.com/raw/SLZRqfHX");
return await res.json();
};
此函數跑在
MoleculerRunner
實例且包含了this
Context,所以你可以透過 runner 取得flags
資料。更多資訊請參閱 Runner 原始碼[2] 。
Runner 會將屬性名稱轉為大寫,如果有巢狀屬性則會將名稱轉為底線 _
。
範例:
NODEID=node-test
LOGGER=true
LOGLEVEL=debug
# 速記 Transporter
TRANSPORTER=nats://localhost:4222
REQUESTTIMEOUT=5000
# 巢狀屬性
CIRCUITBREAKER_ENABLED=true
METRICS=true
Runner 會由 CLI 參數讀取檔案或服務目錄。你可以由 SERVICES
及 SERVICEDIR
環境變數來定義服務目錄,它會從指定的目錄及子目錄底下讀取所有的服務 **/*.service.js
。
Runner 會根據以下邏輯來讀取:
.env
內的 SERVICEDIR
存在,但是 SERVICES
不存在,它會由 SERVICEDIR
目錄讀取所有的服務。.env
內的 SERVICEDIR
與 SERVICES
同時存在,它會由 SERVICEDIR
目錄讀取指定的服務。.env
內的 SERVICEDIR
不存在,但是 SERVICES
存在,它會由當前的目錄讀取指定的服務。glob
匹配語法,則根據語意讀取找到的檔案。注意,縮寫的檔案名稱也可以作為
SERVICES
參數被找到。
範例:在 services
目錄下讀取 math.service.js
、 post.service.js
與 user.service.js
服務。
SERVICEDIR=services
SERVICES=math,post,user
範例:在 services
目錄及子目錄讀取所有的 *.service.js
服務。
SERVICEDIR=my-services
如果你需要更多的方式,可以使用 glob 模式。它可以讓你很方便的來排除某些服務。
$ moleculer-runner services !services/others/**/*.service.js services/others/mandatory/main.service.js
說明:
services
- 傳統方式。由 services
目錄下讀取 **/*.service.js
所有檔案。!services/others/**/*.service.js
- 排除 services/others
目錄及子目錄的服務。services/others/mandatory/main.service.js
- 載入指定的單一服務。
SERVICES
環境變數也可以使用 glob。
Runner 內建了一個叢集函數,可以用來啟動多個 Broker 實例。
例如:以 4 個實例來啟動 services
目錄下的所有的服務。
$ moleculer-runner --instances 4 services
叢集節點 ID,如果你在選項中定義了節點 ID 為
my-node
,當你啟動 4 個實例後,實例中的節點 ID 將會變成my-node-1
、my-node-2
、my-node-3
與my-node-4
。
Runner 可以在啟動時讀取 .env
檔案。你可以從兩個 CLI 選向來讀取 env 檔案。
-e, --env
- 由當前目錄的 .env
檔案來讀取環境變數。-E, --envfile <filename>
- 從指定路徑讀取環境變數檔案。範例:從當前目錄讀取 .env
$ moleculer-runner --env
範例:從指定路徑讀取 .env
$ moleculer-runner --envfile .my-env
[1] Moleculer Runner, https://moleculer.services/docs/0.14/runner.html
[2] Runner https://github.com/moleculerjs/moleculer/blob/master/src/runner.js