USB-подобные универсальные порты для корпоративной сервисной шины (ESB): Часть 2. Концепция, процесс и реализация

Узнайте о концепции и реализации универсальных портов для ESB

В первой части этой серии статей вы узнали о базовых функциях современных корпоративных сервисных шин (ESB), а также о сложностях применения современных ESB. Во второй части этой серии вы узнаете о новой концепции универсальных портов для ESB и о способах их реализации. Универсальные порты позволяют решить многие проблемы, с которыми сталкиваются пользователи ESB. Универсальный порт работает подобно USB-порту, который используется для подключения разного рода устройств к компьютеру. Аналогичным образом, универсальный порт может применяться для подключения приложений к ESB и, опосредованно, к другим приложениям. Такие приложения могут осуществлять некоторые или все свои функции через несовместимые формы сервисов и при этом использовать единый тип порта. В третьей части этой серии статей вы узнаете о многочисленных преимуществах универсальных портов.

Уасим Рошен, ИТ-архитектор, IBM

Д-р Уасим РошенУасим Рошен (Waseem Roshen) — доктор наук Университета штата Огайо (г. Колумбус, США), имеющий более чем 18-летний практический опыт в сфере информационных технологий. В настоящее время д-р Рошен работает ИТ-архитектором в Центре изучения и распространения передовых методов архитектуры предприятия и технологий корпорации IBM. Он имеет богатый опыт в области распределенных вычислений, в том числе сервис-ориентированной архитектуры (SOA). Кроме того, он обладает опытом в сфере заказного проектирования, интеграции и J2EE (теперь известной как JEE). В настоящее время его интересы включают SOA и Web-сервисы, квантовые компьютеры и облачные вычисления. Д-р Рошен имеет более 60 публикаций и 37 патентов и является членом IEEE и Компьютерного сообщества IEEE. Он является автором книги “Интеграция предприятия на основе SOA: пошаговое руководство по интеграции приложений на основе сервисов”.



02.04.2012

Введение

Корпоративная сервисная шина (ESB) является ключевым компонентом инфраструктуры сервис-ориентированной архитектуры (SOA). ESB предоставляет эффективные средства соединения приложений, которые могут использовать несовместимые формы сервисов для реализации некоторых или всех своих функций. Такая ситуация для современных ESB схематически показана на рисунке 1. Самое важное, что нужно отметить, — это то, что каждое приложение подключается к ESB через специальный порт. Другими словами, каждый тип порта обслуживает определенный тип приложений, использующий для реализации своих функций определенный коммуникационный протокол и формат сообщений/данных.

Рисунок 1. Подключение приложений через ESB с помощью специальных портов
Applications connecting through an ESB using specific port types

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

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

Концепция универсального порта

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

Рисунок 2. Подключение приложений к ESB через один тип порта (универсальный порт)
Applications connecting to an ESB using a single port type (Universal Port)

Для лучшего понимания концепции универсального порта полезно применить аналогию с компьютерным оборудованием. До появления USB для подключения к компьютеру разных устройств, таких как принтеры, флэш-накопители или съемные жесткие диски, использовались разные типы портов. Каждый тип порта обслуживал определенный тип устройств. Таким образом, для подключения принтера компьютер должен был иметь порт определенного типа. Аналогичным образом, компьютеру требовался специальный тип порта для подключения дополнительного жесткого диска. Однако с появлением USB потребность в специальных типах портов для каждого типа устройств отпала, и теперь почти все устройства можно подключить к компьютеру через порт одного типа — USB-порт.

Процесс

