昨天已經帶給大家 Moleculer 的核心概念,今天要介紹的是 Moleculer 的主要元件之一 Broker
[1]。每個節點都需要建立一個 Broker 來運作,它可以處理服務、呼叫、發送事件並與遠端節點進行通訊。
Fig. 1. Broker 功能項
Broker 所提供的功能非常多,今天將著重於討論如何建立 ServiceBroker
,日後再來介紹每個子功能。
這是一個基本 Broker 物件的建立方式,開發者可以在每個節點的 Broker 設置不同的客製化參數,也可以使用官方推薦的 Moleculer Runner
來替代,它能夠協助開發者更方便的管理與設置參數。
const { ServiceBroker } = require("moleculer");
const broker = new ServiceBroker({
nodeID: "node-1",
transporter: "nats://localhost:4222",
logLevel: "debug",
requestTimeout: 5 * 1000,
metadata: {
region: "eu-west1"
}
});
參數說明:
nodeID
節點的名稱,必須是整個系統中唯一的。transporter
Transporter 的路徑,用來讓 Broker 與遠端節點溝通。logLevel
日誌的級別,可以設定 fatal
、 error
、 warn
、 info
、 debug
、 trace
,細節將在後續章節說明。requestTimeout
伺服器逾時設定。metadata
用來儲存自定義的資料,可用於客製化中間件或客製化負載平衡策略。
metadata
可以呼叫 $node.list
來獲得metadata
可以被轉送到其它節點網路環境是複雜且動態的,難以保證連線品質及其有效性,為了確保在多個節點間的連線是否正常,我們可以透過 broker.ping
方法測試封包是否能達到指定或全部的遠端節點,它可以返回延遲時間、時間差資訊來判斷節點是否正常運作。
broker.ping([nodeID[, timeout]])
參數說明:
nodeID
<String> | <String[]> 節點ID,可以指定單一字串、字串陣列,不填則輸出全部。timeout
<Number> 逾時時間(毫秒)。單一節點請求範例:
broker.ping("node-123", 1000)
.then(res => broker.logger.info(res));
輸出:
{
nodeID: "node-123",
elapsedTime: 16,
timeDiff: -3
}
參數說明:
nodeID
節點 ID。elapsedTime
總花費時間。timeDiff
為系統時間差。多節點請求範例:
broker.ping(["node-100", "node-102"])
.then(res => broker.logger.info(res));
輸出:
{
"node-100": {
nodeID: "node-100",
elapsedTime: 10,
timeDiff: -2
},
"node-102": {
nodeID: "node-102",
elapsedTime: 250,
timeDiff: 850
}
}
一套複雜的系統運作時難免遇到異常的錯誤,這時候可以使用 errorHandler
來處理全域通用的錯誤,它能協助捕獲 action 與 event 中未處理的錯誤。
const broker = new ServiceBroker({
errorHandler(err, info) {
// 捕獲錯誤
this.logger.warn("Log the error:", err);
// 拋出錯誤
throw err;
}
});
參數說明:
err
錯誤的物件內容info
包含 Broker 與 服務實例,context、action 與 event 定義。Moleculer 的 Broker 除了上述幾項常用的參數外,還有更多的參數供使用,可以參考 Configuration 說明文件來進行配置:
https://moleculer.services/docs/0.14/configuration.html
[1] Broker, https://moleculer.services/docs/0.14/broker.html
Moleculer Runner
,可以由一個設定檔來管理所有的服務,也可以設置系統環境變數來套用,就不用一個一個配置參數了。