Objetos Distribuídos Programação Distribuída Orientado a Objetos Luiz Affonso Guedes Introdução • Conceitos básicos – programação distribuída + programação orientada a objetos = Objetos distribuídos – Motivação • Associar as vantagens advindas da programação orientada a objetos no desenvolvimento de aplicações distribuídas – PD- Programação Distribuída – POO - Programação Orientada a Objetos – POOD- Programação Orientada a Objetos Distribuída Breve Histórico de Programação Distribuída • Programação distribuída – Programação de sistemas que executam sobre redes de computadores. • • • • • • • Conceito de redes de computadores Conceito de processos Modelo cliente-servidor Conceito de troca de mensagens Chamada de procedimento remoto Invocação de métodos de objetos remotos Sistemas baseados em agentes Conceito de Redes de Computadores • Modelo em camadas Aplicação Camada de Aplicação Camada de Aplicação Camada de Transporte Camada de Rede Camada de Enlace Camada Física Camada de Transporte Camada de Rede Camada de Enlace Camada Física Comunicação Conceito de Middleware • Necessidade de agrupar funcionalidades comuns às várias aplicações distribuídas – Conceito de abstração da programação distribuída • Tentar tornar a programação distribuída, em termos de facilidade de programação, o mais próximo possível da programação centralizada. Software S.O. + Hardware Middleware Camada de Transporte Camada de Rede Camada de Enlace Camada Física O middleware deve ser independente do SO e do hardware Evolução do Conceito de Middleware Agentes Objetos Chamada de Distribuídos (RMI, CORBA) Procedimento Remoto (RPC) Troca de Mensagens (Sockets) 1977 1982 1987 1992 1997 2002 2007 Paradigma de Troca de Mensagem Tarefa 1 send(M1) receive(M1) Tarefa 2 send(M1) receive(M1) Tarefa 1 receive(M2) Tarefa 2 send(M2) bloqueio processando send(M2) receive(M2) Troca de Mensagem - Implementação • Via Socket - síncrono ou assíncrono Interface de programação API Socket TCP ou UDP IP Sistema Operacional LAN ou WAN port buffer API Socket TCP ou UDP IP Troca de Mensagens Características de Programação • Baixo nível de abstração na programação • Necessidade de se conhecer aspectos de redes de computadores e sistemas operacionais – ports e número IP • Leva a programas poucos estruturados Chamada de Procedimento Remoto - RPC • Remote Procedure Call (RPC) – baseada no conceito de chamada de procedimento das linguagens estruturadas • A idéia é fazer a invocação de um procedimento remoto o mais similar possível como se faz a chamada de um procedimento local. RPC - Modelo de Programação Cliente Servidor call P2(a1,a2) Call P2(a1,a2) Servidor P1 Cliente retorno receive(M1) bloqueio processando P2 P2 P3 retorno do resultado de P2 RPC - Implementação Cliente Servidor P1 ... x = call P2(a1,a2); .... P3 P2 P2(a1,a2) despachante empacota parâmetros desempacota parâmetros empacota parâmetros desempacota parâmetros a2 a1 P2 API (socket) resultado API (socket) Objetos Distribuídos • Surgiu da necessidade de se atender aos requisitos de software mais exigentes, oriundos de sistemas mais complexos. – Reusabilidade – Modularidade – Flexibilidade • Objetos Distribuídos = Programação Orientada a Objetos + Programação Distribuída Constituição dos Objetos método 1 Estados: Atributos método n método 2 interface Constituição de Objetos • Toda interação com um objeto se dá através da invocação de seus métodos declarados com públicos • Métodos declarados como privados só podem ser invocados pelos demais métodos do objeto • Os atributos são variáveis manipuladas pelos métodos do objeto Conceitos Básicos de Objetos • Classificação – Objetos são organizados em classes. Uma classe define o comportamento dos objetos dela derivados. – Relacionamento entre classes • herança: relação tipo é-um ou é-uma • composição: relação tipo é-parte-de • colaboração: relações tipo usa, delega e autoriza Conceitos Inerentes dos Objetos • Instanciação – objetos são criado a partir do modelo de sua classe • Encapsulamento – detalhes de implementação não são visíveis fora do objetos • Identidade – objetos possuem identidade única • Polimorfismo – métodos com o mesmo nome podem apresentar comportamento diferente OD - Modelo de programação Servidor Cliente requisição resposta ORB- Object Request Broker ORBs • Object Request Broker – Middleware para suporte de serviço de distribuição. – RMI – Remote Method Invocation (Java) – Corba – Common ORB Architecture (OMG) Estrutura de um Orb Cliente Servidor Stub Skeleton Camada de Camada de Referência Remota Referência Remota Camada de Transporte Camada de Transporte IP IP LAN ou WAN Estrutura de um Orb Servidor Service Registry port Cliente Stub Stub Skeleton ORB Skeleton Procedimento de Programação 1. Escrever Interface 2. Implementar a Interface 3. Implementar Servidor que contém a implementação da interface 4. Gerar Stub e Skeleton da Interface 5. Registrar Servidor e Disparar Servidor 6. Escrever Cliente que utiliza métodos da Interface RMI e Corba • RMI – a Interface é escrita em Java – Só opera com objeto remotos Java • Corba – a Interface é escrita em IDL (Interface Descrition Language – like C++) – Multi-linguagem – Há várias implementações do padrão Exemplo em RMI • Passo 1 – Especificação da Interface // Interface remota para implementação de método da séria de Fibinacci import java.rmi.*; import java.math.BigInteger; public interface Fibonacci extends Remote { public BigInteger getFibonacci (int n) throws RemoteException; public BigInteger getFibonacci (BigInteger n) throws RemoteException; } Exemplo em RMI • Passo 2 – Implementar a Interface // Implementação da interface Fibonacci.java import java.rmi.*; import java.rmi.server.UnicastRemoteObject; import java.math.BigInteger; public class FibonacciImpl implements Fibonacci { public FibonacciImpl( ) throws RemoteException { UnicastRemoteObject.exportObject(this); } public BigInteger getFibonacci (int n) throws RemoteException { ... return (retorno); } public BigInteger getFibonacci (BigInteger n) throws RemoteException { ... return (retorno); } } Exemplo em RMI • Passo 3 – Implementar o Servidor // Servidor que conterá o objeto da classe FibonacciImpl.java import java.net.*; import java.rmi.*; public class FibonacciServer { public static void main(String[] args) { try { FibonacciImpl f = new FibonacciImpl(); // instanciação do objeto remoto Naming.rebind("fibonacci", f); // registro do servidor System.out.println("Servidor Fibonacci pronto."); } catch (RemoteException re) { System.out.println(" Exception in FibonacciImpl.main: " + re); } catch (MalformedURLException e) { System.out.println(" URL mal formada" + e); } } } Exemplo em RMI • Passo 4 – Gerar Stub e Skeleton da Interface ¾ ¾ • rmic FibonacciImpl Criação automática de FibonacciImpl_Skel.java e FibonacciImpl_Stub.java Passo 5 – Registrar e Disparar Servidor ¾ ¾ ¾ rmiregistry (linux) start rmiregistry (windows) java FiboncciServer // porta default = 1099 Exemplo em RMI • Passo 6 – Implementar Cliente / Programa cliente da interface remota Fibonacci.java import java.rmi.*; import java.net.*; import java.math.BigInteger; public class FibonacciClient2 { public static void main(String args[]) { try { Object o = Naming.lookup("rmi://localhost/fibonacci"); // ligação com o servidor remoto Fibonacci calculator = (Fibonacci) o; // conversão de tipo BigInteger index = new BigInteger("3"); // número da série BigInteger f = calculator.getFibonacci(index); // chamada de método em interface remota System.out.println(" O " + index + "-ésimo termo da série de Fibonacci é " + f); } catch(MalformedURLException e) { ... } catch(RemoteException re) { ... } catch(NotBoundException e) { ... } } }