Apache Camel. Введение.

Что такое Camel?

Apache Camel – это интеграционный фреймворк, который помогает в решении такой сложной задачи, как интеграции многих, часто сильно разнородных систем, в единое целое. На мой взгляд, в современном мире интеграция различных сервисов друг с другом играет первостепенное значение. Агрегаторы сервисов, интеграция с платежными системами, системами обработки и анализа данных. Часто ваша система уже не является просто изолированным ото всего мира приложением. И тут вам нужно средство, которое поможет соединить набор совершенно различных систем, с разными API и форматами данных, в единое целое.
Здесь то на сцену и выходит Camel.

Проблемы интеграции.

Что может быть сложного в том, чтобы подключиться к какому-то стороннему сервису и начать использовать его API? Есть интерфейс, есть некий SLA – работаем. Какие у нас могут возникнуть основные проблемы? Давайте попробуем перечислить некоторые из них:


1). Различия в используемых технологиях. Одна система может использовать для интеграции с другими сервисами простой HTTP Web-сервис. Другая — предоставлять доступ к своему FTP-серверу. Третья — использовать какой-либо брокер сообщений, например, RabbitMQ или Apache Qpid.
2). Различия в форматах передачи данных. В современном мире существует большое количество форматов обмена данными — XML, JSON, YAML, CSV и т.д. Очень часто бывает, что вы внутри своего приложения используете другой формат обмена данными.
Или тот же формат, но другую схему данных(в случае XML). Необходимость трансформации — одна из основных составных частей процесса интеграции.
3). Маршрутизация. Иногда данные, полученные из одной системы, нужно передать в другую систему. Например, в системе кредитования, вы передадите данные пользователя в кредитное бюро для получения истории кредитов, а затем перенаправите их в тот набор банков, которые могут одобрить этот кредит(выполнив перед эти какой-то анализ этих данных). Было бы удобно как-то описывать и управлять этими маршрутами передачи данных из одной системы в другие.
4). Обработка данных. Промежуточная обработка данных — фильтрация, очистка, какие-то преобразования почти всегда необходимая часть процесса интеграции.

Настольная книга интегратора — EIP.

Книга Enterpise Integration Patterns(или сокращенно EIP) Грегора Хопа и Бобби Вульфа– это богатый набор паттернов, типовых решений, которые встречаются при решении задач интеграции.
Например, паттерн Message представляет простое сообщение. Producer и Consumer –отправителя и потребителя данных соответственно. За трансформацию данных отвечает MessageTranslator. Централизованный компонент, осуществляющий обмен сообщениями между системами — Message Broker. Content Enricher(обогатитель данных) позволяет описать ситуацию как выше с кредитным бюро — мы идем в другую систему за дополнительными
данными, обогащая(to enrich) их.

Если вы работаете в сфере интеграции информационных систем, то вам непременно нужна эта книга. Если вы собираетесь просто решить какую-то задачу по интеграции вашего приложения с
каким-то сторонним сервисом, то вы можете обратиться к сайту
https://www.enterpriseintegrationpatterns.com/ . Здесь можно в свободном доступе просмотреть описания всех тех же паттернов, которые представлены в самой книге. Пусть и в менее подробной
форме, но иногда этого вполне достаточно. Я сам, например, иногда использую этот сайт как справочное руководство. Это быстро и удобно.

Hello, Camel!

Давайте теперь наконец обратимся к самому фреймворку. В этом разделе мы познакомимся с основами Camel, его концепциями и терминами, а также напишем свое первое приложение с
помощью него.
В сфере интеграции приложений существует свой Hello World! И заключается он в том, чтобы скопировать(передать) файл из одной папки в другую. Прежде чем заниматься интеграцией с реальными системами, мы знакомимся с основами вот на таком простом примере.

В нашем примере мы просто копируем некоторый файл(сообщение) из одной папки в другую.

Как бы вы сделали тоже самое с помощью Java? Просто скопировать файл из одного места в другое заняло бы уже довольно немало кода, но зачем писать что-то заново, если кто-то уже это сделал за вас?
Итак, приступим. Создайте новый проект в IDEA и с помощью вашего любимого сборщика(Gradle или Maven) подключите к проекту Camel. Я использую Maven:

<dependencies>
   <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-core</artifactId>
      <version>2.22.0</version>
   </dependency>
</dependencies>

Весь код по копированию файла укладывается буквально в две строчки:

from("file:data/source?noop=true")
   .to("file:data/destination");

Camel предоставляет из коробки свой DSL.Он реализован поверх Java. Все, что мы хотим сделать, мы описываем в терминах нашей предметной области. Мы говорим Camel, откуда(from) мы хотим потребить(to consume) данные и куда(to) мы их хотим отправить(to produce). В скобках указывается адрес endpoint’а.
Endpoint(конечная точка) — это некий компонент или система, который может принимать или возвращать какие-то данные. Endpoint может представлять собой web-сервис, JMS очередь или
просто какую-то директорию в файловой системе, как в нашем примере.
И таким же способом мы можем читать данные из JMS-брокера, с FTP-сервера, Базы данных и так далее. И также передавать их дальше куда угодно. То, что записано выше, называется маршрутом(route) передачи данных.

Вот таким образом, в пару строк Java кода можно уместить целый маршрут передачи данных из одной системы в другую. Давайте же теперь разберем весь остальной код, который в основном относится к настройке и запуску самого Camel. На первый взгляд он кажется немного сложным, но на самом деле ничего сложного в нем нет. Приступим.
Первым делом мы создаем CamelContext. CamelContext – это сам движок Camel, то, что физически перемещает данные между endpoint’ами:

//it's Camel Runtime
CamelContext camelContext = new DefaultCamelContext();

Одно из основных понятий Camel – маршрут.

Маршрут — это некоторый путь из точки А в точку Б. В нашем случае он заключается в перемещении данных из директории source в директорию destination. Об этом мы и сообщаем Camel, добавляя свой маршрут:

//add new message route
camelContext.addRoutes(new RouteBuilder() {
   @Override
   public void configure() throws Exception {
      from("file:data/source?noop=true")
         .to("file:data/destination");
   }
});

В метод addRoutes() мы передаем объект анонимного класса RouteBuilder, задача которого, как следует из названия — построить маршрут(или сразу несколько маршрутов!).
Мы могли бы вынести свой RouteBuilder в собственный класс. Это улучшит переиспользуемость и тестируемость нашего RouteBuilder:
Затем мы стартуем Camel, ждем 10 секунд, пока отработает наш маршрут и произойдет копирование файлов:

camelContext.start();
//sleep while file is copying
Thread.sleep(10000);
camelContext.stop();

В конце мы просто останавливаем Camel. Давайте вернемся к нашему примеру и повторим все, что только что изучили.

Итак, одно из основных понятий в Camel – это маршрут. Маршрут — это путь следования сообщения из одной системы в другую. Чтобы построить маршрут, можно воспользоваться методом addRoutes() контекста Camel и реализацией класса RouteBuilder. Все, что остается потом— запустить Camel.
На этом все. В следующей статье мы более подробно поговорим об архитектуре Camel и о том, как можно вклиниться в маршрут передачи данных и выполнить преобразование данных.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *