Remoting

advertisement
Технология удаленного
доступа к объектам Remoting
2. Распределенные приложения
Распределенное приложение — это
приложение, в котором обработка
происходит на двух или нескольких
компьютерах, а, значит, и обрабатываемые
данные также являются распределенными.
Современная технология распределенных
приложений должна быть эффективной,
расширяемой, поддерживающей транзакции,
позволяющей взаимодействовать с другими
технологиями, обладающей большими
возможностями настройки, поддерживать
работу в Интернет и т. д.
3. Виды распределенных архитектур




Модульное программирование
Клиент-серверные (двухуровневые)
архитектуры
Многоуровневые архитектуры
Одноранговые архитектуры
4. Модульное программирование
Один из фундаментальных приемов
ограничения сложности - разделение кода на
отдельные части по функциональному
назначению. Такой прием можно применять
на разных уровнях путем объединения кода в
процедуры, процедур в классы, классов
компоненты, и т.д. Распределенные
приложения не только получили большие
преимущества от использования данной
концепции, но и помогают обеспечить ее
применение, так как модульность
необходима для распределения кода по
разным компьютерам. Фактически основные
категории распределенных архитектур
различаются степенью ответственности,
возлагаемой на отдельные модули, и
способами их взаимодействия.
5. Клиент-серверные архитектуры
Клиент-сервер — это наиболее ранняя и
фундаментальная из распределенных
архитектур. В широком смысле это просто
клиентский процесс, запрашивающей
обслуживание у серверного процесса.
Обычно клиентский процесс отвечает за
уровень представления (или
пользовательский интерфейс). На этом
уровне выполняется проверка введенных
пользователем данных, выполнение
вызова сервера и применение некоторых
бизнес-правил. Сервер выступает в
качестве механизма исполнения
клиентских запросов путем применения
прикладных алгоритмов и взаимодействия
с такими ресурсами, как базы данных и
файловые системы. Очень часто у одного
сервера бывает много клиентов. Следует
отметить, что роли клиента и сервера в
общем случае не обязательно
исполняются разными компьютерами.
6. Многоуровневые архитектуры
Обычно двухуровневые архитектуры легко реализуемы,
но имеют проблемы масштабируемости. В
трехуровневых архитектурах для решения различных
задач используется промежуточный уровень.
Уровень
представления
Приложение
Windows
Forms
Бизнес-уровень
Уровень данных
Объект
Бизнес-правило
Объект
доступа к
данным
БД
Объект
доступа к
данным
Internet
Explorer
Объект
Бизнес-правило
Объект
доступа к
данным
БД
7. Одноранговые архитектуры
В некоторых случаях целесообразно использовать
модель более тесного взаимодействия, в которой
границы между клиентом и сервером размыты.
Подобная организация применяется в сценариях
рабочих групп, так как основная задача подобных
распределенных приложений — совместное
использование информации и средств обработки,
Исключительно одноранговая (peer-to-peer) среда
состоит из множества отдельных узлов без
центрального сервера. В отсутствие
общеизвестного (well-known) главного сервера
необходим механизм, позволяющий узлам
отыскивать друг друга. Обычно для этого
используются приемы на основе
широковещательных сообщений или некоторые
предопределенные параметры конфигурации.
8. Одноранговая архитектура
Узел
Узел
Узел
Узел
9. Преимущества распределенных
приложений



Отказоустойчивость (система должна сохранять
работоспособность при сбоях в ней. При построении
отказоустойчивой системы применяют избыточность.
Распределение копий функциональных модулей по
разным узлам повышает вероятность того, что сбой
одного узла не повлияет на избыточные объекты, на
других узлах);
Масштабируемость - это способность системы
выдерживать увеличивающуюся нагрузку лишь с
небольшим снижением производительности
(Достигается путем распределения разных
функциональных частей приложения по разным
узлам. );
Администрирование - управление аппаратной и
программной конфигурацией большой сети ПК
(Наиболее удобный вариант - перенести наиболее
часто изменяющиеся программы в
централизованное хранилище и обеспечить к нему
удаленный доступ).
10. Архитектура Remoting
Рассмотрим архитектуру, которая позволяет
клиенту связываться с удаленным объектом.
Когда клиент создает экземпляр удаленного
объекта, то он получает заместителя
(прокси) для доступа к объекту вместо
самого объекта. Прокси предоставляет такой
же интерфейс, как и реальный объект. Когда
клиент вызывает метод или получает доступ
к полю или свойству прокси, то за передачу
запроса к удаленному объекту отвечает
прокси.
11. Инфраструктура Remoting состоит из
четырех главных компонентов:


Рабочая среда Remoting – отвечает за
динамическое создание прокси от имени
клиента. Она также выполняет
инициализацию подходящего канала связи
на сервере, предназначенного для ожидания
входящих запросов.
Прокси - Прокси-объект отвечает за
получение пользовательских вызовов
метода. Как только получен такой вызов,
прокси обеспечивает получение помощи от
подходящего форматера и транспорт для
передачи параметров удаленному объекту.
12.


