Apache Camel: Обзор

4813

November 12, 2017

Введение

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

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

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

Одним из таких интеграционных систем является Apache Camel.

Apcahe Camel

Camel как проект был начат в 2007 г. Несмотря на то, что это относительно молодой проект, Camel является достаточно взрослым проектом с открытыми исходными кодами, распространяемыми под лицензией Apache 2, с сильно развитым сообществом. Camel направлен на упрощение интеграции.

Что из себя представляет Camel?

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

Фундаментальным принципом Camel является абстрагированность от типов сообщений, которые проходят по маршрутам. Эта важнейшая особенность данного фреймворка позволяет разработчикам интегрировать между собой совершенно различные информационные системы. Из коробки Camel содержит более 80 протоколов и типов данных. Его модульная и расширяемая архитектура позволяет легко добавить ваши собственные протоколы и типы сообщений.

Camel = ESB?

ESB (enterprise service bus) - сервисная шина предприятия - это связующее программное обеспечение, обеспечивающее централизованный и унифицированный событийно-ориентированный обмен сообщениями между различными информационными системами на принципах сервис-ориентированной архитектуры. Но Camel не является таковой, поскольку в Camel нет компонента-контейнера для сообщений. Но этот недостаток легко устраним с помощью специализированных средств, таких как Apache ActiveMQ (именно так и сделано в Apache ServiceMix.

Почему именно Apache Camel?

Camel представляет новаторские идеи в мир интеграции, ради воплощения которых авторы решили создать индивидуальное решение, а не взять уже готовый фреймворк. Основные особенности фрейморка Camel:

  • Средство (движок) маршрутов и посредничества (Routing and mediation engine)
  • Специфический язык (DSL)
  • Маршрутизатор с полезной нагрузкой - Payload-agnostic router
  • Модель Java-объектов - POJO model
  • Автоматическая конвертация типов сообщений
  • Шаблоны интеграции предприятия (EIPs)
  • Расширяемая библиотека компонентов
  • Модульная, встраиваемая архитектура
  • Легкая настройка
  • Легковесное ядро
  • Комплект для построения тестов
  • Широкое сообщество

Средство (движок) маршрутов и посредничества

Основная характерная черта Camel - его движок маршрутов и посредничества. Механизм маршрутов будет выборочно перемещать сообщения исходя из настроек маршрутов. В Camel маршруты сконфигурированы в комбинации шаблонов проектирования и доменного языка.

Шаблоны интеграции предприятия (EIPs)

Хотя проблемы интеграции разнообразны, основатели Camel - Грегор Хохпе и Бобби Вульф - заметили, что многие проблемы и их решения весьма схожи. Они каталогизировали их в своей книге Enterprise Integration Patterns.

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

Camel в значительной степени основан на EIP. Хотя EIP описывают проблемы интеграции и решений, а также обеспечить общий словарный запас, словарь не формализован. Camel пытается закрыть этот пробел, предоставив язык для описания интеграционных решений.

Специфический язык (DSL)

Специфический для Camel язык (DSL) является важным вкладом в пространство интеграции. Несколько других интеграционных платформ в настоящее время имеют DSL (и некоторые из них позволяют использовать XML для описания правил маршрутизации), но в отличие от Camel их DSL основаны на пользовательских языках. Camel уникален тем, что предлагает несколько DSL на обычных языках программирования, таких как Java, Scala, Groovy, а также позволяет указывать правила маршрутизации в XML.

Цель DSL - позволить разработчику сосредоточиться на проблеме интеграции, а не на инструменте - на языке программирования. Хотя Camel написан в основном на Java, он поддерживает смешивание нескольких языков программирования. У каждого языка есть свои сильные стороны, и вы можете использовать разные языки для разных задач. У вас есть свобода построить решение по-своему с минимальными ограничениями.

Вот несколько примеров DSL, использующих разные языки и функционально эквивалентные:

Java DSL


from("file:data/inbox").to("jms:queue:order");

Spring DSL


<route>
 <from uri="file:data/inbox"/>
 <to uri="jms:queue:order"/>
</route>

Scala DSL


from "file:data/inbox" -> "jms:queue:order"

Эти примеры являются реальным кодом, и они показывают, как легко вы можете направлять файлы из папки в очередь JMS. Поскольку под этим языком существует реальный язык программирования, вы можете использовать существующую поддержку инструментальных средств, такую как завершение кода и обнаружение ошибок компилятора. Вот пример, как это выглядит в IDE Eclipse:

На рисунке видно, как способность IDE Eclipse автоматически дополнять код показывает нам список доступных выражений спецфического языка DSL.

Маршрутизатор с полезной нагрузкой - Payload-agnostic router

Camel может маршрутизировать любую полезную нагрузку - вы не ограничены переносом загрузок XML. Эта свобода означает, что вам не нужно преобразовывать свою полезную нагрузку в канонический формат для облегчения маршрутизации.

Модульная, встраиваемая архитектура

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

Модель Java-объектов - POJO model

Java-бины (Beans, или POJO) считаются основополагающими в Camel, а Camel стремится позволить вам использовать бины в любом месте и в любое время в ваших интеграционных проектах. Это означает, что во многих местах вы можете расширить встроенную функциональность Camel с помощью собственного кода.

Легкая настройка

По возможности соблюдается соглашение о конфигурации, которое минимизирует требования к конфигурации. Чтобы настроить конечные точки непосредственно на маршрутах, Camel использует простую и интуитивно понятную конфигурацию URI. Например, вы можете настроить Camel так, чтобы потребитель сканировал файлы рекурсивно во вложенной папке и включал в работу только файл .txt, как показано ниже:


from("file:data/inbox?recursive=true&include=*.txt")...

Автоматическая конвертация типов сообщений

Camel имеет встроенный механизм преобразования типов, который поставляется с более чем 150 преобразователями. Если вам нужно преобразовать типы, которые Camel не поддерживает, вы можете создать свой собственный конвертер типов.

Компоненты Camel также используют эту функцию; они могут принимать данные в большинстве типов и преобразовывать данные в тип, который они могут использовать.

Эта функция является одной из лучших фаворитов сообщества Camel. Вы даже можете начать задаваться вопросом, почему он не был предоставлен в Java!

Легковесное ядро

Ядро Camel можно считать довольно легким, а общая библиотека насчитывает около 1,6 МБ и имеет только зависимость от ведения журнала Apache Commons и управления ресурсами FuseSource. Это позволяет легко внедрять или развертывать Camel в любом месте, например, в автономном приложении, веб-приложении, приложении Spring, приложении Java EE, контейнере JBI, наборе OSGi, Java Web Start или в приложении Google App. Camel был разработан не для того, чтобы быть сервером или ESB, а вместо этого способным быть встроенным в любую платформу, которую вы выбираете.

Комплект для построения тестов

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

Один и тот же набор тестов широко используется для тестирования самого Camel и включает более 6 000 модульных тестов. Набор тестов содержит тестовые компоненты, которые, например, могут помочь вам протестировать реальные конечные точки. Он также содержит настроек, которые Camel может использовать для определения того, удовлетворяет ли приложение требованиям или нет.

Итак...

Давайте напишем несколько примеров и поймем, как работает Camel.


Полезные ссылки

  1. Camel in Action
  2. Service oriented Java Buisness Integration
  3. Enterprise Integration Patterns
  4. Apache Camel - сайт проекта
  5. Исходные коды Apache Camel - опубликованы на GitHub