iT邦幫忙

2022 iThome 鐵人賽

DAY 28
1

REPL 主控台

moleculer-repl 是 Moleculer 專用的開發者互動式主控台。你可以利用它來得到目前服務相關資訊,也可以對服務下達一些動作或事件。

安裝

npm install moleculer-repl --save

使用

在 Broker 啟動後切換到 REPL 模式。

const broker = new ServiceBroker();

broker.start().then(() => {
    // 切換到 REPL 模式
    broker.repl();
});

REPL 指令

Commands:
  actions [options]                                          actions 清單
  bench [options] <action> [jsonParams] [meta]               測量服務 action
  broadcast <eventName>                                      廣播事件
  broadcastLocal <eventName>                                 本地廣播事件
  cache                                                      快取訊息
  call [options] <actionName> [jsonParams] [meta]            呼叫 Action
  dcall [options] <nodeID> <actionName> [jsonParams] [meta]  Direct call action
  clear [pattern]                                            清除快取實體
  cls                                                        清除主控台
  destroy <serviceName>                                      銷毀一個本地服務
  emit <eventName>                                           發送事件
  env                                                        環境變數清單
  events [options]                                           事件監聽清單
  info                                                       顯示常用資訊
  listener                                                   新增移除事件監聽
  load <servicePath>                                         從檔案讀取服務
  loadFolder <serviceFolder> [fileMask]                      由目錄讀取所有服務
  metrics [options]                                          Metrics 清單
  nodes [options]                                            節點清單
  exit|q                                                     離開應用
  services [options]                                         服務清單
  help [command]                                             指令說明

節點清單

mol $ nodes

選項:

-a, --all             所有節點清單(包含離線節點)
-d, --details         詳細清單
-f, --filter <match>  過濾節點 (例如: 'node-*')
--raw                 輸出註冊表到 JSON
--save [filename]     儲存註冊表到 JSON 檔案

輸出結果:


Fig. 1. 節點一般輸出結果

詳細輸出結果:


Fig. 2. 節點詳細輸出結果

服務清單

mol $ services

選項:

-a, --all             所有服務清單 (包含離線服務)
-d, --details         印出詳細端點資訊
-f, --filter <match>  過濾服務 (例如: 'user*')
-i, --skipinternal    跳過內部服務
-l, --local           僅本地服務

輸出:


Fig. 3. 服務一般輸出結果

詳細輸出結果:


Fig. 4. 服務詳細輸出結果

Actions 清單

mol $ actions

選項:

-a, --all             所有 Action 清單(包含離線 Action )
-d, --details         印出詳細端點資訊
-f, --filter <match>  過濾 actions (例如: 'users.*')
-i, --skipinternal    跳過內部 actions
-l, --local           僅本地 actions


Fig. 5. Actions 一般輸出結果


Fig. 6. Actions 詳細輸出結果

事件清單

mol $ events

選項:

-a, --all             所有事件清單(包含離線事件)
-d, --details         印出詳細端點資訊
-f, --filter <match>  過濾事件監聽器 (例如: 'user.*')
-i, --skipinternal    跳過內部事件監聽器
-l, --local           僅本地事件監聽器


Fig. 7. 事件一般輸出結果


Fig. 8. 事件詳細輸出結果

顯示常用資訊

mol $ info


Fig. 9. info 輸出結果

環境變數清單

mol $ env

呼叫 Action

mol $ call "test.hello"


Fig. 10. call 輸出結果

選項:

--help               指令說明
--load [filename]    由檔案讀取參數
--stream [filename]  發送一個串流檔案
--save [filename]    儲存響應的檔案

範例:夾帶參數來呼叫 Action 。

# 參數: `{ a: 5, b: 'Bob', c: true, d: false, e: { f: 'hello' } }`
mol $ call "math.add" --a 5 --b Bob --c --no-d --e.f "hello"

範例:夾帶參數、 meta 及選項來呼叫 Action 。

# 參數: `{ a: 5 }`
# Meta : `{ b: 'Bob' }`
# 選項: `{ timeout: 1 }`
mol $ call "math.add" --a 5 --#b Bob --$timeout 1

範例:夾帶 JSON 字串參數來呼叫 Action 。

# 參數: `{ a: 5, b: 'Bob', c: true, d: { e: 'hello' } }`
mol $ call "math.add" '{"a": 5, "b": "Bob", "c": true, "d": { "e": "hello" } }'

