34
1 PROGRAMAÇÃO DISTRIBUÍDA PROGRAMAÇÃO DISTRIBUÍDA EM JAVA EM JAVA Verão/2001 Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: [email protected]

1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: [email protected]

Embed Size (px)

Citation preview

Page 1: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

1

PROGRAMAÇÃO PROGRAMAÇÃO DISTRIBUÍDA EM JAVADISTRIBUÍDA EM JAVA

Verão/2001Verão/2001

Aula 06Objetos distribuídos I: RMI

05.02.2001Luciano Silva

e-mail: [email protected]

Page 2: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

2

Tópicos da Aula 06Tópicos da Aula 06

Problema da chamada remota de métodos Tecnologia RMI Interfaces para métodos remotos Stubs e esqueletos Registros de métodos remotos

Page 3: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

3

Chamada remota de métodos

class ...{ String hello(){ ... }}

PROCESSO Chamada remota

Cliente Servidor remoto

Page 4: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

4

Arquiteturas para chamada remota

Existem algumas arquiteturas destinadas para chamada remota de métodos:

RPC ( Remote Procedure Call) CORBA ( Common Object Request Broker

Architeture) JAVA RMI ( Remote Method Invocation )

Page 5: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

5

RPC (I)

Serviço muito utilizado em sistemas operacionais distribuídos para chamada remota de procedimentos.

Estes procedimentos, normalmente, envolvem serviços disponibilizados em redes, tais como acesso a DNS, gerencimento remoto, etc.

Page 6: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

6

RPC (II)

RPC não precisa, necessariamente, envolver estruturação em termos de objetos.

Como em CORBA e RMI, existe a necessidade de se trabalhar com interfaces remotas denominadas STUBS. Tanto o cliente quanto o servidor necessitam de um Runtime para processamento da RPC.

Page 7: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

7

CORBA (I)

CORBA é uma arquitetura para acesso a objetos distribuídos que prima pela independência da plataforma.

A especificação CORBA define, por exemplo, tipos de dados que podem ser mapeados para várias linguagem de programação, como C++, Pascal e Java.

Page 8: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

8

CORBA (II)

Um ponto-chave em CORBA é a utilização de uma IDL (Linguagem de Definição de Interface). Várias linguagens (inclusive Java) já disponibilizam mecanismos para mapeamento de IDL.

CORBA exige uma espécie de “servidor” especializado chamado ORB (Object Request Broker). Existem alguns ORB´s comerciais, tais como VisiBroker e Orbix.

Page 9: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

9

Java RMI

Arquitetura de acesso a objetos distribuídos suportada pela linguagem Java.

Em termos de complexidade de programação e ambiente, é muito simples construir aplicações RMI, comparando-se com RPC e CORBA.

Em termos de ambiente, exige somente suporte TCP/IP e um serviço de nomes de objetos (rmiregistry), disponilizado gratuitamente com o JDK/SDK.

Page 10: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

10

Arquitetura Java RMI

Na realidade, o RMI é uma interface que permite a intercomunicação entre objetos Java localizados em diferentes hosts. Cada objeto remoto implementa uma interface remota que especifica quais de seus métodos podem ser invocados remotamente pelos clientes.

Os clientes invocam tais métodos exatamente como invocam métodos locais.

Page 11: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

11

Modelo de camadas do RMI

Page 12: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

12

Interfaces para métodos remotos(I)

A definição do serviço remoto é feita através de uma interface Java.

Page 13: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

13

Interfaces para métodos remotos(II)

O primeiro passo para disponibilizar métodos que possam ser invocados remotamente consiste na preparação de uma interface remota com tais métodos.

A construção desta interface pode ser feita com base na extensão da interface Remote do pacote java.rmi.

Page 14: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

14

Interfaces para métodos remotos(III)

A arquitetura RMI suporta duas classes implementando a mesma interface:

Uma, que implementa o serviço e é interpretada no servidor

Outra, que age como um mecanismo de proxy e é interpretada no cliente

Page 15: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

15

Interfaces para métodos remotos(IV)

Um cliente faz chamadas de métodos ao objeto proxy, RMI envia a requisição à JVM remota, que executa o método.

Page 16: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

16

Interfaces para métodos remotos(V)

Valores retornados pelo serviço remoto são enviados, inicialmente, ao objeto proxy, que os repassa para a aplicação cliente.

Vários servidores podem implementar de maneira diferente a mesma interface de acesso ao serviço.

Page 17: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

17

Exemplo

Suponha que se queira deixar um método chamado sayHello(), que devolve uma String, disponibilizado para chamada remota.

import java.rmi.*;

public interface Hello

extends Remote{

public String sayHello()

throws RemoteException;

}

Page 18: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

18

Implementação do método remoto

Cada classe que queira disponibilizar tal método remoto precisa implementar a interface especificada anteriormente. Além disto, a classe precisa extender a classe UnicastRemoteObject, que é uma especialização de um servidor remoto ( classe RemoteServer).

Page 19: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

19

Exemplo

import java.rmi.*;import java.rmi.server.*;import java.net.*;

