corba - Aquiles Burlamaqui

Propaganda
Aquiles Burlamaqui
Luiz Eduardo
 Agenda
• Motivação
• Objetivo
• História
• Visão Geral
• Arquitetura
• Passo a Passo
 Motivação:
• Socket
 Desenvolvimento lento
• RPC
 Procedural
 Dependente de linguagem
• RMI
 O.O
 Dependente de Linguagem
• Suporte a diversas linguagens, possibilitando a
comunicação entre módulos escritos em
linguagens distintas
 Objetivo
• Tornar fácil a implementação de aplicações
distribuídas
• Para sistemas Orientado a Objetos e procedurais
• Independentes de:
 plataforma
 sistema operacional
 linguagem de programação
 protocolo de comunicação
• Permitindo chamadas de procedimento remoto
como se fossem locais
 História
• 1991 - CORBA 1.0 – ORB
• 1996 – CORBA 2.0 – Comunicação entre ORBs
• 2002 – CORBA 3.0
 Interoperação outros sistemas distribuídos
 suporte de interação assíncrona entre objetos,
mobilidade de objetos
 interação com grupos de objetos
 interação em tempo real, etc.
 História
• OMG
 A arquitetura CORBA é desenvolvida pela OMG
(Object Management Group). www.omg.org
 A OMG foi fundada em 1989 por oito membros
fundadores (3Com, American Airlines, Canon, Data
General, HP, Philips, Sun e Unisys).
 No ano 2000 tinha mais de 800 membros,
incluindo IBM e Microsoft (apenas como
observadora).
 CORBA
- Common Object Request Broker
Architecture,
 Especificação que permite aos objetos de
sistemas distribuídos comunicarem-se entre si
de forma transparente
 Componentes principais da OMA
• Object Management Architecture
 Objetos da aplicação
 Facilidades CORBA
 Serviços de Objeto
 ORB
 Conceito
de ORB (Object Request Broker)
• componente que auxilia o cliente a invocar um
método em um objeto de forma transparente
(transparência de acesso)
 localização do objeto
 ativação do objeto se necessário
 comunicar ao objeto sobre a requisição do cliente
 Chamada
através de um ORB



Objetivo: possibilitar que clientes invoquem
métodos a objetos remotos (objetos CORBA), e que
ambos possam ser implementados em linguagens
distintas
A linguagem de implementação do cliente não
precisa ser necessariamente orientada a objetos
Funcionalidades
• invocações estáticas
 interface remota do objeto CORBA é conhecida em tempo
de compilação (utilização dos stubs e skeletons)
• invocações dinâmicas
 interface remota do objeto CORBA não é conhecida em
tempo de compilação
 Estrutura
de um ORB

Semântica de invocação
• semântica at-most-once (default)
• semântica OneWay
 métodos sem resultados ou callbacks, o cliente não bloqueia na
espera de uma resposta
• Semântica at-most-once
 O cliente continua imediatamente e pode mais tarde bloquear-se
à espera da resposta

Objeto CORBA: objeto remoto
• implementa uma interface IDL
• possui uma referência de objeto remoto
• capaz de responder a invocações aos métodos de sua interface
client
client proxy
program for A
implementation
repository
ORB
core
or dynamic invocation
Request
Reply
server
interface
repository
object skeleton
adapter
ORB
core
or dynamic skeleton
Servant
A
 Adaptador
de objeto (Object Adapter)
• interliga os objetos CORBA e as classes do
•
•
•
•
servidor
cria as referências a objetos remotos para os
objetos CORBA
despacha cada RMI através de um skeleton para o
servidor apropriado
ativa objetos (se necessário)
CORBA 2.2: POA (Portable Object Adapter)
 permite que aplicações e servidores sejam executados
em ORBs produzidos por desenvolvedores diferentes

Skeleton (servidor)
• geradas na linguagem do servidor por um compilador IDL
• RMIs são despachadas através do skeleton apropriado a um
servidor
• marshaling e unmarshaling

