Интерфейс доступа к серверу приложений
          Прикладные компоненты, распределенные по сети и имеющие абстрактные интерфейсы, могут служить очень удобным строительным материалом при создании распределенных информационных систем.
    Введение в трехзвенную архитектуру 
Один из основных принципов технологии “Клиент-сервер” заключается в разделении функций стандартного приложения на несколько групп, имеющих различную природу. В последнее время информационные системы типа “Клиент-сервер” строятся в соответствии с так называемой трехзвенной архитектурой. Трехзвенная архитектура предлагает разделение функций приложений на три группы. Первая группа – это функции ввода и отображения данных. Вторая группа объединяет чисто прикладные функции, характерные только для данной предметной области. И, наконец, к третьей группе относятся фундаментальные функции хранения и управления данными (базами данных, файловыми системами и т.д). 

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

  • компонент представления, реализующий функции первой группы (клиент)
  • прикладной компонент, поддерживающий функции второй группы, то есть реализующий бизнес-логику системы (сервер приложений)
  • компонент доступа к информационным ресурсам или менеджер ресурсов, поддерживающий функции третьей группы
Прикладной компонент реализуется так называемым сервером приложений.  

Реализация доступа к объектам сервера приложений 

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

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

Объектные модели COM/DCOM и CORBA 

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

Таких моделей индустриального уровня на сегодняшний день, фактически, две: компонентная объектная модель Component Object Model (COM), разработанная Microsoft, и общая архитектура брокеров объектных запросов Common Object Request Broker Architecture (CORBA), которую развивает консорциум OMG. 

Функции COM и CORBA в данном случае – это функции промежуточного программного обеспечения объектной среды. Они необходимы для обеспечения взаимодействия объектов и их интеграции в цельную систему. 

Расширенный вариант COM, который поддерживает удаленное взаимодействие, называется DCOM (Distributed Component Object Model) и базируется на объектном расширении спецификации DCE RPC. DCOM появилась в 1996 году вмести с OC Windows NT. Исходная же модель COM была создана в 1993 году как интеграционная схема для поддержки OLE, технологии построения составных документов. 

В отличие от СОМ, архитектура CORBA [1,2] с самого начала создавалась для распределенных объектных систем. Ее создатель –консорциум OMG – стремился объединить объектную технологию и принципы построения клиент-серверных распределенных систем для того, чтобы предложить архитектуру, способную эффективно поддерживать взаимодействие приложений в сложной гетерогенной корпоративной среде. Чтобы не быть привязанной к конкретной платформе, OMG пошел по пути разработки единых спецификаций, на основе которых компании имели возможность создавать собственные реализации. 

Взаимодействие объектов 

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

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

Протокол должен обеспечивать: 

  • авторизацию пользователя на сервере приложений
  • вызов процедуры сервера приложений с передачей ей параметров, возврат результата и, в случае ошибки, возврат исключения. Вызов процедуры может быть как блокирующим клиентское приложение до получения ответа, так и параллельно исполняемым
  • создание, разрушение, получение свойств и запуск методов объектов, которые реализованы прикладным программным обеспечением сервера приложений. Объектный вызов аналогичен процедурному - может быть блокирующим или параллельным, возвращается результат исполнения или исключение. Объекты сервера приложений должны быть разработаны с учетом интерфейса с протоколом.
  • сервер приложений должен иметь возможность запросить дополнительные данные у клиента и сообщать ему о ходе выполнения процесса при помощи механизма call-back’ов (они напоминают передачу параметра типа указателя на процедуру).
  • весьма полезное свойство программного обеспечения, реализующего описываемый протокол - поддержание пользовательских имен объектов и переменных. Например, можно написать задачу - консоль сервера приложений, которая отправляет на сервер запрос пользователя, введенный с клавиатуры. При этом, чтобы выполнить последовательно два метода объекта, необходимо запомнить его идентификатор после первого обращения, связав его с именем, которое клиентское ПО может сгенерировать.
Такой протокол реализован в DCOM, однако он обладает существенными недостатками: 
  • протокол является закрытым, поэтому нет возможности его тонкой настройки под свои нужды в каждой конкретной реализации
  • протокол жестко привязан к аппаратной платформе
  • нет возможности реализации callback'ов