public class servidorextends UnicastRemoteObjectimplements Hello{

public servidor() throws RemoteException{ // Construtor super();}

public String sayHello() throws RemoteException{ // Método remoto return(“Oi cliente”);

}

Page 20: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

20

Exemplo ( Continuação )

public static void main(String args[]){ try{ servidor serv=new servidor(); Naming.rebind(“ServidorHello”,serv); // Registra nome do servidor System.out.println(“Servidor remoto pronto.”); } catch(RemoteException e){ System.out.println(“Exceção remota:”+e); } catch(MalformedURLException e){};

}}

A partir deste ponto, o objeto chamado ServidorHello está apto a aceitar chamadas remotas.

Page 21: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

21

Compilação e execução do servidor

Não basta apenas compilar e executar o programa anterior. Toda a compilação e execução necessita de um ambiente dado pela seguinte seqüência:

1. Compilar o arquivo .java2. Chamar o aplicativo rmic para gerar o Stub e Skel3. Ativar o controlador de registros (rmiregistry)

4. Chamar o interpretador com o servidor compilado

Page 22: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

22

Stubs e Skels

O cliente, quando invoca remotamente um método, não conversa diretamente com o objeto remoto, mas com uma implementação da interface remota chamada stub, que é enviada ao cliente. O stub, por sua vez, passa a invocação para a camada de referência remota.

Esta invocação é passada para um skel (esqueleto) , que se comunica com o programa servidor.

Page 23: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

23

Compilação do exemplo anterior

servidor.java

servidor.class

servidor_Stub.class servidor_Skel.class

javac

rmic

Page 24: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

24

Execução do servidor

O primeiro passo antes de executar o servidor é ativar uma espécie de servidor de nomes de servidores que atendem solicitações de métodos remotos. Isto é feito chamando-se o programa rmiregistry. Este programa pode estar ouvindo portas específicas, como por exemplo: % rmiregistry 2048 &

Uma vez que este programa está executando, pode-se chamar o interpretador java para o arquivo servidor.class .

Page 25: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

25

Programação do cliente

O primeiro passo de implementação de um cliente que quer invocar remotamente método é obter o stub do servidor remoto. A localização deste stub é feita com o método lookup(endereço).

Este método devolve uma referência remota do objeto, através do envio do stub.

Page 26: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

26

Exemplo

import java.rmi.*;

class cliente{

public static void main(String args[]){ try{

Servidor serv= (Servidor) Naming.lookup(“rmi://ime.usp.br:2048 /ServidorHello”);

String retorno=serv.sayHello();}

catch(Exception e); }}

Page 27: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

27

Esquema da chamada

ime.usp.br

Registry

Servidor_Stub.class

Servidor_Skel.class

Servidor..class

cliente

Stub

lookup(.../Servidor)

Servidor está aqui

Solicitação de stub

Stub

sayHello()

“Oi cliente”

Page 28: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

28

Exemplo II ( Calculadora)

Interface

public interface Calculator extends java.rmi.Remote { public long add(long a, long b) throws java.rmi.RemoteException; public long sub(long a, long b) throws java.rmi.RemoteException; public long mul(long a, long b) throws java.rmi.RemoteException; public long div(long a, long b) throws java.rmi.RemoteException; }

Page 29: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

29

Exemplo II ( Calculadora)

Implementação dos métodos

public class CalculatorImpl extends java.rmi.server.UnicastRemoteObject implements Calculator { public CalculatorImpl() throws java.rmi.RemoteException { super(); } public long add(long a, long b) throws java.rmi.RemoteException { return a + b; }

Page 30: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

30

Exemplo II ( Calculadora)

Implementação dos métodos(II) public long sub(long a, long b) throws java.rmi.RemoteException { return a - b; } public long mul(long a, long b) throws java.rmi.RemoteException { return a * b; } public long div(long a, long b) throws java.rmi.RemoteException { return a / b; } }

Page 31: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

31

Exemplo II ( Calculadora)

Servidor import java.rmi.Naming;

public class CalculatorServer { public CalculatorServer() { try { Calculator c = new CalculatorImpl(); Naming.rebind(" rmi://jaca.ime.usp.br:1099/ CalculatorService", c); } catch (Exception e) { System.out.println("Trouble: " + e); } } public static void main(String args[]) { new CalculatorServer(); } }

Page 32: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

32

Exemplo II ( Calculadora)

Cliente import java.rmi.Naming;

public class CalculatorClient { public static void main(String[] args) { try { Calculator c = (Calculator) Naming.lookup(

"rmi://jaca.ime.usp.br:1099/CalculatorService"); System.out.println( c.sub(4, 3) ); System.out.println( c.add(4, 5) ); System.out.println( c.mul(3, 6) ); System.out.println( c.div(9, 3) ); } catch (Exception e) { System.out.println(e); } } }

Page 33: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

33

Passagem de parâmetros

Quando se passa um parâmetro para um método remoto, pode ocorrer duas situações:

Tipos primitivos: RMI faz uma cópia do parâmetro e a envia para o servidor

Objetos: RMI utiliza o mecanismo de serialização para enviar uma cópia do objeto para o servidor

Page 34: 1 PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001 Aula 06 Objetos distribuídos I: RMI 05.02.2001 Luciano Silva e-mail: lucianos@ime.usp.br

34

Funcionalidades adicionais do RMI

É possível substituição dinâmica da interface remota enviada ao cliente

É possível o servidor invocar, remotamente, algum serviço do cliente sem que o cliente estenda diretamente a classejava.rmi.server.UnicastRemoteObject.