Начало работы с потоковой обработкой с потоком данных Spring Cloud

1. Вступление

Spring Cloud Data Flow представляет собой облачную модель программирования и работы для компонуемых микросервисов данных.

С помощью Spring Cloud Data Flow разработчики могут создавать и организовывать конвейеры данных для общих случаев использования, таких как получение данных, аналитика в реальном времени и импорт/экспорт данных. ,

Эти конвейеры данных бывают двух видов: потоковые и пакетные.

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

Эта статья будет посвящена потоковой обработке.

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

Ключевыми компонентами этого типа архитектуры являются Applications , Data Flow Server и целевая среда выполнения.

Кроме того, в дополнение к этим ключевым компонентам у нас также есть Data Flow Shell и message broker в архитектуре.

Давайте рассмотрим все эти компоненты более подробно.

2.1. Приложения

Как правило, потоковый конвейер данных включает в себя потребление событий из внешних систем, обработку данных и сохранение полиглота. Эти термины обычно называются Source , Processor и Sink в терминологии Spring Cloud :

  • Источник:

  • Процессор: принимает данные из Source , выполняет некоторую обработку

и отправляет обработанные данные следующему приложению в конвейере Sink: ** либо потребляет из Source или Processor и записывает

данные на нужный уровень персистентности

Эти приложения могут быть упакованы двумя способами:

  • Spring Boot uber-jar, который размещен в репозитории maven, файл, http

или любая другая реализация ресурса Spring (этот метод будет использоваться в Эта статья) ** Докер

Многие источники, процессоры и приемники для общих случаев использования (например, jdbc, hdfs, http, router) уже предоставлены и готовы к использованию командой Spring Cloud Data Flow .

** 2.2. время выполнения

**

Кроме того, для выполнения этих приложений требуется среда выполнения. Поддерживаемые среды выполнения:

  • Cloud Foundry

  • Apache YARN

  • Кубернетес

  • Apache Mesos

  • Локальный сервер для разработки (который будет использоваться в этой статье)

** 2.3. Сервер потока данных

**

Компонент, отвечающий за развертывание приложений во время выполнения, - Data Flow Server . Для каждой целевой среды выполнения предусмотрен исполняемый файл-архив Data Flow Server .

Data Flow Server отвечает за интерпретацию:

  • Поток DSL, который описывает логический поток данных через несколько

Приложения.

  • Манифест развертывания, который описывает отображение приложений на

время выполнения.

2.4. Оболочка потока данных

Оболочка потока данных является клиентом для сервера потока данных.

Например, DSL для описания потока данных из источника http в приемник jdbc будет записан как «http | JDBC». Эти имена в DSL зарегистрированы в Data Flow Server и отображаются на артефакты приложений, которые могут быть размещены в репозиториях Maven или Docker.

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

** 2.5. Брокер сообщений

**

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

Поддерживаются два посредника обмена сообщениями:

  • Apache Kafka

  • RabbitMQ

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

** 3. Установить брокер сообщений

**

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

Для получения полной информации об установке, вы можете следовать инструкции на official site .

4. Локальный сервер потока данных

Чтобы ускорить процесс создания наших приложений, мы будем использовать Spring Initializr ; с его помощью мы можем получить наши приложения Spring Boot за несколько минут.

Добравшись до веб-сайта, просто выберите Group и имя Artifact .

После этого нажмите кнопку Generate Project , чтобы начать загрузку артефакта Maven.

ссылка:/uploads/init.jpg%201365w[]

После завершения загрузки разархивируйте проект и импортируйте его как проект Maven в выбранную вами IDE.

Давайте добавим зависимость Maven в проект. Поскольку нам понадобятся библиотеки Dataflow Local Server , добавим spring-cloud-starter-dataflow-server-local зависимость:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-dataflow-server-local</artifactId>
</dependency>

Теперь нам нужно аннотировать главный класс Spring Boot с помощью аннотации @ EnableDataFlowServer :

@EnableDataFlowServer
@SpringBootApplication
public class SpringDataFlowServerApplication {

    public static void main(String[]args) {
        SpringApplication.run(
          SpringDataFlowServerApplication.class, args);
    }
}

