跳到主要内容

软件包微服务

微服务软件包根目录必须有一个 package.service.js 文件。

package.service.js

steedos 软件包的根目录中的 package.service.js 是软件包微服务的加载入口。

const packageJSON = require('./package.json');

module.exports = {
name: packageJSON.name,
namespace: "steedos",

/*
After mixin @steedos/service-package-loader, the package service will
automatically scan and load metadata files from subfolders upon startup.
*/
mixins: [require('@steedos/service-package-loader')],

metadata: {
$package: {
name: packageJSON.name,
version: packageJSON.version,
path: __dirname,
isPackage: true
}
},

/**
* Settings
*/
settings: {
},

/**
* Dependencies
*/
dependencies: [],

/**
* Actions
*/
actions: {

},

/**
* Events
*/
events: {

},
/**
* Methods
*/
methods: {
},

/**
* Service created lifecycle event handler
*/
async created() {
},

/**
* Service started lifecycle event handler
*/
async started() {
},

/**
* Service stopped lifecycle event handler
*/
async stopped() {
}
};

命名空间

节点的命名空间用于在同一网络上分割您的节点。 必须设置为 steedos

混入 (mixins)

混入是一种灵活的方式,用于为 Moleculer 服务分发可重用的功能。服务构造函数将这些混入与当前模式合并。当服务使用混入时,混入中存在的所有属性都会“混合”到当前服务中。

提示

混入 @steedos/service-package-loader 之后,软件包服务将在启动时自动扫描子文件夹并加载元数据文件。

依赖项

如果您的服务依赖于其他服务,请在模式中使用 dependencies 属性。服务在调用已启动的生命周期事件处理程序之前,等待依赖的服务。

如果您正在开发的软件包依赖于另一个软件包的元数据,您可以使用 dependencies 来控制软件包的加载顺序。例如,如果合同管理软件包依赖于主数据软件包的元数据,您可以如下定义:

module.exports = {
name: "@steedos-labs/contract",
dependencies: ["@steedos-labs/master"],
}

操作

操作是服务的可调用/公共方法。操作调用代表远程过程调用(RPC)。它具有请求参数并返回响应,就像 HTTP 请求一样。有关更多信息,请查看 Moleculer 操作文档。

  actions: {
multi: {
cache: false,
params: {
a: "number",
b: "number"
},
handler(ctx) {
if (!ctx.action.cache)
return Number(ctx.params.a) * Number(ctx.params.b);
}
}
}

调用服务

要调用服务,请使用 broker.call 方法。代理查找具有给定操作的服务(和节点)并调用它。该函数返回一个 Promise

语法

const res = await broker.call(actionName, params, opts);

REST API

Steedos 附带了一个内置的 API 网关,它可以将您的服务发布为 RESTful API。

这样,您的操作功能可以直接通过 HTTP 请求访问,无需连接到微服务网络。

您可以通过指定 rest 参数将操作发布为 RESTful API。

有关更多信息,请查看 REST API 文档。

  actions: {
hello: {
rest: { method: 'GET', path: '/hello/:name' },
handler(ctx) {
return {
data: 'Welcome ' + ctx.params.name
}
}
},
}

触发器

通过编写触发器,您可以在记录创建、删除和更改之前和之后自动触发一段服务器端代码,实现个性化的数据验证和处理。

您可以定义一个操作并为其添加 trigger 参数。

有关更多信息,请查看 触发器 文档。

  actions: {
spaceUsersBeforeUpdate: {
trigger: {
listenTo: 'space_users',
when: ['beforeInsert', 'beforeUpdate']
},
async handler(ctx) {
this.broker.logger.debug('spaceUsersBeforeUpdate', ctx)
}
}
}

事件

您可以在 events 键下订阅事件。有关更多信息,请查看 事件 文档。

订阅事件

基于上下文的事件处理程序和发出嵌套事件。

module.exports = {
name: "@steedos-labs/project",
events: {
"@space_users.inserted"(ctx) {
console.log("Payload:", ctx.params);
console.log("Sender:", ctx.nodeID);
console.log("Metadata:", ctx.meta);
console.log("The called event name:", ctx.eventName);

ctx.emit("users.changed", { data: ctx.params.doc });
},

"@space_users.deleted": {
handler(ctx) {
console.log(`${this.broker.nodeID}:${this.fullName}: Event '${ctx.eventName}' received. Payload:`, ctx.params, ctx.meta);
}
}
}
};