30.05.2013 Views

Introdução à Arquitetura CORBA - Campus Rio Pomba

Introdução à Arquitetura CORBA - Campus Rio Pomba

Introdução à Arquitetura CORBA - Campus Rio Pomba

SHOW MORE
SHOW LESS

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, Hewlett­Packard,<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 sub­chamadas 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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!