Таким образом, перед разработчиком может встать необходимость создания такого протокола для доступа к прикладным объектам сервера приложений. Постараемся представить себе, каким образом можно решить эту проблему. Далее описывается программный интерфейс протокола доступа к серверу приложений, который был разработан автором.  
    Состав и назначение основных частей программного обеспечения 
Как видно из рисунка, взаимодействие клиента и сервера может происходить как локально, то есть в пределах одной машины, так и в распределенной среде. Когда клиент вызывает метод сервера, этот вызов перехватывается частью кода, которая называется функцией - заместителем (proxy). “Заместитель” является представителем настоящего сервера и располагается в адресном пространстве клиента. “Заместитель” получает вызов метода, упаковывает параметры, которые будут посланы локальному серверу и вызывает соответствующий метод при помощи RPC. Клиент же не знает о существовании “Заместителя” и не интересуется его “деятельностью”. 
 
(Рисунок взят с компакт-диска Microsoft Developer’s Network)

Со стороны сервера функция-посредник (stub) получает от “Заместителя” вызов метода, распаковывает параметры и вызывает соответствующий метод реального сервера. Сервер, выполнив клиентский запрос, может возвратить некоторый результат. “Посредник” перехватывает результат, упаковывает любые возвращаемые значения и направляет эту информацию соответствующему “Заместителю”. “Заместитель” получает возвращаемые значения, распаковывает их и передает клиенту.  

Рассмотрим подробнее работу “Заместителя” и “Посредника”. 

“Заместитель” - это задача, которая обеспечивает разбор клиентских запросов и запуск требуемых процедур на сервере приложений. Представляет из себя приложение, обеспечивающее интерфейс для авторизации на сервере, реализацию процедурных вызовов, объектных вызовов и информационных запросов для наблюдения за ходом исполнения запросов. Обеспечивает вызов call-back’ов, установленных в клиентской части. Запросы клиентского приложения передает по транспортному протоколу на сервер приложений, а ответы принимает и передает клиентскому ПО. 

“Посредник” в принципе аналогичен “Заместителю”, за исключением того, что запросы не передаются в сеть, а обращение к серверному объекту производится напрямую. Он представляет из себя объектную библиотеку для сборки с прикладным программным обеспечением сервера приложений. Для сессии каждого клиента создается отдельный экземпляр “Посредника”. На сервере приложений также необходима некоторая задача, которая будет обрабатывать приходящие запросы, разбирать их и осуществлять вызов требуемых процедур на сервере через “Посредника”. Необходимо также обеспечить поддержку очереди запросов для каждого клиента и отвержение запросов, если до этого был выполнен блокирующий вызов. 
 

      Программный интерфейс “Посредника” и “Заместителя” для работы с прикладными объектами сервера приложений 
 
Название метода
Назначение
Передаваемы параметры
Login Авторизация пользователя на сервере приложений
  1. Имя пользователя
  2. Пароль
  3. Роль
CallASproc Вызов процедуры или функции сервера приложений
  1. Имя функции
  2. Список параметров вызова
  3. Тип вызова
  4. Возникшее исключение
CallASObjMethod Вызов метода прикладного объекта сервера приложений
  1. Указатель на объект или на один из его интерфейсов
  2. Имя метода
  3. Список параметров вызова
  4. Тип вызова
  5. Возникшее исключение
GetASObjProp Получение свойства прикладного объекта сервера приложений
  1. Указатель на объект или на один из его интерфейсов
  2. Имя свойства
SetASObjProp Установка значения свойства прикладного объекта сервера приложений
  1. Указатель на объект или на один из его интерфейсов
  2. Новое значение свойства
RegisterVar Создает переменную и устанавливает ее значение
  1. Имя переменной
  2. Значение переменной
UnregisterVar Уничтожает переменную 1. Имя переменной
GetVar Возвращает значение переменной 1. Имя переменной
SetVAr Устанавливает значение переменной
  1. Имя переменной
  2. Новое значение перменной
