Introdução à Arquitetura CORBA - Campus Rio Pomba
Introdução à Arquitetura CORBA - Campus Rio Pomba
Introdução à Arquitetura CORBA - Campus Rio Pomba
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Introdução</strong> <strong>à</strong><br />
<strong>Arquitetura</strong> <strong>CORBA</strong>
Roteiro<br />
<strong>Introdução</strong> <strong>à</strong> <strong>Arquitetura</strong> <strong>CORBA</strong><br />
<strong>Introdução</strong><br />
Visão Geral<br />
Criando uma Aplicação <strong>CORBA</strong>
<strong>Introdução</strong><br />
Vamos nos mover momentaneamente do estudo dos<br />
princípios para a construção de SDs para o estudo<br />
de um paradigma de organização de SDs<br />
Objetos Distribuídos<br />
Paradigma importante<br />
Fácil esconder aspectos de distribuição por trás da<br />
interface do objeto<br />
Paradigma poderoso<br />
Objetos podem ser virtualmente qualquer coisa<br />
Dois ambientes importantes<br />
<strong>CORBA</strong><br />
DCOM
<strong>Introdução</strong><br />
<strong>CORBA</strong> (Common Object Request Broker<br />
Architecture)<br />
<strong>Arquitetura</strong> padrão criada pelo Object Management<br />
Group (OMG) para estabelecer e simplificar a troca de<br />
dados entre componentes de um sistema distribuído<br />
heterogêneo<br />
OMG criada em 1989<br />
Foco: interoperabilidade e portabilidade de aplicações<br />
distribuídas orientadas a objetos<br />
Mais de 800 filiados: IBM, Microsoft, HewlettPackard,<br />
SunSoft...<br />
Primeiro padrão lançado em 1990<br />
Atualmente na versão 3.0
<strong>Introdução</strong><br />
OMG define especificações<br />
Criadas com idéias e tecnologia dos filiados<br />
Empresas desenvolvem produtos baseados<br />
nas especificações<br />
O modelo de objeto especificado através<br />
da OMA (Object Management Architecture)<br />
OMA define facilidades necessárias para a<br />
criação de um ambiente distribuído<br />
orientado a objeto
Visão Geral<br />
Objetos da<br />
Aplicação<br />
Facilidades<br />
Verticais<br />
(Específicas do<br />
Domínio)<br />
Facilidades<br />
Horizontais<br />
(Propósito<br />
Geral)<br />
Object Request Broker<br />
Serviços<br />
Comuns aos<br />
Objetos
Visão Geral<br />
Object Request Broker<br />
Principal componente da OMA<br />
Permite transparência para a localização,<br />
ativação e comunicação entre objetos<br />
Módulo intermediário entre cliente e objeto<br />
Responsável por:<br />
Aceitar a requisição do cliente<br />
Enviá-la para o objeto responsável por atendê-la e<br />
Entregar resposta ao cliente
Visão Geral<br />
Object Request Broker<br />
Processo de tradução e transferência de<br />
parâmetros e resultados transparente aos clientes<br />
Mesmo que módulos usem linguagens de programação<br />
diferentes, rodem em máquinas com arquiteturas e SOs<br />
diferentes<br />
Clientes não precisam saber em que parte da rede<br />
os objetos estão localizados, como são<br />
implementados, como executam, etc.<br />
<strong>Arquitetura</strong> de interface definida de modo a<br />
separar conceitos de interface e implementação.
Visão Geral<br />
Objetos construídos como parte de aplicações<br />
específicas<br />
Facilidades <strong>CORBA</strong><br />
Construídas como composição de serviços<br />
<strong>CORBA</strong><br />
Horizontais: serviços de alto nível de propósito<br />
geral, que são independentes do domínio da<br />
aplicação<br />
Gerenciamento de informação, do sistema e de<br />
tarefas<br />
Verticais: serviços de alto nível desenvolvidos<br />
especificamente para um domínio de aplicação<br />
Comércio eletrônico, bancário, manufaturas...
Modelo de Objetos<br />
<strong>CORBA</strong> usa modelo de objetos remotos<br />
Implementação do objeto reside no espaço de<br />
endereçamento do servidor<br />
Especificação não afirma que objetos devem<br />
ser implementados apenas como objetos<br />
remotos<br />
Entretanto, virtualmente todos os sistemas <strong>CORBA</strong><br />
suportam apenas este modelo<br />
Objetos e serviços <strong>CORBA</strong> especificados<br />
com IDL (Interface Definition Language)<br />
Linguagem de Definição de Interface
Modelo de Objetos<br />
IDL<br />
Similar a outras linguagens de definição de<br />
interface<br />
Provê sintaxe precisa para a definição de métodos<br />
e parâmetros<br />
NÃO descreve semântica<br />
Sintaxe semelhante ao C++ (e portanto Java)<br />
IDL providencia tipos de dados básicos (short,<br />
long, float, double e Boolean), estruturas (como<br />
struct e union) e templates (como sequence)<br />
Interface de um objeto definida independentemente<br />
da linguagem de programação
Modelo de Objetos<br />
Linguagem de Definição de Interface (IDL)<br />
Compilador IDL traduz construções da<br />
linguagem IDL para a linguagem alvo<br />
C, C++, Ada, Java, Smalltalk, COBOL<br />
Basicamente dois arquivos gerados: o stub do<br />
cliente e do servidor<br />
Contém as classes necessárias para a<br />
execução de chamadas estáticas
Modelo de Objetos
Modelo de Objeto<br />
ORB<br />
Suporte ao cliente e ao servidor<br />
Sistema de tempo de execução<br />
Lida com comunicação entre cliente e servidor<br />
Encontra serviços disponíveis<br />
Oferece suporte para encontrar referências iniciais<br />
para objetos implementando serviços <strong>CORBA</strong><br />
Proxy<br />
Oferece mesma interface que servidor<br />
Recebe requisição do cliente e a repassa ao<br />
servidor<br />
Resposta do servidor repassada ao cliente
Modelo de Objeto<br />
Nem sempre definições de interfaces<br />
disponíveis aos clientes estaticamente<br />
Serviço necessário para buscar interface em<br />
tempo de execução<br />
Com interface, requisição pode ser montada<br />
dinamicamente<br />
Dynamic Invocation Interface (DII) ou interface<br />
de invocação dinâmica
Modelo de Objetos<br />
Interface de Invocação Dinâmica (DII)<br />
Interpreta, em tempo de execução, parâmetros<br />
necessários <strong>à</strong>s chamadas<br />
Várias subchamadas são feitas:<br />
Obtenção da interface do objeto;<br />
Obtenção de informações sobre operações suportadas pelo<br />
objeto;<br />
Criação do objeto solicitado pelo cliente;<br />
Obtenção de cada argumento necessário para a chamada do<br />
método;<br />
Solicitação para a execução de um método do objeto.<br />
Mais eficiente fazer chamadas através de stubs IDL<br />
estáticos
Modelo de Objetos<br />
Adaptador de objetos (OA)<br />
Encaminha requisição para objeto correto<br />
Parâmetros são retirados (unmarsharling)<br />
por stub, chamado skeleton em <strong>CORBA</strong><br />
Também possível que este papel seja<br />
desempenhado pela implementação do objeto<br />
Assim como no caso do cliente, stubs do<br />
servidor podem ser estáticos (IDL) ou<br />
dinâmicos<br />
Dynamic Skeleton Interface
Modelo de Objetos<br />
Juntando os componentes<br />
Cada objeto possui uma interface IDL padrão<br />
Aplicação cliente pode invocar uma operação:<br />
Estaticamente, através de stubs IDL<br />
Dinamicamente, usando o stub de chamada<br />
dinâmica e o repositório de interfaces<br />
Pedido passa para o ORB<br />
Utiliza referência do objeto para localizar<br />
implementação<br />
Entrega pedido ao adaptador de objetos<br />
responsável por aquele objeto.
Modelo de Objetos<br />
Juntando os componentes<br />
Adaptador de objetos transfere a requisição<br />
para o “esqueleto” gerado pelo compilador IDL<br />
do lado do servidor<br />
Finalmente passado a implementação do objeto<br />
Qualquer valor de retorno é passado de volta<br />
ao “esqueleto” e ao adaptador de objetos e em<br />
seguida para o núcleo ORB<br />
Dependendo da origem da chamada, núcleo<br />
ORB retorna os valores para o cliente, via stub<br />
IDL ou stub de chamada dinâmica
Criando uma aplicação <strong>CORBA</strong><br />
Passos:<br />
1. Definir interface utilizando IDL<br />
2. Compilar interface usando um compilador IDL<br />
3. Implementar a aplicação servidora<br />
Implementação do método<br />
Iniciação do processo na máquina<br />
Registro no ORB em tempo de execução<br />
4. Criar a aplicação cliente
Criando uma aplicação <strong>CORBA</strong><br />
(1 e 2)<br />
module Counter {<br />
interface Count {<br />
attribute long sum;<br />
long increment();<br />
};<br />
}<br />
Compilação: idlj -fall Counter.idl
Criando uma aplicação <strong>CORBA</strong><br />
(3)<br />
import Counter.*;<br />
import org.omg.CosNaming.*;<br />
import org.omg.CosNaming.NamingContextPackage.*;<br />
import org.omg.<strong>CORBA</strong>.*;<br />
import org.omg.PortableServer.*;<br />
import org.omg.PortableServer.POA;<br />
import java.util.Properties;<br />
class CountImpl extends CountPOA {<br />
private ORB orb;<br />
private int sum;
Criando uma aplicação <strong>CORBA</strong><br />
(3)<br />
}<br />
public void setORB(ORB orb_val) { orb = orb_val; }<br />
// implementacao da consulta do valor da variavel sum<br />
public int sum() throws SystemException { return sum; }<br />
// implementacao da atribuicao da variavel sum<br />
public void sum(int val) throws SystemException { sum = val; }<br />
// implementacao do metodo incremento<br />
public int increment() throws SystemException {<br />
}<br />
sum++;<br />
return sum;
Criando uma aplicação <strong>CORBA</strong><br />
(3)<br />
import Counter.*;<br />
import org.omg.CosNaming.*;<br />
import org.omg.CosNaming.NamingContextPackage.*;<br />
import org.omg.<strong>CORBA</strong>.*;<br />
import org.omg.PortableServer.*;<br />
import org.omg.PortableServer.POA;<br />
public class CountServer {<br />
public static void main(String args[]) {<br />
try{<br />
// cria e inicia o ORB<br />
ORB orb = ORB.init(args, null);<br />
// consegue referencia para rootpoa e ativa o gerente POA<br />
POA rootpoa =<br />
POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
Criando uma aplicação <strong>CORBA</strong><br />
(3)<br />
rootpoa.the_POAManager().activate();<br />
// cria objeto servidor e o registra no ORB<br />
CountImpl countImpl = new CountImpl();<br />
countImpl.setORB(orb);<br />
// consegue referencia para servidor<br />
org.omg.<strong>CORBA</strong>.Object ref = rootpoa.servant_to_reference(countImpl);<br />
Count href = CountHelper.narrow(ref);<br />
// consegue referencia para o contexto de nomes raiz<br />
org.omg.<strong>CORBA</strong>.Object objRef =<br />
orb.resolve_initial_references("NameService");<br />
// Usa NamingContextExt, que eh parte do servico de nomes<br />
// interoperaceis<br />
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
Criando uma aplicação <strong>CORBA</strong><br />
(3)<br />
// liga a referencia para objeto ao nome<br />
String name = "Count";<br />
NameComponent path[] = ncRef.to_name( name );<br />
ncRef.rebind(path, href);<br />
System.out.println("CountServer pronto e aguardando requisicoes ...");<br />
// aguarda invocacoes<br />
orb.run();<br />
}<br />
catch (Exception e) {<br />
System.err.println("ERROR: " + e);<br />
e.printStackTrace(System.out);<br />
}<br />
System.out.println("CountServer saindo ...");<br />
}<br />
}
Criando uma aplicação <strong>CORBA</strong><br />
(4)<br />
import Counter.*;<br />
import org.omg.CosNaming.*;<br />
import org.omg.CosNaming.NamingContextPackage.*;<br />
import org.omg.<strong>CORBA</strong>.*;<br />
public class CountClient{<br />
static Count counter;<br />
public static void main(String args[]) {<br />
try{<br />
// cria e inicia o ORB<br />
ORB orb = ORB.init(args, null);<br />
// pega o contexto de nomes raiz<br />
org.omg.<strong>CORBA</strong>.Object objRef =<br />
orb.resolve_initial_references("NameService");
Criando uma aplicação <strong>CORBA</strong><br />
(4)<br />
// Usa classe NamingContextExt ao inves de NamingContext.<br />
// Esta eh parte do servico de nomes interoperavel<br />
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);<br />
// resolve a referencia para o objeto (veja topico Nomes)<br />
String name = "Count";<br />
counter = CountHelper.narrow(ncRef.resolve_str(name));<br />
System.out.println("Referencia para objeto obtida: " + counter);<br />
System.out.println("Atribuindo 0 a sum");<br />
counter.sum((int)0);
Criando uma aplicação <strong>CORBA</strong><br />
(4)<br />
// Incrementando 1000 vezes<br />
System.out.println("Aguarde... Incrementando 1000 vezes!");<br />
for (int i = 0 ; i < 1000 ; i++ ){ counter.increment(); }<br />
System.out.println("Valor de Sum => " + counter.sum());<br />
} catch(Exception e) {<br />
System.err.println("System Exception");<br />
System.err.println(e);<br />
}<br />
}<br />
}
Criando uma aplicação <strong>CORBA</strong><br />
Compilar os códigos fontes<br />
javac *.java Counter/*.java<br />
Iniciar o serviço ORD:<br />
orbd -ORBInitialPort 2050 -ORBInitialHost localhost<br />
Iniciar servidor:<br />
java CountServer -ORBInitialPort 2050<br />
-ORBInitialHost localhost<br />
Iniciar o cliente:<br />
java CountClient -ORBInitialPort 2050<br />
-ORBInitialHost localhost<br />
Se todos forem executados na mesma máquina, não<br />
precisa suar opção -ORBInitialHost nomedoservidor
Próxima Aula<br />
<strong>CORBA</strong> (cont.)<br />
Repositório de Interface e Implementações<br />
Facilidades <strong>CORBA</strong><br />
Comunicação<br />
Nomes<br />
Sincronização<br />
Tolerância a Falhas<br />
Segurança