Это все. Наш Local Data Flow Server готов к выполнению:

mvn spring-boot:run

Приложение загрузится на порт 9393.

5. Оболочка потока данных

Снова перейдите к Spring Initializr и выберите имя Group и Artifact .

Загрузив и импортировав проект, добавим зависимость spring-cloud-dataflow-shell :

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dataflow-shell</artifactId>
</dependency>

Теперь нам нужно добавить аннотацию @ EnableDataFlowShell в основной класс Spring Boot :

@EnableDataFlowShell
@SpringBootApplication
public class SpringDataFlowShellApplication {

    public static void main(String[]args) {
        SpringApplication.run(SpringDataFlowShellApplication.class, args);
    }
}

Теперь мы можем запустить оболочку:

mvn spring-boot:run

После запуска оболочки мы можем ввести команду help в командной строке, чтобы увидеть полный список команд, которые мы можем выполнить.

6. Исходное приложение

Аналогично, в Initializr мы теперь создадим простое приложение и добавим зависимость Stream Rabbit с именем spring-cloud- стартер поток кролик:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

Затем мы добавим аннотацию @ EnableBinding (Source.class) в основной класс Spring Boot :

@EnableBinding(Source.class)
@SpringBootApplication
public class SpringDataFlowTimeSourceApplication {

    public static void main(String[]args) {
        SpringApplication.run(
          SpringDataFlowTimeSourceApplication.class, args);
    }
}

Теперь нам нужно определить источник данных, которые должны быть обработаны.

Этим источником может быть любая потенциально бесконечная рабочая нагрузка (данные датчика Интернета вещей, обработка событий в режиме 24/7, получение данных транзакций в режиме онлайн).

  • В нашем примере приложения мы генерируем одно событие (для простоты новую временную метку) каждые 10 секунд с Poller . **

Аннотация @ InboundChannelAdapter отправляет сообщение в выходной канал источника с использованием возвращаемого значения в качестве полезной нагрузки сообщения:

@Bean
@InboundChannelAdapter(
  value = Source.OUTPUT,
  poller = @Poller(fixedDelay = "10000", maxMessagesPerPoll = "1")
)
public MessageSource<Long> timeMessageSource() {
    return () -> MessageBuilder.withPayload(new Date().getTime()).build();
}

Наш источник данных готов.

** 7. Процессор Приложение

**

Далее мы создадим приложение и добавим зависимость Stream Rabbit .

Затем мы добавим аннотацию @ EnableBinding (Processor.class) в основной класс Spring Boot :

@EnableBinding(Processor.class)
@SpringBootApplication
public class SpringDataFlowTimeProcessorApplication {

    public static void main(String[]args) {
        SpringApplication.run(
          SpringDataFlowTimeProcessorApplication.class, args);
    }
}

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

Чтобы определить преобразователь, нам нужно пометить этот метод аннотацией @ Transformer

@Transformer(inputChannel = Processor.INPUT,
  outputChannel = Processor.OUTPUT)
public Object transform(Long timestamp) {

    DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd hh:mm:yy");
    String date = dateFormat.format(timestamp);
    return date;
}

Он преобразует метку времени из «входного» канала в форматированную дату, которая будет отправлена ​​в «выходной» канал.

** 8. Раковина

**

  • Последнее приложение, которое нужно создать - это приложение Sink. **

Снова перейдите к Spring Initializr и выберите Group , имя Artifact . После загрузки проекта добавим зависимость Stream Rabbit .

Затем добавьте аннотацию @ EnableBinding (Sink.class) в основной класс Spring Boot :

@EnableBinding(Sink.class)
@SpringBootApplication
public class SpringDataFlowLoggingSinkApplication {

    public static void main(String[]args) {
    SpringApplication.run(
          SpringDataFlowLoggingSinkApplication.class, args);
    }
}

Теперь нам нужен метод для перехвата сообщений, поступающих из приложения процессора.

Для этого нам нужно добавить аннотацию @ StreamListener (Sink.INPUT) в наш метод:

@StreamListener(Sink.INPUT)
public void loggerSink(String date) {
    logger.info("Received: " + date);
}

