Статьи

Создание IoT AMQP Backend за считанные секунды с Rhiot

AMQP  становится широко принята в качестве протокола по выбору связи между IoT шлюзом и центром обработки данных. Если вы хотите быстро создать бэкэнд-сервис AMQP, который может быть немедленно готов для ваших шлюзов и устройств,  быстрый старт Rhiot AMQP  из проекта Rhiot будет для вас более чем интересным.

Быстрый запуск облачного хранилища AMQP можно использовать в качестве основы для микросервисов AMQP с толстой флягой (так называемых  cloudlets ). Если вы хотите создать простое бэкэнд-приложение, способное отображать конечную точку AMQP и обрабатывать обмен данными на основе AMQP, быстрый запуск облачного сервиса AMQT — это лучший способ начать ваши усилия по разработке.

Создание и запуск облачного проекта AMQP

Чтобы создать облачный проект AMQP, выполните следующие команды:

git clone git@github.com:rhiot/quickstarts.git
cp -r quickstarts/cloudlets/amqp amqp
cd amqp
mvn install

Чтобы запустить облачный сервис AMQP, выполните следующую команду:

java -jar target/rhiot-cloudlets-amqp-1.0.0-SNAPSHOT.jar

Это действительно все, что вам нужно для предоставления брокеру сообщений AMQP внешним устройствам и шлюзам.

Вы также можете создать и запустить его как образ Docker (мы любим Docker и очень рекомендуем этот подход):

TARGET_IMAGE=yourUsername/rhiot-cloudlets-amqp
mvn install docker:build docker:push -Ddocker.image.target=${TARGET_IMAGE}
docker run -it ${TARGET_IMAGE}

AMQP Broker

По умолчанию AMQP облачко Quickstart начинает встроенный  ActiveMQ  AMQP брокера на 5672 порту. Если вы хотите подключить ваше облачное приложение к внешнему брокеру ActiveMQ (вместо запуска встроенного), запустите облачное хранилище с  BROKER_URL переменной среды или системным свойством, например:

java -DBROKER_URL=tcp://amqbroker.example.com:61616 -jar target/rhiot-cloudlets-amqp-1.0.0-SNAPSHOT.jar

…или…

docker run -e BROKER_URL=tcp://amqbroker.example.com:61616 -it yourUsername/rhiot-cloudlets-amqp

Пример приложения чата

Быстрый запуск облачного сервиса AMQP на самом деле является простым приложением чата. Клиенты могут отправлять сообщения в канал чата, подписавшись на брокера и отправив сообщения в  chat очередь AMQP.

$ amqp-client -h localhost -p 5672 --topic chat "Hello, this is the IoT device!"

Клиенты могут подписаться на обновления чата, прослушивая  chat-updates тему AMQP — всякий раз, когда новое сообщение отправляется на канал чата, клиенты, зарегистрированные на него  chat-updates , получают обновленную историю чата.

$ amqp-client -h localhost -p 5672 --subscribe --topic chat-updates
Hello, this is the IoT device!
I just wanted to say hello!
Hello, IoT device. Nice to meet you!

Быстрый запуск также предоставляет простой REST API, который можно использовать для чтения истории чата с помощью HTTP-  GETзапроса:

$ curl http://localhost:8180/chat
Hello, this is the IoT device!
I just wanted to say hello!
Hello, IoT device. Nice to meet you!

Архитектурный Обзор

Когда облачный сервис AMQP запускается со встроенным брокером ActiveMQ, архитектура этого примера выглядит следующим образом:

Когда вы подключаетесь к внешнему брокеру ActiveMQ (используя  BROKER_URL опцию), архитектура примера становится больше похожа на следующую диаграмму:

Код быстрого запуска

Вам может быть интересно, сколько кода вам нужно, чтобы воспользоваться преимуществами представленной функциональности AMQP. Ниже приведен весь код, используемый нашим быстрым стартом для обработки подключения AMQP: 

import io.rhiot.steroids.camel.CamelBootstrap;

import java.util.LinkedList;
import java.util.List;

import static io.rhiot.steroids.activemq.EmbeddedActiveMqBrokerBootInitializer.amqpJmsBridge;
import static org.apache.commons.lang3.StringUtils.join;

public class ChatCloudlet extends CamelBootstrap {

    static final List chat = new LinkedList<>();

    @Override
    public void configure() throws Exception {
        from(amqpJmsBridge("chat")).process(
                exchange -> chat.add(exchange.getIn().getBody(String.class))
        ).process(
                exchange -> exchange.getIn().setBody(join(chat, "\n"))
        ).to(amqpJmsBridge("topic:chat-updates"));
    }

}

Ниже приведен код, используемый для запуска API REST, упомянутого ранее:

import io.rhiot.steroids.camel.Route;
import org.apache.camel.builder.RouteBuilder;

import static org.apache.commons.lang3.StringUtils.join;

@Route
public class ChatRestApiRoutes extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        restConfiguration().component("netty4-http").host("0.0.0.0").port(8180);

        rest("/chat").get().route().process(
                exchange -> exchange.getIn().setBody(join(ChatCloudlet.chat, "\n"))
        );
    }

}

Как видите,  Apache Camel  — первоклассный гражданин в мире Rhiot. Чтобы упростить подключение Camel, Rhiot поставляется со статическими методами DSL, такими как   EmbeddedActiveMqBrokerBootInitializer.amqpJmsBridge,  которые можно использовать для простого создания конечных точек Camel, связанных с брокером, используемым в быстром запуске.