Stubs/proxies (cliente)
• geradas na linguagem do cliente por um compilador IDL
• proxy (linguagens orientadas a objeto)
• stub (linguagens procedurais)
• marshaling e unmarshaling

Repositório de implementação
• ativa por demanda os servidores registrados, e localiza os
•
•
•
•
servidores em execução
armazena tabela com o mapeamento dos nomes dos
adaptadores de objetos para suas implementações
na ativação de objeto remoto, o hostname e o número da
porta no servidor são adicionados na tabela
possibilita armazenar outras informações sobre os
servidores (e.g. controle de acesso)
permite replicação
 aumento de disponibilidade e tolerância a falhas
 Repositório
de interface
• provê informações sobre interfaces IDL
registradas (e.g. métodos, argumentos,
exceções)
• cliente sem proxy de objeto pode obter
informações necessárias (métodos e
argumentos)
• necessário para invocações dinâmicas
• nem todos os ORBs provêm um repositório de
interfaces
 Interface
de invocação dinâmica
• permite que clientes façam invocações
dinâmicas a objetos CORBA desconhecidos
• cliente obtém informações necessárias sobre
um objeto CORBA a partir do repositório de
interfaces, e utiliza esta informação para
construir uma invocação e enviá-la ao
servidor
 Passo
para uma Inovação Dinâmica
1. Identificar o objeto que queremos invocar
(provavelmente através do Trader Service do
CORBAservices);
2. Recuperar sua interface (buscá-la no
Repositório de Interfaces);
3. Construir a invocação;
4. Invocar a requisição, e receber os resultados.
 Interface
skeleton dinâmica
• permite um objeto CORBA aceitar invocações
em uma interface sem skeleton
 interface não era conhecida em tempo de
compilação
• skeleton dinâmico
 recebe a invocação
 inspeciona o conteúdo da requisição para
descobrir o objeto destino, o método para ser
invocado e os argumentos
 invoca o destino



Facilidades para definir módulos, interfaces, tipos,
atributos e métodos
sintaxe similar a C++ incluindo mais algumas palavraschaves
Módulos IDL
• permite agrupar interfaces e outros tipos IDL em
unidades lógicas
• módulo define um nome de escopo (evita conflito entre
nomes)

Interfaces IDL
• descrevem os métodos e atributos que são disponíveis
por objetos CORBA que implementam a interface
module HelloApp
{
interface Hello
{
string sayHello();
oneway void shutdown();
};
};
class HelloImpl extends HelloPOA {
private ORB orb;
public void setORB(ORB orb_val) {
orb = orb_val;
}
// implementação do método sayHello()
public String sayHello() {
return "\nHello world !!\n";
}
// implementação do método shutdown()
public void shutdown() {
orb.shutdown(false);
}
}
public class HelloServer {
public static void main(String args[]) {
try{
// Criação e inicialização do ORB
ORB orb = ORB.init(args, null);
// obtém a referência do rootpoa e ativa o POAManager
POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
rootpoa.the_POAManager().activate();
// cria o servant e registra com o ORB
HelloImpl helloImpl = new HelloImpl();
helloImpl.setORB(orb);
// obtém referência do objeto servant
org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl);
Hello href = HelloHelper.narrow(ref);
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
// Especifica o servidor de nomes(INS)
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
// Especifica uma referência de objeto
String name = "Hello";
NameComponent path[] = ncRef.to_name( name );
ncRef.rebind(path, href);
System.out.println("HelloServer ready and waiting ...");
// Aguarda a invocação de clientes
orb.run();
}
catch (Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out);
}System.out.println("HelloServer Exiting ...");}}
public class HelloClient {
static Hello helloImpl;
public static void main(String args[])
{
try{
// Cria e inicializa o ORB
ORB orb = ORB.init(args, null);
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
String name = "Hello";
helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));
System.out.println("Obtained a handle on server object: " + helloImpl);
System.out.println(helloImpl.sayHello());
helloImpl.shutdown();
} catch (Exception e) {
System.out.println("ERROR : " + e) ;
e.printStackTrace(System.out);
}
}
}
}
idlj -fall -Hello.idl
●Javac *.java
● orbd -ORBInitialPort 1050 -ORBInitialHost localhost &
● java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost&
● java HelloClient -ORBInitialPort 1050 -ORBInitialHost localhost
●
 Transparência
