Escolar Documentos
Profissional Documentos
Cultura Documentos
Objetos distribuidos
Com o advento das redes de computadores, o paradigma das aplicações distribuídas
nasceu. Em sua primeira instância, as aplicações centradas em um servidor sendo
inicializadas pelo cliente através desta interligação. Esta tecnologia disponibilizou
flexibilidade para o desenvolvimento de sistemas centralizados. Esta conhecida como
cliente-servidor pode foi denominada de arquitetura de duas camadas.
Buscando uma escalabilidade maior e uma tolerância maior a falhas foi introduzida
mais uma camada entre os dados e o cliente, denominando-a de camada de
negócios.Esta fica responsável por atender a demanda dos clientes, processá-las e
projetar seus resultados em um banco de dados. Buscando uma melhor distribuição
para estas aplicações, criou-se a necessidade de distribuir o processamento entre o
cliente e o servidor. Partindo deste princípio criou-se os RPCs (Remote Procedure
Call), estes por sua vez solicitam a execução de processos remotos hospedados nos
servidores. Esse primeiro conceito de middleware possibilitou a execução de uma
mesma aplicações em plataformas diferentes, somente disponibilizando uma interface,
ou seja encapsulando todas as regras de negócio do sistema.
Esses middlewares inicialmente implementados sob o paradigma de programação
estruturada foram implantados em diversos sistemas. Com o advento da programação
orientada a objetos surgiram novos middlewares que se enquadravam sob este
paradigma. Os mais conhecidos no mercado são: CORBA, DCOM e RMI.
Cada uma dessas tecnologias possui suas vantagens e desvantagens, porém, através de
algumas limitações e necessidades que serão abordadas em seguida surgiu o
middleware denominado de WebService.
CORBA
A tecnologia CORBA é uma solução aberta de objetos distribuídos desenvolvida pela
OMG (Object Managemant Group) para se tornar padrão no mercado. A OMG é um
consórcio composto por diversas indústrias no mercado com o interesse de fazer uso
de um padrão de comunicação que viabilise suas aplicações para diversas plataformas
e situações.
A primeira vantagem do CORBA é que a implementação do cliente e do servidor
pode ser feita em quaisquer linguagem. Isso só é possivel por causa de um alto nivel
de abstração conseguido através de um arquivo chamado IDL (Interface Definition
Language). Este arquivo possui o mapeamento dos métodos implementados no
servidor, em uma linguagem específica. A comunicação entre objetos, clientes e
servidores se dá através dos chamados ORBs (Object Request Brokers), estes por sua
vez se responsabilizam pela tradução das solicitções e respostas. O IDL por sua vez
possui a grande limitação de ter que suportar somente os tipos de dados comuns a
todas as aplicações, caso contrário esta precisará ser explicitada em seu código.
Segundo os fabricantes, se o desenvolvedor preferir performance em suas aplicações,
o CORBA é uma das soluções mais recomendadas. Contudo, sua alta complexidade
de implementação não o torna tão atrativo para pequenas soluções.
RMI
Remote Method Invocation, esta tecnologia habilita a comunicação entre aplicações
Java-Java, estas por sua vez se comunicam através da JVM (Java Virtual Machine),
possivelmente em plataformas diferentes. Uma aplicação Java pode chamar esses
objetos remotos somente armazenando suas referências, apontando para a máquina
que o armazena. Através de um processo conhecido como serialização, o objeto
remoto pode estar situado tanto em um servidor como em outro cliente, encapsulando
toda a comunicação entre os objetos. O RMI faz uso de um protocolo desenvolvido
especialmente para este tipo de comunicação, o chamado JRMP (Java Remote
Method Protocol).
Para o desenvolvimento de clientes remotos, o uso de uma IDL não se faz necessário,
tendo em vista que o próprio servidor é usado para difundir os objetos implementados.
Isso faz com que a implementação de aplicações se torne muito mais simples, em
relação ao CORBA. Por outro lado, você somente deve usar aplicações Java em
ambos os lados da comunicação, o que limita bastante o leque de necessidades a ser
alcançado. E mais um detalhe importante, o uso de serviços de comunicação
disponíveis em CORBA não são implementados em RMI, o que limita mais ainda as
vantagens da tecnologia.
DCOM
Distributed Component Object Model (DCOM) é uma tecnologia desenvolvida pela
Microsoft para distribuir objetos pela rede. O DCOM faz uso de uma tecnologia já
utilizada pela Microsoft conhecida como COM (Component Object Model). Um
servidor DCOM publica seus métodos para o cliente através de multiplas interfaces,
escritas em IDL similar ao C++. O compilador IDL cria os stubs e os skeletons similar
ao compilador CORBA, mas seu registro fica implantado no registro do próprio
sistema operacional.
O protocolo utilizado para a comunicação entre objetos, para esta tecnologia, é
denominado ORPC (Object Remote Procedure Call). Esse protocolo faz uso do ping
para permanecer com os objetos ativos, sabendo da atividade do cliente em tempo de
execução. E como o RMI, o DCOM suporta o coletor de objecto distribuídos,
conhecido como garbage collection.
Algumas empresas implementaram o DCOM junto com a Microsoft provendo
portabilidade, como é o caso da Apple, Unix e VMS.
Esse tipo de middleware faz uso da porta HTTP para se comunicar. Como os firewalls
convencionais e proxies não bloqueiam esta porta não existem grandes restrições para
o uso deste tipo de aplicação em redes de longas distâncias.
Comunicação em camadas
A comunicação entre aplicações de webservice fazem uso de 4 camadas que
empacotam a requisição e a resposta entre um servidor e um cliente. As camadas
utilizadas são:
» XML (Extensible Markup Language)
» SOAP (Simple object Access Protocol)
» WSDL (Web Services Definition Language)
» UDDI (Universal Discovery Description Integration)
XML
A base desta comunicação é o XML. Este por sua vez trata-se de uma linguagem
similar ao HTML, uma linguagem em formato texto baseada em delimitadores
(conhecidos como TAGs) que estabelece um denominador comum para comunicação
interaplicações. Através do XML é possivel estabelecer os objetos, métodos,
parâmetros, dados e seus respectivos tipos que serão interpretados pela aplicação
destino.
SOAP
SOAP é um protocolo que estabelece a comunicação em um ambiente heterogêneo de
funções de forma indepente. Sua função na cadeia é basicamente definir mecanismos
que expressem o modelo semântico das aplicações, e o modelo em que os dados são
decodificados.
Por ser bastante simples sua formação consiste na seguinte formatação:
» Cabeçalho
» Corpo
O cabeçalho contem todas as informações necessárias para autenticação da aplicação
e formas de encriptação, se necessário. Já o corpo contém as últimas informações
disponibilizadas pelo requisitor.
WSDL
O WSDL descrve os serviços disponibilizados à rede através de uma semântica XML,
este provê a documentação necessária para se chamar um sistema distribuido e o
procedimento necessário para que esta comunicação se estabeleça. Enquanto o SOAP
especifica a comunicação entre um cliente e um servidor, o WSDL descreve os
serviços oferecidos.
Segundo Gunzer, o WSDL descreve uma função similar ao IDL do CORBA ou a
implementação de uma interface remota em Java RMI. Em sua documentação, esta
camada possui seis elementos importantes, divididos em dois grupos: definição
abstrata e definição concreta, conforme demonstrados abaixo:
» Definição abstrata
types - tipo de dados relevantes que são enviados e recebidos dentro da
mensagem;
message - depois de definido o tipo, definimos os dados que serão
comunicados pelo sistema;
port - este trata de uma série de operações relacionadas à mensagem. Ex.
entrada, saída e tratamento de excessões.
» Definição concreta
bindings - este faz o mapeamento da implementação com a interface descrita
em XML.
services - um serviço está relacionado ao ports. Este indica se o elemento um
nome ou sub-elementos que aparece diversas vezes.
Exemplo de WSDL:
<defiitions>
<import/>
<types>
</types>
<messages>
</messages>
<portType>
</portType>
<binding>
</binding>
<service>
</service>
</definitions>
UDDI
Universal Description, Discovery, and Integration é um padrão desenvolvido para
prover informações em forma de diretório de seus negócios e seus webserviços. Este
representa um service broker que habilita as requisições a serviços para que seja
encontrado um provedor do serviço.
Segundo Gunzer, o UDDI foi desenvolvido como uma lista telefônica, que suporta a
taxonomia para as páginas amarelas, páginas brancas e páginas verdes.
Exemplo prático
Foi criada a interface IClasse e seus métodos. Para a definição de um número GUID,
bastou clicar as teclas Ctrl + Shift + G, servindo como identificação única para o
webservice. Em seguida Interface foi explicitada pela classe TClasse, conforme
código abaixo:
unit uTClasse;
interface
uses
InvokeRegistry;
type
IClasse = interface(IInvokable)
['{0B12F394-F06B-48CA-9681-79CCF7A29994}']
function Resposta: Integer; stdcall;
function Pergunta: String; stdcall;
end;
end;
implementation
{ TClasse }
initialization
InvRegistry.RegisterInterface(typeInfo(IClasse));
InvRegistry.RegisterInvokableClass(TClasse);
end.
Segundo Swart, é recomendado acrescer as linhas de registro de classes conforme
linhas abaixo, para que a classe possa ser publicada automaticamente ao chamado do
componente de publicação WSDL.
initialization
InvRegistry.RegisterInterface(typeInfo(IClasse));
InvRegistry.RegisterInvokableClass(TClasse);
<?xml version="1.0"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:xs="http://www.w3.org/2001/XMLSchema" name="IClasseservice"
targetNamespace="http://www.borland.com/soapServices/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<message name="PerguntaRequest"/>
<message name="PerguntaResponse">
<part name="return" type="xs:string"/>
</message>
<message name="RespostaRequest"/>
<message name="RespostaResponse">
<part name="return" type="xs:string"/>
</message>
<portType name="IClasse">
<operation name="Pergunta">
<input message="PerguntaRequest"/>
<output message="PerguntaResponse"/>
</operation>
<operation name="Resposta">
<input message="RespostaRequest"/>
<output message="RespostaResponse"/>
</operation>
</portType>
<binding name="IClassebinding" type="IClasse">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="Pergunta">
<soap:operation soapAction="urn:uTClasse-IClasse#Pergunta"/>
<input>
<soap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:uTClasse-IClasse"/>
</input>
<output>
<soap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:uTClasse-IClasse"/>
</output>
</operation>
<operation name="Resposta">
<soap:operation soapAction="urn:uTClasse-IClasse#Resposta"/>
<input>
<soap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:uTClasse-IClasse"/>
</input>
<output>
<soap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:uTClasse-IClasse"/>
</output>
</operation>
</binding>
<service name="IClasseservice"/>
</definitions>
Contudo, para que o Delphi reconheça a existência de uma classe remota é necessário
fazer uso de uma ferramenta de importação de webservice, acionado pelo File | New |
Web Service Importer:
interface
IClasse = interface(IInvokable)
['{D0038055-68C2-4C33-B82F-ED4E0FEE1A90}']
function Pergunta: WideString; stdcall;
function Resposta: WideString; stdcall;
end;
implementation
uses InvokeRegistry;
initialization
InvRegistry.RegisterInterface(TypeInfo(IClasse), 'urn:uTClasse-
IClasse', '');
end.
Basta utilizar esta Unit no formulário que está sendo implementado e instanciar o
objeto remoto conforme o código abaixo:
unit uForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
Dialogs, Rio, SoapHTTPClient, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
HTTPRIO1: THTTPRIO;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses uTClasseImportada;
{$R *.dfm}
end;
end.
Conclusão
Por se tratar de uma tecnologia relativamente nova, algumas ferramentas RAD ainda
não suportam esse middleware. Em versões mais novas do Java, Delphi e C# já
possuem funcionalidades dentro de seus respectivos enfoques. Porém, com a corrida a
novos horizontes, fabricantes da indústria do software estão se mobilizando para
voltar suas ferramentas de desenvolvimento para os recursos que a web tem a
disponibilizar. A Microsoft estabeleceu uma tecnologia correlata, dentro da visão
deste próprio fabricante conhecida como .NET (Dot NET). A proposta é
disponibilizar ferramentas que auxiliem no desenvolvimento de Web Services e sua
interação com as "diversas" plataformas Windows (Desktop, palm, servidores, etc.).
Para esta tecnologia em ascensão existem:
• Facilidade de implementação em ferramentas RAD, ex. Delphi;
• Facilidade de publicação, pois é necessário ter somente um servidor Web que
suporte a execução de CGIs;
• Facilidade de manutenção, pois à partir de uma interface pré-estabelecida pode
se modificar o funcionamento do componente, mudando inclusive suas regras
de negócio;
• Facilidade de uso através de firewalls e proxies;
• Aumento na escalabilidade das aplicações;
• Independência de linguagem para implementação, como o CORBA. Podendo
ter servidor em C e clientes em Java, Visual Basic, Object Pascal, etc.
Desvantagens:
• Ausência de encriptação na comunicação entre cliente e servidor. Para se ter
encriptação é preciso fazer uso do SSL, disponível em servidores Web;
• Aumento no overhead para abrir as mensagens e empacotá-las;
• Baixa performance, inclusive em intranets.
• Fragilidade de interface, após ter sido usada a interface em um cliente, sua
semântica não pode ser alterada, pois isso implica em mudanças no cliente.
Bibliografia
GUNZER, Hartwig. White Paper: Introduction to Web Services. Borland - Março
2002.
SWART, Bob. Delphi 6 Web Services: SOAP. The Delphi Magazine Issue 72 -
Agosto 2001.
Endereço eletrônico: http://www.thedelphimagazine.com/Samples/1273/1273.htm
WebServices.org
Endereço eletrônico: http://www.webservices.org