Примеры интеграции Moleler-Io с Molener-Web с использованием Moleler-Runner вместо ServiceBroker? - PullRequest
0 голосов
/ 10 января 2020

Я получаю удовольствие от использования молекулярного бегуна вместо создания экземпляра ServiceBroker в молекулярном веб-проекте, над которым я работаю. Runner упрощает настройку сервисов для молекулярных сетей, и все сервисы, включая файл api.service. js, выглядят и ведут себя одинаково, используя формат module.exports = { blah }.

Я могу четко определить конечные точки REST в файле api.service. js и создать связанные функции в соответствующих служебных файлах. Например, aliases: { 'GET sensors': 'sensors.list' } указывает на действие / функцию list() в sensors.service.js. Все это прекрасно работает с использованием некоторых фиктивных данных в массиве.

Следующий шаг - заставить сервис (ы) открыть сокет и поговорить с локальной программой, слушающей внутренний адрес / порт. Идея состоит в том, чтобы принять вызов REST из Интернета, поговорить с локальной программой через сокет для получения некоторых данных, затем отформатировать и вернуть данные обратно через REST клиенту.

НО Когда я хочу использовать сокеты с молекулой, у меня возникают проблемы с поиском полезной информации и примеров по интеграции молекулярного соединения с установкой на основе молекулярного бегуна . Все примеры, которые я нахожу, используют модель ServiceBroker. Я думал, что мой Google-Fu был довольно хорош, но я не знаю, где искать дальше. Или я могу изменить примеры ServiceBroker для работы с молекулярным бегуном? Любое понимание или вклад приветствуется.

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Если вам нужна следующая цепочка: 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()). Добавление клиента позволит ему общаться с «внешним миром» через сокеты.

Проверьте изображение ниже. Я думаю, что здесь есть все, что вам нужно. В качестве скелета я использовал moleculer-demo проект.

enter image description here

Что у меня есть:

  • 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.

2 голосов
/ 10 января 2020

Неважно, используют ли ваши сервисы (или нет) 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

...