Задача

Создать два веб-сервиса, один из которых будет отправлять данные в другой.

Настройка среды

Для разработки проекта используется докер-контейнер datareon:3.1.1.1 с триальной версией платформы, запускаемой в режиме разработки. Я рекомендую использовать отдельный браузер и полностью очищать кэш перед началом работы с проектом. 

Запускаем контнейнер и заходим в Центр Настройки (ЦН) https://<адрес-контейнера>:7200/ Браузер ругнется на самоподписанный сертификат - нормально. И создаем новую конфигурацию.

datareon create new config

После создания проекта настраиваем сервер. Имя какое нравится, а адрес - вашего контейнера.

 datareon edit server

Также, можно изменить имя кластера на более удобное

datareon edit cluster

Также, из коробки у нас есть сервис обработки данных и сообщений. Я немного подправил имя, чтобы в логах и сообщениях было понятнее.

datareon edit service

На этом общая минимальная настройка завершена.  Переходим к реализации функционала проекта.

Создание функционала проекта

  1. Создаем RestServerIN
  2. Создаем RestServerOut
  3. Создаем тип данных ТипRest
  4. Создаем маршрут ОтправкаНаRest
  5. Перейти в swagger RestServerIN и использовать метод /sendMessage
  6. перейти в swagger RestServerOut и использовать метод /receive
  7. Чтение из пустой очереди - 204

В проекте используются два порта по одному на каждый веб-сервис. При использовании докера, необходимо пробросить порты в контейнер. В примере это порты 9878 и 9879. 

1. Создаем RestServerIN

 В разделе "Внешние системы" добавляем новую. На вкладке "Основные", устанавливаем название RestServerIn и галку "Включен". На вкладке "Коннектор" устанавливаем настройки, как на скрине.

create rest server in

Здесь наиболее интересный раздел настройки способов получения и отправки сообщений.  Можно настроить любую реальную конфигурацию. На основании этих настроек, система сгенерирует соответствующий swagger - необходимости вручную создавать обработчики запросов нет.

Галка "Включить ограничение" позволяет ограничить количество запросов к сервису.

 Создаем RestServerOut

Все как и в предыдущем шаге, только сконфигурировано на выдачу данных из датареона.

create rest server out

Создаем тип данных ТипRest

Проект очень простой. RestServerIN получает данные снаружи, кладет его в очередь для RestServerOUT - все. Для того, чтобы это работало, необходимо создать тип данных и маршрут. Для нашего простого случая, где не предусматриваются механизмы преобразования данных, вполне подойдет внутренний тип данных платформы. Тип содержит одно поле по умолчанию.

create data type rest

Создаем маршрут ОтправкаНаRest

Маршрут свяжет все компоненты в единую рабочую систему.  Внешние системы ничего не знают о данных. Они просто получают и отправляют сообщения и не содержат никакой логики. И вообще не знают ничего друг о друге. Тип данных, который мы создали, тоже ни к чему не привязан. Необходим маршрут.

how to create route

create route torest main

Во вкладке "Основные" мы привязали тип данных, а во складке "Схема" укажем действие:

create route torest schema

Когда мы отправим данные в сервис RestServerIN, сервис их примет и передаст на обработку. Система найдет подходящую схему обработки по типу полученных данных и выполнит схему обработки: в нашем случае, отправит данные в сервис RestServerOut. Никаких действий, никакой дополнительной обработки или трансформации выполнено не будет. У нас самая простая схема. Пора ее протестировать.

Тестирование получения данных

Для проверки нужно перейти в Центр Мониторинга (ЦМ). Он находится по тому же адресу, что и Центр Настройки, но на порту 7201. Нам необходимо выбрать внешнюю систему RestServerIN и найти адрес сваггера. Ссылки "Свернуть все", "Развернуть все" появляются при наведении курсора на ячейку. 

rest server in swagger

Тут есть затыка. При генерации сваггера, платформа в качстве имени сервера часть идентификатора... Я пока еще не понял чего именно, когда разберусь, дополню.  В моем случае, адрес будет http://10.1.29.70:9878/swagger/index.html
rest server in build request body

Запросы можно отправлять как угодно, но в сваггере есть встроенный функционал, которым удобно пользоваться. Выбираем метод /sendMessage и справа вверху жмем "Try it out". В поле Request body набираем данные для отправки. Тип данных можно посмотреть в ЦН у соответствующем типе (он у нас один). Поле bodу это полезная нагрузка, закодированная в base64. На скрине справа я воспользовался онлайн-энкодером.  Там же видно, что я создал JSON-объект по структуре соответствующий типу данных ТипRest. В общем, ничего сложного, но не привычно. Execute - отправляет запрос в датареон.

rest server in send message

В датареоне RestServerIN принимает сообщение, т.к. отправка идет на его порт. Дальше срадатывает маршрут ОтправкаНаRest, которая перекладывает полученные данные в очередь RestServerOUT.

Тестирование отправки данных

Также открываем сваггер для RestServerOUT (меняем адрес на свой) и выполняем метод /receive - будет получено сообщение из датареона. 

rest server out receive message

Нашу полезную нагрузку датареон завернул в свой конверт. 
Очередь работает по FIFO, сообщения отдаются по очереди. При вызове метода /receive  очередное сообщение удаляется из очереди. Для реализации более сложной логики существуют блокирующие методы получения сообщений. Когда очередь опустошается датареон отдает код 204.

rest server out no messages read 204

Эта схема ничего особо полезного не делает, но позволяет представить общую схему работы датареона.