Средство форматирования (форматтер)отвечает за сериализацию параметров в
формат, подходящий для передачи. Remoting
поставляется в комплекте с двумя
форматтерами 0 двоичным и SOAP.
Канал связи – обеспечивает пересылку
сообщений между клиентом и сервером. Канал
связи со стороны клиента отвечает за посылку
сообщения с помощью назначенного
транспортного протокола. Канал связи со
стороны сервера осуществляет мониторинг
входящих сообщений и передачу этих
сообщений подходящему форматтеру.
Remoting поставляется с двумя каналами связи
– TCP и HTTP.
13. Инфраструктура Remoting
14. Этапы создания распределенного
приложения




Создание интерфейса (.dll);
Реализация интерфейса (.dll);
Создание сервера;
Создание клиента.
15. Создание интерфейса
File / New / Project / ClassLibrary
16. Программный код интерфейса
(проект Interface1)
using System;
namespace Interface1
{
public interface MyInterface
{
string method1();
string method2();
}
}
17. Создание интерфейса


Откомпилировать проект;
В каталоге /bin/Debug появляется
файл Interface1.dll
18. Реализация интерфейса




Интерфейс реализуется в тестируемом
объекте (проект Object1);
Для создание проекта используется dll:
File / New/ Project / ClassLibrary
В каталог bin/Debug копируется файл
Interface1.dll;
В окне проекта Solution Explorer
добавляются ссылки (add References) на
Interface1.dll (через Browse…) и
System.Runtime.Remoting.
19. Подключение ссылок
20. Программный код тестируемого
объекта (проект Object1)
using System;
using Interface1;
namespace Object1
{
public class MyObject:
MarshalByRefObject, MyInterface
{
public string method1()
{
return "method1";
}
public string method2()
{return "method2";}
}}
Тип, передаваемый по ссылке
Иногда необходимо, чтобы все вызовы объекта,
созданного в некотором домене приложения,
обращались именно к экземпляру в данном домене,
а не к его копии в другом домене. Например,
объекту могут требоваться ресурсы, доступные
только объектам, исполняющимся на данном
компьютере. В этих случаях используются типы,
передаваемые по ссылке, для которых
инфраструктура ,NET Remoting передает ссылку на
экземпляр объекта, а не его сериализованную
копию. .NET Framework требует, чтобы типы,
передаваемые по ссылке, наследовали от
System.MarshatByRefObject. Простое наследование
от этого класса обеспечивает возможность
удаленного доступа к экземплярам производного
типа
Объявление типа, передаваемого по ссылке:
class SomeMBRType : MarshatByRefObject
{ …
}
22. Реализация интерфейса(создание
тестируемого объекта)


Откомпилировать проект Object1;
В каталоге /bin/Debug появляется
файл Object1.dll наряду с файлом
Interface1.dll
23. Создание сервера



Создать проект-приложение
(WindowsApplication) MyServer;
Скопировать в каталог /bin/Debug
файлы Object1.dll и Interface1.dll;
В окне проекта Solution Explorer
добавить ссылки (add References)
на Interface1.dll, Object1.dll и
System.Runtime.Remoting.
24. Запуск программы-сервера
25. Программный код сервера
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using
System.Runtime.Remoting.Channels.Tcp;
using Interface1;
using Object1;
26. Кнопка Start
System.Runtime.Remoting.Channels.Tcp.TcpC
hannel channel=new TcpChannel(8080);
Object1.MyObject obj=new MyObject();
System.Runtime.Remoting.RemotingServices.
Marshal(obj,"object");
27. Типы каналов
Remoting предоставляет два типа каналов:
• HttpChannel ;
• TcpChannel;
Хотя их общая структура похожа, они
отличаются транспортом, используемым для
передачи сообщений, HTTP и TCP способны
обеспечить транспорт в большинстве
случаев, однако иногда может возникать
необходимость применения других
транспортов.
Например, когда требуется доступ к удаленным
объектам с беспроводного устройства,
использующего протокол WAP (Wireless
Application Protocol).
28. Кнопка Stop
Application.Exit();
29. Создание клиента



