使用 moleculer-runner 而不是 ServiceBroker 将 moleculer-io 与 moleculer-web 集成的示例?
Examples of integrating moleculer-io with moleculer-web using moleculer-runner instead of ServiceBroker?
我很喜欢使用 moleculer-runner 而不是在我正在处理的 moleculer-web 项目中创建 ServiceBroker 实例。 Runner 简化了 moleculer-web 服务的设置,所有服务(包括 api.service.js 文件)的外观和行为都相同,使用 module.exports = { blah }
格式。
我可以在 api.service.js 文件中清晰地定义 REST 端点,并在适当的服务文件中创建连接的函数。例如 aliases: { 'GET sensors': 'sensors.list' }
指向 sensors.service.js
中的 list()
action/function 。在数组中使用一些虚拟数据,一切都很好。
下一步是让服务打开套接字并与侦听内部集的本地程序对话 address/port。这个想法是接受来自网络的 REST 调用,通过套接字与本地程序对话以获取一些数据,然后格式化并 return 通过 REST 将数据返回给客户端。
但是 当我想将套接字与 moleculer 一起使用时,我无法找到有关将 moleculer-io 与 moleculer-runner 集成的有用信息和示例-based 设置。我找到的所有示例都使用 ServiceBroker 模型。我认为我的 Google-Fu 非常好,但我不知道下一步该去哪里。或者,我可以修改 ServiceBroker 示例以与 moleculer-runner 一起使用吗?欢迎任何见解或意见。
您的服务是否使用(或不使用)socket.io并不重要。所有服务都以相同的方式声明,即 module.exports = {}
下面是 socket.io 的工作示例。
const { ServiceBroker } = require("moleculer");
const ApiGateway = require("moleculer-web");
const SocketIOService = require("moleculer-io");
const io = require("socket.io-client");
const IOService = {
name: "api",
// SocketIOService should be after moleculer-web
// Load the HTTP API Gateway to be able to reach "greeter" action via:
// http://localhost:3000/hello/greeter
mixins: [ApiGateway, SocketIOService]
};
const HelloService = {
name: "hello",
actions: {
greeter() {
return "Hello Via Socket";
}
}
};
const broker = new ServiceBroker();
broker.createService(IOService);
broker.createService(HelloService);
broker.start().then(async () => {
const socket = io("http://localhost:3000", {
reconnectionDelay: 300,
reconnectionDelayMax: 300
});
socket.on("connect", () => {
console.log("Connection with the Gateway established");
});
socket.emit("call", "hello.greeter", (error, res) => {
console.log(res);
});
});
要使其与 moleculer-runner
一起使用,只需将服务声明复制到 my-service.service.js
。例如,您的 api.service.js
可能如下所示:
// api.service.js
module.exports = {
name: "api",
// SocketIOService should be after moleculer-web
// Load the HTTP API Gateway to be able to reach "greeter" action via:
// http://localhost:3000/hello/greeter
mixins: [ApiGateway, SocketIOService]
}
和您的 greeter
服务:
// greeter.service.js
module.exports = {
name: "hello",
actions: {
greeter() {
return "Hello Via Socket";
}
}
}
和运行npm run dev
或moleculer-runner --repl --hot services
如果你想要下面的链:
localhost:3000/sensor/list -> sensor.list() -> send message to local program:8071 -> get response -> send response as return message to the REST caller.
然后您需要将套接字 io 客户端添加到您的 sensor
服务(具有 list()
操作)。添加客户端将允许它通过套接字与 "outside world" 通信。
检查下图。我认为它拥有您需要的一切。
作为骨架,我使用了 moleculer-demo
项目。
我有:
API 服务 api.service.js
。处理 HTTP 请求并将它们传递给 sensor.service.js
sensor.service.js
将负责与远程 socket.io 服务器通信,因此它需要一个 socket.io 客户端。现在,当 sensor.service.js
服务有 started()
时,我正在与位于端口 8071 的远程服务器建立连接。之后我可以在我的服务操作中使用此连接与 socket.io 通信服务器。这正是我在 sensor.list
行动中所做的。
我还创建了 remote-server.service.js
来模拟你的 socket.io server
。尽管是分子服务,sensor.service.js
通过 socket.io 协议与其通信。
我很喜欢使用 moleculer-runner 而不是在我正在处理的 moleculer-web 项目中创建 ServiceBroker 实例。 Runner 简化了 moleculer-web 服务的设置,所有服务(包括 api.service.js 文件)的外观和行为都相同,使用 module.exports = { blah }
格式。
我可以在 api.service.js 文件中清晰地定义 REST 端点,并在适当的服务文件中创建连接的函数。例如 aliases: { 'GET sensors': 'sensors.list' }
指向 sensors.service.js
中的 list()
action/function 。在数组中使用一些虚拟数据,一切都很好。
下一步是让服务打开套接字并与侦听内部集的本地程序对话 address/port。这个想法是接受来自网络的 REST 调用,通过套接字与本地程序对话以获取一些数据,然后格式化并 return 通过 REST 将数据返回给客户端。
但是 当我想将套接字与 moleculer 一起使用时,我无法找到有关将 moleculer-io 与 moleculer-runner 集成的有用信息和示例-based 设置。我找到的所有示例都使用 ServiceBroker 模型。我认为我的 Google-Fu 非常好,但我不知道下一步该去哪里。或者,我可以修改 ServiceBroker 示例以与 moleculer-runner 一起使用吗?欢迎任何见解或意见。
您的服务是否使用(或不使用)socket.io并不重要。所有服务都以相同的方式声明,即 module.exports = {}
下面是 socket.io 的工作示例。
const { ServiceBroker } = require("moleculer");
const ApiGateway = require("moleculer-web");
const SocketIOService = require("moleculer-io");
const io = require("socket.io-client");
const IOService = {
name: "api",
// SocketIOService should be after moleculer-web
// Load the HTTP API Gateway to be able to reach "greeter" action via:
// http://localhost:3000/hello/greeter
mixins: [ApiGateway, SocketIOService]
};
const HelloService = {
name: "hello",
actions: {
greeter() {
return "Hello Via Socket";
}
}
};
const broker = new ServiceBroker();
broker.createService(IOService);
broker.createService(HelloService);
broker.start().then(async () => {
const socket = io("http://localhost:3000", {
reconnectionDelay: 300,
reconnectionDelayMax: 300
});
socket.on("connect", () => {
console.log("Connection with the Gateway established");
});
socket.emit("call", "hello.greeter", (error, res) => {
console.log(res);
});
});
要使其与 moleculer-runner
一起使用,只需将服务声明复制到 my-service.service.js
。例如,您的 api.service.js
可能如下所示:
// api.service.js
module.exports = {
name: "api",
// SocketIOService should be after moleculer-web
// Load the HTTP API Gateway to be able to reach "greeter" action via:
// http://localhost:3000/hello/greeter
mixins: [ApiGateway, SocketIOService]
}
和您的 greeter
服务:
// greeter.service.js
module.exports = {
name: "hello",
actions: {
greeter() {
return "Hello Via Socket";
}
}
}
和运行npm run dev
或moleculer-runner --repl --hot services
如果你想要下面的链:
localhost:3000/sensor/list -> sensor.list() -> send message to local program:8071 -> get response -> send response as return message to the REST caller.
然后您需要将套接字 io 客户端添加到您的 sensor
服务(具有 list()
操作)。添加客户端将允许它通过套接字与 "outside world" 通信。
检查下图。我认为它拥有您需要的一切。
作为骨架,我使用了 moleculer-demo
项目。
我有:
API 服务
api.service.js
。处理 HTTP 请求并将它们传递给sensor.service.js
sensor.service.js
将负责与远程 socket.io 服务器通信,因此它需要一个 socket.io 客户端。现在,当sensor.service.js
服务有started()
时,我正在与位于端口 8071 的远程服务器建立连接。之后我可以在我的服务操作中使用此连接与 socket.io 通信服务器。这正是我在sensor.list
行动中所做的。我还创建了
remote-server.service.js
来模拟你的socket.io server
。尽管是分子服务,sensor.service.js
通过 socket.io 协议与其通信。