TieASObject Связывает зарегистрированный объект с символьным именем
  1. Символьное имя
  2. Интерфейс объекта
UntieASObject Освобождает символьное имя, не удаляя объекта 1. Символьное имя
Login – регистрация пользователя на сервере приложений. При выполнении этой функции производятся все действия по регистрации нового пользователя и созданию его “жизненного пространства”. 

CallASproc – вызывает метод сервера приложений с параметрами. Тип вызова указывает, блокирующий вызов или нет. Возвращает список параметров с результатами выполнения. Для реализации метода “Посреднику” необходимо обратится к библиотеке функций сервера приложений. “Заместитель” должен упаковать имя функции и параметры и отправить запрос в сеть. Функция должна произвести разбор входных параметров – выделить из них объектные ссылки и проверить объекты, определенные ими на зарегистрированность у “Посредника”. Проверка идентичности объекта производится сравнением с именем класса и его идентификатором, который должен быть предварительно прочитан при регистрации объекта. Также необходимо выделить параметры типа ”call-back” и при наличии зарегистрировать их.  

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

GetASObjProp – возвращает значение свойства объекта сервера приложений. 

SetASObjProp – устанавливает значение свойства у указанного объекта. 

Функции TieASObject и UntieASObject весьма полезны для реализации доступа к прикладным объектам сервера приложений посредством символьного имени, которое может сгенерировать клиент. 

Также для успешного взаимодействия сервера приложений и клиента обоим компонентам, то есть “Посреднику” и “Заместителю”, необходимо иметь следующие функции и свойства : 

KillProcess – аварийно завершает процесс, ранее запущенный 

GetProcessCondition – запрашивает текущее состояние процесса. Возможные состояния – исполняется, в очереди, ждет ответа на call-back. 

Synhronize – сверяет идентификаторы зарегистрированных процессов, объектов и call-back’ов на клиентской и серверной части. Для Посредника процессы и объекты, которых нет на клиенте молча разрушаются, процессы и объекты, которых нет на сервере, но есть на клиенте, разрушаются с генерацией исключения для прикладной программы. Для Заместителя процессы и объекты, которых нет на сервере создаются заново, а процессы и объекты, которых нет на клиенте, но есть на сервере молча разрушаются. 

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

Методы только Посредника: 

InitCallBack – инициирует вызов call-back’а на стороне клиента с параметрами. Сall-back может вызываться тремя способами : блокирующим, неблокирующим и без подтверждения. Это указывается в типе вызова call-back’а.  

LockListener – запрещает обрабатывать входящие запросы. На все входящие запросы интерфейс отвечает, что он заблокирован. Количество вызовов должно подсчитываться в счетчике вызовов блокировок. 

UnLockListener – вычитает единицу из счетчика вызовов блокировки. Вновь разрешает обрабатывать запросы, если счетчик вызовов обнулился. 

CheckLock – проверка заблокированности интерфейса. 

DownServer – завершение работы сервера. Все начаты процессы завершаются, все созданные объекты разрушаются. 

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

Литература 

[1] Объектные технологии построения распределенных информационных систем, Юрий Пуха, СУБД №3/97 

[2] Симфония CORBA, Марина Аншина, Открытые системы, №3/98 

[3] COM или CORBA? Вот в чем вопрос … Наталья Дубова, Открытые системы, №3/99 

Интернет-ресурсы 

Официальный сервер OMG http://www.omg.org 

Описание проектов на базе CORBA http://www.corba.org 

Один из разработчиков CORBA Алан Поуп имеет свою страницу http://www.qds.com/people/apope/CORBA 

Распределенные объектные технологии от Microsoft http://www.objectwatch.com 

Несколько серверов, на которых содержиться информация по распределенным объектным технологиям: 

http://www.adtmag.com 

http://www.enterprisedev.com/ 

http://www.intelligententerprise.com/ 

http://www.sdmagazine.com/ 

http://www.componentmag.com/ 

http://www.appdevadvisor.com 

http://www.cutter.com/ 

http://www.objectnews.com/ 

http://www.osp.ru/os/ 
 

 
Хостинг от uCoz