Создать проект-приложение
MyClient;
Скопировать в каталог /bin/Debug
файл Interface1.dll;
В окне проекта Solution Explorer
добавить ссылки (add References)
на Interface1.dll (через Browse…) и
System.Runtime.Remoting.
30. Программный код клиента
…
using System.Runtime.Remoting;
using Interface1;
…
private void button1_Click(object sender,
System.EventArgs e)
{
MyInterface ob=
(MyInterface)Activator.GetObject(
typeof(MyInterface),
"tcp://127.0.0.1:8080/object");
}
this.textBox1.Text=ob.method1();
this.textBox2.Text=ob.method2();
31. Переопределение метода в
Object
public string method1(string us, string pw)
{
System.Data.SqlClient.SqlConnection
sqlConnection1=new
System.Data.SqlClient.SqlConnection();
System.Data.SqlClient.SqlCommand
sqlCommand1 = new
System.Data.SqlClient.SqlCommand();
// sqlConnection1
sqlConnection1.ConnectionString = "workstation
id=\"HOME-VBQ94BWURG\";packet
size=4096;integrated security=SSPI;initia" +
"l catalog=usera;persist security info=False";
32. Переопределение метода в
Object
// sqlCommand1
sqlCommand1.CommandText = "proc_user";
sqlCommand1.CommandType =
System.Data.CommandType.StoredProcedure;
sqlCommand1.Connection = sqlConnection1;
sqlCommand1.Parameters.Add(new
System.Data.SqlClient.SqlParameter("@us",
System.Data.SqlDbType.VarChar, 20));
sqlCommand1.Parameters.Add(new
System.Data.SqlClient.SqlParameter("@pw",
System.Data.SqlDbType.VarChar, 10));
sqlCommand1.Parameters.Add(new
System.Data.SqlClient.SqlParameter("@fam",
System.Data.SqlDbType.VarChar, 20,
System.Data.ParameterDirection.Output, false,
((System.Byte)(0)), ((System.Byte)(0)), "",
System.Data.DataRowVersion.Current, null));
33. Переопределение метода в
Object
try
{
sqlConnection1.Open();
sqlCommand1.Parameters["@us"].Value=us;
sqlCommand1.Parameters["@pw"].Value=pw;
sqlCommand1.ExecuteNonQuery();
string
res=sqlCommand1.Parameters["@fam"].Value.
ToString();
34. Переопределение метода в
Object
if (res!="")
return res;
else
return "Доступа нет";
}
catch(Exception ex)
{
return ex.Message;
}
35. Изменения в программу-клиент
36. Кнопка Подключиться к объекту
Interface1.MyInterface
ob=(MyInterface)Activator.GetObject(typeof(MyIn
terface),"tcp://127.0.0.1:8080/object");
try
{
this.label1.Text=ob.method1(
this.textBox1.Text.ToString(),
this.textBox2.Text.ToString());
}
catch(Exception ex)
{
this.label1.Text="no"+ex.Message;
}
37. Использование двух интерфейсов
Создание интерфейса Interface2
using System;
namespace Interface2
{
public interface MyInterface2
{
string method22();
}
}
38. Использование двух интерфейсов
Добавления в Object1
using System;
using Interface1;
using Interface2;
…
public class
MyObject:MarshalByRefObject,MyInterface,MyInte
rface2
{…
public string method22()
{
return "privet from interface2 Object1";
}
}
39. Использование двух интерфейсов
Добавления в MyClient
using System.Runtime.Remoting;
using Interface1;
using Interface2;
…
Interface1.MyInterface
ob=(MyInterface)Activator.GetObject(typeof(MyIn
terface),"tcp://127.0.0.1:8080/object");
Interface2.MyInterface2
ob2=(MyInterface2)Activator.GetObject(typeof(My
Interface2),"tcp://127.0.0.1:8080/object");
…
this.label4.Text=ob2.method22();
40. Использование различных реализаций
(объектов)
Создание Object2
using System;
using Interface2;
namespace Object2
{
public class
MyObject2:MarshalByRefObject,MyInterface2
{
}
}
public string method22()
{
return "privet from object2";
}
41. Использование различных реализаций
(объектов)
Добавления в MyServer
using Interface1;
using Interface2;
using Object1;
using Object2;
…
System.Runtime.Remoting.Channels.Tcp.TcpChannel
channel=new TcpChannel(8080);
Object1.MyObject obj=new MyObject();
System.Runtime.Remoting.RemotingServices.Marsh
al(obj,"object");
Object2.MyObject2 obj2=new MyObject2();
System.Runtime.Remoting.RemotingServices.Marsh
al(obj2,"object2");
42. Использование различных реализаций
(объектов)
Добавления в MyClient
Interface1.MyInterface
ob=(MyInterface)Activator.GetObject(typeof(MyIn
terface),"tcp://127.0.0.1:8080/object");
Interface2.MyInterface2
ob2=(MyInterface2)Activator.GetObject(typeof(My
Interface2),"tcp://127.0.0.1:8080/object");
Interface2.MyInterface2
ob22=(MyInterface2)Activator.GetObject(typeof(
MyInterface2),"tcp://127.0.0.1:8080/object2");
43. Использование различных реализаций
(объектов)
Добавления в MyClient
Method1 определен в Interface1,
реализован в Object1
this.label1.Text=ob.method1{“login”,”passw
ord”);
Method22 определен в Interface2,
реализован в Object1
this.label4.Text=ob2.method22();
Method22 определен в Interface2,
реализован в Object2
this.label5.Text=ob22.method22();
Download