Метод просто печатает метку времени, преобразованную в отформатированную дату, в файл журнала.

** 9. Зарегистрируйте приложение Stream

**

Оболочка потока данных Spring Cloud позволяет нам регистрировать потоковое приложение в реестре приложений с помощью команды app register .

Мы должны предоставить уникальное имя, тип приложения и URI, которые можно разрешить в артефакте приложения. Для типа укажите « source », « processor « или « sink «.

При предоставлении URI со схемой maven формат должен соответствовать следующему:

maven://<groupId>:<artifactId>[:<extension>[:<classifier>]]:<version>

Чтобы зарегистрировать приложения Source , Processor и Sink , перейдите в оболочку потока данных Spring Cloud и введите в командной строке следующие команды:

app register --name time-source --type source
  --uri maven://org.baeldung.spring.cloud:spring-data-flow-time-source:jar:0.0.1-SNAPSHOT

app register --name time-processor --type processor
  --uri maven://org.baeldung.spring.cloud:spring-data-flow-time-processor:jar:0.0.1-SNAPSHOT

app register --name logging-sink --type sink
  --uri maven://org.baeldung.spring.cloud:spring-data-flow-logging-sink:jar:0.0.1-SNAPSHOT

10. Создать и развернуть поток

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

stream create --name time-to-log
  --definition 'time-source | time-processor | logging-sink'

Это определяет поток с именем time-to-log на основе выражения DSL ‘time-source | процессор времени | каротаж sink' .

Затем для развертывания потока выполните следующую команду оболочки:

stream deploy --name time-to-log

Data Flow Server разрешает time-source , time-processor и logging-sink в maven координаты и использует их для запуска приложений time-source , time-processor и logging-sink потока.

Если поток развернут, вы увидите в журнале Data Flow Server , что модули были запущены и связаны вместе:

2016-08-24 12:29:10.516  INFO 8096 ---[io-9393-exec-10]o.s.c.d.spi.local.LocalAppDeployer: deploying app time-to-log.logging-sink instance 0
   Logs will be in PATH__TO__LOG/spring-cloud-dataflow-1276836171391672089/time-to-log-1472034549734/time-to-log.logging-sink
2016-08-24 12:29:17.600  INFO 8096 ---[io-9393-exec-10]o.s.c.d.spi.local.LocalAppDeployer       : deploying app time-to-log.time-processor instance 0
   Logs will be in PATH__TO__LOG/spring-cloud-dataflow-1276836171391672089/time-to-log-1472034556862/time-to-log.time-processor
2016-08-24 12:29:23.280  INFO 8096 ---[io-9393-exec-10]o.s.c.d.spi.local.LocalAppDeployer       : deploying app time-to-log.time-source instance 0
   Logs will be in PATH__TO__LOG/spring-cloud-dataflow-1276836171391672089/time-to-log-1472034562861/time-to-log.time-source

** 11. Пересматривая результат

**

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

Файлы журнала расположены в каталоге, отображаемом в выходных данных журнала Data Flow Server , как показано выше. Чтобы увидеть результат, мы можем записать журнал:

tail -f PATH__TO__LOG/spring-cloud-dataflow-1276836171391672089/time-to-log-1472034549734/time-to-log.logging-sink/stdout__0.log
2016-08-24 12:40:42.029  INFO 9488 ---[r.time-to-log-1]s.c.SpringDataFlowLoggingSinkApplication : Received: 2016/08/24 11:40:01
2016-08-24 12:40:52.035  INFO 9488 ---[r.time-to-log-1]s.c.SpringDataFlowLoggingSinkApplication : Received: 2016/08/24 11:40:11
2016-08-24 12:41:02.030  INFO 9488 ---[r.time-to-log-1]s.c.SpringDataFlowLoggingSinkApplication : Received: 2016/08/24 11:40:21

12. Заключение

В этой статье мы увидели, как построить конвейер данных для потоковой обработки с помощью Spring Cloud Data Flow .

Кроме того, мы увидели роль приложений Source , Processor и Sink внутри потока и то, как подключить и связать этот модуль внутри Data Flow Server с помощью Data Flow Shell .

Пример кода можно найти в GitHub проекте .