Visual Basic, .NET, ASP, VBScript
 

   
 
Описание для автора не найдено
 
     
   
 
Организация межплатформенного взаимодействия программных систем на базе платформы .NET с использованием технологий CORBA
Автор: Женя Золотько, UNETA
Январь 2005
Обзор:
В данной статье описан способ применения технологии CORBA при организации кроссплатформенного взаимодействия разнородных компонентов с использованием IIOPNet.
Содерджание:
  • Введение в проблемную область
  • Технология CORBA
  • IIOPNet
  • Примеры систем, состоящих из разнородных компонентов
  • IDL и его использование в рамках IIOPNet
  • Создание простого CORBA-клиента на C#
  • Создание простого CORBA-сервера на C#
  • Заключение
  • Введение в проблемную область

    Разработка крупномасштабных информационных систем на базе одной платформы – это, безусловно, весьма удачное проектное решение. Использование «родных» для технологии подсистем межкомпонентного взаимодействия, обмена сообщениями, синхронизации, каркасов пользовательского интерфейса, несомненно, дает огромные преимущества при разработке архитектуры, построении, развертывании и внедрении системы.

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

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

    Обсуждению решения этой проблемы в контексте использования платформы Microsoft .NET посвящена эта статья.

    Технология CORBA

    CORBA является промышленным стандартом для реализации функциональности межплатформенного взаимодействия гетероморфных систем. Основные разделы этого стандарта – это стандарт для брокеров объектных запросов (CORBA ORB), стандарт языка определения интерфейсов OMG IDL, и стандарт переносимого протокола взаимодействия между ORB (IIOP).

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

    Недостатками этого стандарта являются его непосредственная сложность (и, иногда, неоднозначность), сложность обучения разработке на основе этого стандарта, и высокий уровень преемственности многих недостатков (как и достоинств) технологий C++ и Java.

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

    Таким образом, при наличии соответствующих инструментальных средств, на данный момент технологию CORBA можно достаточно выгодно использовать как интеграционное средство для наведения программных мостов между гетероморфными системами. Далее в статье рассказывается, как эту технологию можно применить разработчикам, использующим (или собирающимся использовать) Microsoft .NET для разработки компонентов масштабных информационных систем.

    IIOPNet

    IIOPNet является средством, позволяющим программным компонентам, построенным на базе платформы Microsoft .NET, использовать многие возможности стандарта CORBA. IIOPNet распространяется по лицензии LGPL.

    Преимуществом использования IIOPNet является наличие простых, не отводящих разработчика в сторону от идиом и средств .NET, способов использования возможностей CORBA при его помощи.

    IIOPNet использует архитектуру .NET Remoting как базовую, что позволяет использовать протокол IIOP для маршалинга вызовов методов удаленных объектов, размещенных не только на серверах CORBA, но и на серверах .NET Remoting. Кроме того, при работе с IIOPNet проявляются многие преимущества архитектуры Remoting по сравнению с «родной» средой CORBA. Например, при работе с IIOPNet можно и нужно использовать идиомы Remoting, связанные со временем жизни серверных объектов и сбором мусора на сервере (связанные с интерфейсом ILease и т.д.); реализация же подобного механизма, например, в C++, является очень трудоемкой (особенно в отладке) задачей.

    У IIOPNet есть два основных варианта использования.

    1. Реализация CORBA-клиента на базе .NET. При помощи библиотеки IIOPChannel, входящей в состав IIOPNet регистрируется канал поддержки IIOP; после этого можно использовать сервер CORBA, работающий на любой платформе также прозрачно, как это происходит при применении Remoting. При этом необходимо, чтобы разрабатываемое приложение ссылалось на сборку с прокси-классами, скомпилированную при помощи IIOPNet из данных IDL-файлов CORBA-сервера.
    2. Реализация CORBA-сервера на базе .NET. В этом случае используется та же библиотека IIOPChannel, но последующий код публикует реализацию серверных интерфейсов. После этого сервер может использоваться из приложений, написанных на любых языках, поддерживаемых производителями CORBA ORB. Для такого использования необходимо, чтобы имелись описания IDL, соответствующие публикуемым интерфейсам сервера. Эти описания могут быть созданы вручную (с дальнейшей трансляцией в .NET прокси-сборку), либо сгенерированы из публикуемых .NET интерфейсов разрабатываемого серверного приложения.

    Для реализации описанных выше вариантов использования нужно написать всего несколько строк кода (как это будет видно в примерах далее).

    Для описания интерфейсов сервера в рамках технологии CORBA используется язык OMG IDL. Для описания интерфейсов в приложениях на базе .NET используются собственно интерфейсы .NET, информация о которых доступна в форме метаданных. Хорошая сторона IIOPNet состоит в том, что это средство содержит инструменты, которые позволяют преобразовывать информацию об интерфейсах из одного вида в другой. Таким образом, для каждого из описанных выше вариантов использования в зависимости от характера первичной информации об интерфейсах нужно использовать одно из этих средств – CLSToIDLGenerator или IDLToCLSCompiler.

    Примеры систем, состоящих из разнородных компонентов

    Клиент-серверная CRM-система. Состоит из переносимого сервера приложений, написанного на стандартном C++ и определенного множества клиентских приложений (рабочих мест), каждое из которых позволяет пользователю выполнять свою бизнес-роль, определенную системой. Большинство таких клиентских приложений написаны на C++ с использованием MFC и взаимодействуют с подсистемой распределенного взаимодействия, реализованной по стандарту CORBA. Также существует набор надстроек Microsoft Office, сделанных при помощи VBA. Эта система требует сопровождения и эволюционного развития. Большинство разработчиков понимает необходимость внедрения новых технологий (в частности, .NET) при дальнейшем создании новых компонентов системы.

    Решение возникающей проблемы с отсутствием подходящих средств взаимодействия новых клиентских приложений, написанных на базе .NET с унаследованным сервером приложений, реализованным на C++, и поддерживающим интерфейсы CORBA, состоит в следующем. Сначала описания серверных интерфейсов (набор IDL – файлов) транслируется в CLS – сборку при помощи IDLToCLSCompiler. Затем создается новое клиентское приложение (допустим, на C#), сборка которого ссылается на сгенерированную из IDL сборку и на сборку IIOPChannel. После этого в этом приложении регистрируется канал IIOP и выполняется соединение с сервером CORBA c использованием заданных параметров адресации. Далее интерфейсы сервера используются как «родные».

    Система автоматизации супермаркета. Многозвенная система, реализованная на базе технологии Microsoft .NET, и являющаяся «коробочным» продуктом. Сервер приложений реализован на C# и взаимодействует с клиентскими рабочими местами, написанными на C# и VB.NET, при помощи подсистемы Remoting.

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

    В этом довольно сложном случае из практики системной интеграции можно найти выход в использовании протоколов взаимодействия CORBA. Решение следующее. Среди описаний интерфейсов Remoting сервера приложений нашей системы необходимо выделить те, которые нужны для реализации требуемой функциональности интеграции с Web-приложением (скорее всего, самым целесообразным решением будет выбрать все доступные для клиентов Remoting интерфейсы), и транслировать их в IDL. После этого в коде сервера приложений необходимо опубликовать реализации выбранных интерфейсов для использования клиентами CORBA (при помощи библиотеки IIOPChannel).

    На стороне Web-приложения на базе Zope в качестве CORBA-middleware подойдет имеющийся и поставляющийся по лицензии GPL брокер объектных запросов для языка Python OmniORBpy. При помощи IDL – транслятора, входящего в состав этого средства, нужно обработать полученные на предыдущих этапах IDL – файлы, получив при этом набор заглушек и каркасов для использования в языке Python. Далее, сервер, написанный на C#, прозрачно используется из скриптов на Python.

    IDL и его использование в рамках IIOPNet

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

    В стандарте CORBA для описания интерфейсов используется язык OMG IDL. Его синтаксис унаследован от C++. Вот пример очень простого IDL-файла First.idl.

    #ifndef __org_uneta_iiopnet_examples_first__
    #define __org_uneta_iiopnet_examples_first__
    
    #pragma prefix "Org.Uneta.Iiopnet.Examples"
    
    module First
    {
    	interface IHello
    	{
    		wstring SayHello(in wstring name);
    	};
    };
    
    #endif
    

    Здесь определяются модуль First с префиксом Org.Uneta.Iiopnet.Examples, внутри которого находится интерфейс IHello, содержащий единственный метод SayHello, принимающий строковой параметр и возвращающий строку.

    Такие IDL-файлы могут быть написаны вручную (изучение IDL не представляет большого труда для разработчиков, знакомых с синтаксисом C++ или C#), либо сгенерированы из описаний .NET – интерфейсов.

    Основное применение IDL-описаний на стороне .NET-приложений в случае их ручного написания – это их компиляция в .NET-сборки и дальнейшее использование этих сборок для прозрачной ассоциации с интерфейсами CORBA. В случае IDL-файлов, генерированных из .NET-сборок, компилировать их, естественно, не приходится.

    При помощи такой команды можно скомпилировать приведенный выше IDL-файл в готовую .NET сборку с вспомогательными классами.

    IDLToCLSCompiler.exe First First.idl
    

    При этом на выходе мы получим .NET-сборку First.dll. При ее дизассемблировании можно увидеть следующее.

    Результат дизассемблирования

    Итак, в данной сборке содержится одно пространство имен (префикс плюс имя модуля из IDL-файла), в котором содержится интерфейс IHello, наследованный от Ch.Elca.Iiop.Idl.IIdlEntity и помеченный специальным атрибутом.

    Создание простого CORBA-клиента на C#

    Рассмотрим создание очень простого консольного приложения на C#, которое, используя сборку First.dll, полученную методами, описанными выше, библиотеку IIOPChannel, и сведения о локации CORBA-сервера, реализующего имеющиеся интерфейсы (IHello), соединяется с CORBA-сервером, запрашивает с консоли имя пользователя, получает ссылку на клиентский прокси CORBA-объекта, и вызывает у него вызывает метод SayHello интерфейса IHello, передавая в него как параметр полученную от пользователя строку. Возвращенная методом строка выводится на консоль и является CORBA-приветствием пользователю.

    Ниже приведен исходный код такого приложения.

    using System;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting;
    using Ch.Elca.Iiop;
    
    namespace Org.Uneta.Iiopnet.Examples.First
    {
    	public class FirstClient
    	{
    		[STAThread]
    		public static void Main(string[] args)
    		{
    			try
    			{
    				// Адрес CORBA-сервера.
    				const string serverHost = "localhost";
    				const int serverPort = 1234;
    				
    				// Запрашиваем имя пользователя.
    				Console.WriteLine("Введите ваше имя: ");
    				string userName = Console.ReadLine();
    				
    				// Регистрируем канал IIOP.
    				IiopClientChannel channel = new IiopClientChannel();
    				ChannelServices.RegisterChannel(channel);
    				
    				// Адрес CORBA-сервера.
    				string addressString = "iiop://localhost:1234/hello";
    				// Получаем ссылку на клиентский прокси.
    				IHello hello = (IHello)RemotingServices.Connect(typeof(IHello), addressString);
    				
    				
    				// Вызываем CORBA-метод.
    				string serverResponse = hello.SayHello(userName);
    				
    				// Выводим ответ.
    				Console.WriteLine("Ответ сервера: " + serverResponse);
    			}
    			catch (Exception e)
    			{
    				Console.WriteLine("Возникло исключение: " + e);
    			}
    		}
    	}
    }
    

    Из данного примера можно понять, что IIOPNet активно использует средства Remoting для реализации своей функциональности. Для того, чтобы использовать протокол IIOP в работе нам нужно было всего лишь зарегистрировать канал при помощи классов ChannelServices и IiopClientChannel. Далее мы пользуемся обычным вызовом метода Connect() класса RemotingServices для получения ссылки на клиентский прокси CORBA-объекта. Адрес для получения ссылки формируется из имени хоста, номера порта, и «имени объекта» CORBA (“hello”).

    Взглянув на код такого приложения, можно удивиться элегантности способа работы с CORBA из .NET. Сравнив этот код с аналогичным кодом, скажем, на C++, можно сильно впечатлиться простоте.

    Результат работы этого приложения показан ниже.

    Результат работы приложения

    Создание простого CORBA-сервера на C#

    В данном примере мы создадим CORBA-сервер для клиента, приведенного выше.

    Серверное приложение должно определить класс-реализацию для интерфейса IHello,зарегистрировать серверный канал IIOP, создать экземпляр такой реализации интерфейса, опубликовать его при помощи зарегистрированного канала, и ожидать клиентских запросов. Исходный код такого приложения показан ниже.

    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Channels;
    using System.Threading;
    using Ch.Elca.Iiop;
    
    namespace Org.Uneta.Iiopnet.Examples.First
    {
    	public class HelloImplementation : MarshalByRefObject, IHello
    	{
    			public override object InitializeLifetimeService()
    			{
    				// Жизнь не кончается.
    				return null;
    			}
    			
    			public string SayHello(string name)
    			{
    				return "Привет от CORBA, " + name + ".";
    			}
    	
    	}
    	
    	public class FirstServer
    		{
    			[STAThread]
    			public static void Main(string[] args)
    			{
    				// Регистрируем серверный канал IIOP.
    				int serverPort = 1234;
    				IiopChannel channel = new IiopChannel(serverPort);
    				ChannelServices.RegisterChannel(channel);
    			
    				// Создаем реализацию интерфейса IHello и публикуем её.
    				HelloImplementation helloImplementation = new HelloImplementation();
    				string objectURI = "hello";
    				RemotingServices.Marshal(helloImplementation, objectURI);
    				
    				Console.WriteLine("Сервер готов.");
    				Thread.Sleep(Timeout.Infinite);
    			}
    	}
    }
    

    Как и предыдущий, данный пример дает представление о простоте использования IIOPChannel для работы с CORBA из .NET.

    Заключение

    Данная статья может дать вам лишь общее представление о возможностях применения CORBA из приложений на базе Microsoft .NET; для промышленного использования данного подхода необходимо знания в областях (главным образом OMG IDL, брокеры объектных запросов, общая практика системной интеграции).

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

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

       
       
         
      VBNet рекомендует