Service
指的是 Moleculer
框架中的微服務,也就是 broker
執行 createService
時的內容。例如你可以在微服務中定義 action
並且訂閱到 events
,要創建服務必須要定義好其綱目。
Service
主要有 name
、 version
、 settings
、 actions
、 methods
、 events
六個部分:
name
<String> 是一個必填屬性,當我們要呼叫微服務時,會使用這個名字來進行呼叫,所以在命名時建議不要太過複雜。version
<Number> | <String> 是選填的版本號,也同時是服務的前綴,可以用來執行多個相同名稱但不同版本的服務。settings
<Object> 可用於設定靜態配置,然後透過 this.settings
來使用內部的配置。actions
<Object> 用於建立可呼叫的共用方法,例如 CRUD 。可以使用 broker.call
或 ctx.call
來呼叫方法。methods
<Object> 用於建立私有的方法,只可以在服務內呼叫它,但不能使用 broker.call
來呼叫它。events
<Object> 用於訂閱事件活動。今天會先用一些簡單的範例,讓大家快速的了解一下六個部分的用法,概念性的理解 Moleculer 的服務綱目:
baby.service.js
module.exports = {
name: "baby",
version: 1,
settings: {
weight: 0.5
},
actions: {
create() {
return "Baby " + this.gender() + " Born!";
}
},
methods: {
gender() {
return Math.random() < this.settings.weight ? "Boy" : "Girl";
}
},
events: {
"baby.created"() {
console.log("Congratulations!");
},
}
};
在設定了服務的名稱與版本號後,在呼叫的時候可以加上版本前綴,並且指定服務的名稱及執行的方法,以 baby.service.js
為例,呼叫的範例如下:
broker.call("v1.baby.create");
核心模組 Service
提供了內部參數,這些參數設定會使用 $ 字號來命名。
名稱 | 類型 | 預設值 | 說明 |
---|---|---|---|
$noVersionPrefix |
<Boolean> | false |
禁用版本號作為方法名稱的前綴。 |
$noServiceNamePrefix |
<Boolean> | false |
禁用服務名稱作為方法名稱的前綴。 |
$dependencyTimeout |
<Number> | 0 |
依賴項逾時時間。 |
$shutdownTimeout |
<Number> | 0 |
主動請求關閉逾時時間。 |
$secureSettings |
<Array> | [] |
安全設定列表,可將私密資訊限制僅在此服務可用。 |
patient.service.js
module.exports = {
name: "patient",
settings: {
$secureSettings: ["patient.name"],
patient: {
id: "1",
name: "Boxy Huang"
}
}
};
客製化參數設定,以 baby.service.js
為例,在 settings
中的 weight
就是一個客製化的參數,可以提供服務內運算使用。
另外 settings
也可以將參數提供給 mixins
函數使用,例如在 API Gateway
服務中使用 moleculer-web
時,可以在 settings
中變更預設的連接埠號:
api.service.js
const ApiGateway = require("moleculer-web");
module.exports = {
name: "api",
mixins: [ApiGateway],
settings: {
// 變更連接埠
port: 8080
}
};
另外詳細合併方法可參考官方表格說明:
https://moleculer.services/docs/0.14/services.html#Merge-algorithm
Action 可以是一個 Function
或是一個物件型態包含屬性設定及 handler
, Action 必須被放在 actions
的鍵值。
module.exports = {
name: "back-end",
actions: {
// 一般 Action
sleep(ctx) {
return "Sleeping!";
},
// 包含參數及 handler 的 Action
burst: {
params: {
issue: "string",
},
handler(ctx) {
return `Solve issue ${ctx.params.issue}`;
}
}
}
};
你可以在服務中 methods
的鍵下建立一個私有的函數。這個函數將會是私有的,它不能被其它 Broker 呼叫。但可以在相同服務中的 Action 或是 Event 等生命週期函數被呼叫。
注意,
method
不可以使用以下保留字命名:name
、version
、settings
、metadata
、schema
、broker
、actions
、logger
。
module.exports = {
name: "mailer",
actions: {
send(ctx) {
// 呼叫 `sendMail` 方法
return this.sendMail(ctx.params.recipients, ctx.params.subject, ctx.params.body);
}
},
methods: {
// 發送信件
sendMail(recipients, subject, body) {
return new Promise((resolve, reject) => {
// ...
});
}
}
};
你可以在 events
的鍵下訂閱事件活動。
module.exports = {
name: "report",
events: {
// 訂閱至 "user.created" 事件
"user.created"(ctx) {
this.logger.info("User created:", ctx.params);
// Do something
},
// 訂閱至所有的 "user.*" 事件
"user.*"(ctx) {
console.log("Payload:", ctx.params);
console.log("Sender:", ctx.nodeID);
console.log("Metadata:", ctx.meta);
console.log("The called event name:", ctx.eventName);
}
// 訂閱至本地事件
"$node.connected"(ctx) {
this.logger.info(`Node '${ctx.params.id}' is connected!`);
}
}
};
今天對服務做了基本的使用介紹,讓大家初步認識 Moleculer 的微服務綱目,到目前為止是不是看起來相當容易上手呢? 接下來筆者將進一步帶大家更深入的了解 Moleculer ,期待明天也能見到各位囉。
[1] Services, https://moleculer.services/docs/0.14/services.html