Общий процесс работы ESB с универсальными портами показан на рисунке 3. Этот процесс состоит из следующих шагов:

  1. Процесс начинается, когда приложение подключается к ESB через USB-подобный порт и отправляет сообщение. Это сообщение может иметь любой формат и может отправляться с помощью любого протокола.
  2. Сообщение перехватывается программой распознавания протокола, которая определяет коммуникационный протокол, использованный приложением.
  3. После распознания коммуникационного протокола сообщение направляется в обработчик соответствующего протокола. Заметьте, что система должна иметь один обработчик протокола для каждого типа протокола. Таким образом, мы получаем отдельные обработчики протокола для протоколов HTTP, SMTP, IIOP и т.д. Назначение этих обработчиков в том, чтобы извлечь тело сообщения, которое не должно зависеть от протокола, использованного приложением.
  4. Затем извлеченное сообщение пересылается в другой программный компонент, называемый детектором формата. Этот программный компонент отвечает за распознавание формата сообщения. Примеры форматов сообщений включают SOAP, (необработанный) XML, copybook и т.п.
  5. После определения формата сообщения детектор формата пересылает сообщение соответствующему компоненту, который выполняет преобразование в канонический (общий) формат.
  6. Программа преобразования преобразует канонический формат в целевой формат. Целевой формат определяется типом целевого приложения.
  7. Программа преобразования отправляет сообщение генератору целевого протокола. Получив сообщение, этот компонент генерирует целевой протокол с сообщением в целевом формате.
  8. И, наконец, генератор целевого протокола отправляет сообщение целевому приложению.
Рисунок 3. Процесс реализации ESB с помощью универсального порта
Process of implementing an ESB with Universal Ports type

Кликните, чтобы увидеть увеличенное изображение

Рисунок 3. Процесс реализации ESB с помощью универсального порта

Process of implementing an ESB with Universal Ports type

Обратите внимание, что большую часть шагов (3–8) можно выполнить за пределами порта внутри тела ESB. Перемещение шагов 3–8 в тело ESB позволяет повторно использовать большую часть программного кода. Единственное, что остается самому универсальному порту — это распознать коммуникационный протокол, используемый подключающимся приложением, что схематично показано на рисунке 4. Таким образом, универсальный порт оказывается весьма легковесным компонентом. В следующем разделе мы опишем два метода распознавания коммуникационного протокола.

Рисунок 4. Универсальный порт является достаточно легковесным компонентом, поскольку большая часть обработки выполняется в теле ESB
Universal Port as a light weight component

Распознавание коммуникационного протокола

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

Метод суперпротокола

Первый метод основан на применении «суперпротокола» или «метапротокола», который служит контейнером для всех протоколов высокого уровня. Контейнер суперпротокола включает заголовок, который несет информацию о типе протокола высокого уровня, использованного приложением (например, HTTP, IIOP, JRMP или JMS/MQ). Этот заголовок заносится в сообщение подключающимся приложением и помещается в первую строку сообщения. Оставшаяся часть сообщения содержит заголовки протоколов более высокого уровня и само тело сообщения. При использовании суперпротокола универсальному порту остается только разобрать первую строку принятого сообщения и определить, какой протокол высокого уровня применяет подключающееся приложение. После распознавания протокола высокого уровня программа универсального порта просто перенаправляет сообщение соответствующему прослушивающему процессу в теле ESB для дальнейшей обработки. Таким образом, универсальный порт получается весьма легковесным, и его функция сводится лишь к разбору первой строки сообщения. Кроме того, большая часть кода процесса, прослушивающего протокол высокого уровня, будет использоваться повторно, поскольку каждый прослушивающий процесс является частью тела ESB и может использоваться любым числом универсальных портов. Небольшой недостаток этого метода заключается в том, что потребуется немного изменить код приложения, чтобы оно могло использовать упомянутый суперпротокол.

В листинге 1 приведен пример использования суперпротокола в качестве контейнера протокола высокого уровня (HTTP).