de localização
• Tratamento igual para Função local
 Deficiências
de projeto e processo
 Problemas com implementações
 Firewalls
 1)
Construir um exemplos simples onde
programas se comuniquem usando
CORBA
• Nível 1: Mesma linguagem
• Nível 2: Entre Java e C++
 http://openorb.sourceforge.net/
• Nível 3: Entre Java/C++ e Lua
 (OiL - http://oil.luaforge.net/index.html).
• Com base na experiência adquirida fazer um
relato do uso de CORBA com as linguagens
utilizadas.
• Entrega dos códigos fontes




Uma linguagem de script leve
• Pequena, portátil, eficiente
Uma linguagem tipada dinamicamente
• O tipo da variável depende do valor armazenado
• Toda linguagem pode ter erro de “tipos” em tempo
de execução
Uma linguagem com gerência automática de memória
Pré-compilação em bytecodes
• Pode-se carregar arquivos compilados
 Sintaxe
convencional
 print(“hello world”)
 print“hello world”
 Comentários
de 1 linha -- (dois traços)
 Comentários de blocos --[[ bloco ]]
 Varáveis
globais não precisam de
declaração
 Variáveis locais são declaradas com a
palavra chave local

8 tipos básicos
• nil – tipo do valor nil que é diferente de qualquer outro, é o
•
•
•
•
•
•
•

valor default das variáveis
boolean – true, false
number – double
string – array de caracteres, imutável
function – valor de primeira classe, significa que funções
podem ser armazenadas em variáveis, passadas como
argumentos, retornadas
userdata – dados C arbitrários, manipulado através da API C
thread – threads independentes de execução
table – arrays associativos
Consulta do tipo da variável através da função type

Aritméticos
 +, -, *, /, ^

Relacionais
 <, >, <=, >=, ==, ~=

Operadores lógicos
 and, or, not
 Avaliação por curto-circuito

Concatenação
 ..
a
=0
 a, b, c = 0, 0, 0
 a, b = b, a -- troca de valores
 a, b, c = 0, 0 -- c recebe nil
 Resultado
da expressão {}
 Qualquer valor como chave, exceto nil
 Único mecanismo de estruturação de
dados
 Indexação na forma variável[índice] ou
variável.índice, quando o índice é uma
string

for var = inicio, fim [, passo] do bloco end
 Numérico

for var {, var} in expressão do bloco end
 Genérico




while expressão do bloco end
repeat block until expressão
break ou return pode ser usado para
terminar o laço
if expressão then bloco {elseif expressão
then bloco} [else bloco] end
 Retorno
• foo()
 Nenhum valor de retorno
• x = foo()
 Ajustado para 1 valor
• x, y = foo()
 Ajustado para 2 valores
• {foo()}
 Cria uma tabela com todos os valores retornados
 Basic
 String
 Table
 Math
 IO
 OS
 Oferecem
funções básicas
• print
• type
• setmetatable
• pairs
• error
 Funções
para manipulação de strings
 Funções
para manipulação de tabelas
• table.insert
• table.remove
• table.sort
 Funções
matemáticas
• math.sqrt
• math.sin
• math.log
 Funções
• io.open
• io.close
• io.read
• io.write
de entrada e saída
 Funções
associadas ao sistema
operacional
• os.clock
• os.date
• os.execute
 Manual
 Wiki
Lua-Users
 Lista de Discussão
 IRC
 http://www.corba.hpg.com.br/home2.ht
ml
 http://www.das.ufsc.br/~montez/corba/c
orba.html
 http://java.sun.com/j2se/1.4.2/docs/gui
de/idl/orbd.html
Download