範例:夾帶參數檔來呼叫 Action ,會嘗試讀取當前目錄的 math.add.params.json 檔案。

mol $ call "math.add" --load

範例:夾帶參數檔來呼叫 Action ,會讀取指定的 my-params.json 檔案。

mol $ call "math.add" --load my-params.json

範例:夾帶串流檔案來呼叫 Action ,它會讀取 my-picture.jpg 然後以串流形式發送到 photo.add action 。

mol $ call "photo.add" --stream my-picture.jpg

範例:呼叫 Action 後儲存響應的檔案。

它會將響應的資料儲存到當前目錄的 photo.download.response.stream ,假如響應的是物件則副檔名會是 .json ,如果是純文字則副檔名會是 .txt

mol $ call "photo.download" --save

範例:呼叫 Action 後指定儲存響應的檔案。

mol $ call "photo.download" --save my-response.jpg

Direct call

dcall 的用法與 call 幾乎相同,差異在於可以指定節點。

範例:指定節點呼叫 Action

mol $ dcall "node-12" "$node.health"

發送事件

mol $ emit "user.created"

範例:夾帶參數來發送事件。

# 參數: `{ a: 5, b: 'Bob', c: true, d: false, e: { f: 'hello' } }`
mol $ emit "user.created" --a 5 --b Bob --c --no-d --e.f "hello"

範例:夾帶參數、 meta 及選項來發送事件。

# 參數: `{ a: 5 }`
# Meta : `{ b: 'Bob' }`
# 選項: `{ groups: 'abc' }`
mol $ emit "user.created" --a 5 --#b Bob --$groups abc

Benchmark 服務

bench 指令可以用來測量你的服務,得到一些時間統計資訊。

# 呼叫一個服務 Action 5 秒
mol $ bench math.add

# 呼叫一個服務 Action 5000 次
mol $ bench --num 5000 math.add

# 呼叫一個服務 Action 30 秒
mol $ bench --time 30 math.add

選項:

--num <number>     迭代次數
--time <seconds>   持續時間
--nodeID <nodeID>  節點 ID (direct call)


Fig. 11. Bench 輸出結果

範例:夾帶 JSON 字串參數來測量。

注意,你只能使用 JSON 字串作為參數。

mol $ bench math.add '{ "a": 50, "b": 32 }'

從檔案讀取服務

mol $ load "./math.service.js"

由目錄讀取所有服務

mol $ load "./services"

Metrics 清單

mol $ metrics

選項:

-f, --filter <match>  過濾 metrics (例如: 'moleculer.**')


Fig. 12. Metrics 輸出結果

快取鍵值

cache keys 指令可以列出快取清單。

選項:

-f, --filter <match>  過濾鍵值

清除快取

cache clear 指令可以清除所有的快取實體。

mol $ cache clear

範例:依匹配規則清除快取。

mol $ cache clear greeter.*

事件監聽器

listener 指令可以用來訂閱與監聽事件。

範例:訂閱事件。

mol $ listener add user.created

範例:訂閱群組事件。

mol $ listener add user.created --group abcd

範例:取消訂閱。

mol $ listener remove user.created

範例:列出 REPL 監聽的事件清單。

mol $ listener list

客製化命令

你也可以在配置檔中建立多個客製化命令。

moleculer.config.js

module.exports = {
    replCommands: [
        {
            command: "hello <name>",
            description: "Call the greeter.hello service with name",
            alias: "hi",
            options: [
                { option: "-u, --uppercase", description: "Uppercase the name" }
            ],
            types: {
                string: ["name"],
                boolean: ["u", "uppercase"]
            },
            // parse(command, args) {},
            // validate(args) {},
            // help(args) {},
            allowUnknownOptions: true,
            action(broker, args, helpers) {
                const name = args.options.uppercase ? args.name.toUpperCase() : args.name;
                return broker.call("greeter.hello", { name }).then(console.log);
            }
        }
    ]
};

結果:

mol $ hello -u John
Hello JOHN

參考文獻

[1] REPL console, https://moleculer.services/docs/0.14/moleculer-repl.html

家家酒小劇場

  • Otter - REPL 好像有些功能與 CLI 主控台相似?
  • Boxy - REPL 主要針對的是正在執行的服務,需要手動進行測試或是觀看資訊時是很有幫助的。

上一篇
Day 27 : CLI 工具
下一篇
Day 29 : 測試
系列文
Moleculer 家家酒31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言