使用 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 devmoleculer-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 协议与其通信。