Листинг 1. Пример кода для применения суперпротокола в качестве контейнера протоколов высокого уровня, таких как HTTP
Protocol: HTTP   Format: SOAP
GET /intro.html HTTP/1.1
User-Agent: Mozilla/5.0 (Windows;en-GB;...
Accept: text/*,image/jpeg, */*
Accept-Language: en-gb
...
...

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

Распознавание на уровне сокета

Второй метод решения проблем, упомянутых в первом разделе, опирается на тот факт, что все протоколы высокого уровня, такие как HTTP, IIOP, JRMP, JMS/MQ и т.п., построены поверх TCP/IP. Иначе говоря, все эти протоколы используют сокеты TCP/IP для обеспечения взаимодействия между приложениями и ESB. Кроме того, все эти протоколы имеют заголовки, содержащие информацию, на основании которой можно распознать протокол высокого уровня, который был использован подключающимся приложением. Эти заголовки видимы и читаемы при чтении входного сообщения на уровне сокета. Таким образом, этот метод распознавания протокола опирается на прослушивание входящих сообщений на уровне сокета. Это делает универсальный порт очень легковесным компонентом, поскольку ему достаточно считать первый заголовок/строку сообщения и затем переслать сообщение соответствующему процессу прослушивания протокола в теле ESB. Как и в первом методе, это позволяет повторно использовать большую часть программного кода, поскольку каждый прослушивающий процесс является частью тела ESB, и один и тот же прослушивающий процесс можно использовать для любого числа универсальных портов.

Проиллюстрируем работу этого метода на примере. Допустим, входящий запрос использует протокол HTTP. Если прочесть этот запрос на уровне сокета, заголовок входящего HTTP запроса будет выглядеть примерно так (листинг 2).

Листинг 2. Распознавание на уровне сокета
GET /intro.html HTTP/1.1
User-Agent: Mozilla/5.0 (Windows;en-GB;...
Accept: text/*,image/jpeg, */*
Accept-Language: en-gb
...
...

Самой важной для нас частью этого заголовка является заголовок в строке 1. Этот заголовок обязателен для протокола. Присутствие в этом заголовке строки HTTP тоже обязательно. Таким образом, достаточно взглянуть на первую строку, чтобы идентифицировать этот протокол как HTTP. Кроме того, этот конкретный протокол начинается со слова, входящего в короткий список специальных слов, который содержит такие специальные слова, как GET, PUT, DELETE и т.п. Таким образом, достаточно прочесть первое слово первой строки входящего запроса и, если это слово совпадает с любым словом из упомянутого короткого списка, можно сделать вывод, что входящий запрос использует протокол HTTP.

Чтение сообщения на уровне сокета выполняется достаточно просто на большинстве распространенных языков программирования, таких как Java и C++. В качестве примера приведем фрагмент кода на языке Java, который можно использовать для наших целей (листинг 3).

Листинг 3. Считывание сообщения на уровне сокета
import java.io.*;
import java.net.*;

public class testServer {

//объявление сервера и клиента сокета
SocketServer myServer = null;
ClientServer myClient = null;

//объявление входного и выходного потока
DataInputStream in;
PrintStream out;

//объявление переменной, содержащей 
//первую строку входящего сообщения
String firstLine = null;

//открытие сокета для прослушивания порта 
//номер 8080
myServer = new ServerSocket (8080);
//подтверждение соединения
myClient = myServer.accept();

//получение входящего сообщения
in = new DataInputStream ( myClient.getInputStream());

//сохранение первой строки сообщения в
//локальной переменной
firstLine = in.getLine();


...
...

}

Обратите внимание, что переменная firstLine в приведенном выше примере содержит информацию, которая нужна нам для распознавания протокола высокого уровня, использованного подключающимся приложением. Благодаря такому простому и короткому коду универсальный порт получается достаточно легковесным и использует затем соответствующий прослушивающий/обрабатывающий процесс в теле ESB, как показано на рисунке 4. Это также позволяет повторно использовать большую часть кода, поскольку каждый прослушивающий/обрабатывающий процесс может использоваться несколькими разными универсальными портами.

Заключение

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

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

В следующей части этой серии статей вы узнаете о многих преимуществах универсальных портов в ESB.

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=SOA и web-сервисы
ArticleID=807950
ArticleTitle=USB-подобные универсальные порты для корпоративной сервисной шины (ESB): Часть 2. Концепция, процесс и реализация
publish-date=04022012