SlideShare une entreprise Scribd logo
1  sur  34
Télécharger pour lire hors ligne
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 06
▪ Problema da chamada remota de métodos
▪ Tecnologia RMI
▪ Interfaces para métodos remotos
▪ Stubs e esqueletos
▪ Registros de métodos remotos
3
Chamada remota de métodos
class ...{
String hello(){
...
}
}
PROCESSO Chamada remota
Cliente Servidor remoto
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 )
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.
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.
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.
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.
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.
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.
11
Modelo de camadas do RMI
12
Interfaces para métodos remotos(I)
A definição do serviço remoto é feita através
de uma interface Java.
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.
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
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.
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.
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;
}
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).
19
Exemplo
import java.rmi.*;
import java.rmi.server.*;
import java.net.*;
public class servidor
extends UnicastRemoteObject
implements Hello{
public servidor() throws RemoteException{ // Construtor
super();
}
public String sayHello() throws RemoteException{ // Método remoto
return(“Oi cliente”);
}
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.
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 .java
2. Chamar o aplicativo rmic para gerar o Stub e Skel
3. Ativar o controlador de registros (rmiregistry)
4. Chamar o interpretador com o servidor compilado
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.
23
Compilação do exemplo anterior
servidor.java
servidor.class
servidor_Stub.class servidor_Skel.class
javac
rmic
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 .
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.
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);
}
}
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”
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;
}
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;
}
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;
}
}
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();
}
}
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);
}
}
}
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
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 classe
java.rmi.server.UnicastRemoteObject.

Contenu connexe

Similaire à 6-RMI.pdf

Sistemas distribuídos com RMI
Sistemas distribuídos com RMISistemas distribuídos com RMI
Sistemas distribuídos com RMI
Charleston Anjos
 
JustJava 2005: Web Services em Java com o JWSDP 1.5
JustJava 2005: Web Services em Java com o JWSDP 1.5JustJava 2005: Web Services em Java com o JWSDP 1.5
JustJava 2005: Web Services em Java com o JWSDP 1.5
Helder da Rocha
 
Sistemas Distribuídos - Comunicação Distribuída - Socket
Sistemas Distribuídos - Comunicação Distribuída - SocketSistemas Distribuídos - Comunicação Distribuída - Socket
Sistemas Distribuídos - Comunicação Distribuída - Socket
Adriano Teixeira de Souza
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
Eduardo Mendes
 

Similaire à 6-RMI.pdf (20)

Sistemas distribuídos com RMI
Sistemas distribuídos com RMISistemas distribuídos com RMI
Sistemas distribuídos com RMI
 
RMI (Remote Method Invocation)
RMI (Remote Method Invocation) RMI (Remote Method Invocation)
RMI (Remote Method Invocation)
 
J530 4 rmi
J530 4 rmiJ530 4 rmi
J530 4 rmi
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
Tutorial passo a passo sobre RMI
Tutorial passo a passo sobre RMITutorial passo a passo sobre RMI
Tutorial passo a passo sobre RMI
 
JustJava 2005: Web Services em Java com o JWSDP 1.5
JustJava 2005: Web Services em Java com o JWSDP 1.5JustJava 2005: Web Services em Java com o JWSDP 1.5
JustJava 2005: Web Services em Java com o JWSDP 1.5
 
Padrão Command
Padrão CommandPadrão Command
Padrão Command
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
Curso de Servlets
Curso de ServletsCurso de Servlets
Curso de Servlets
 
Rmi (remote method invocation)
Rmi (remote method invocation)Rmi (remote method invocation)
Rmi (remote method invocation)
 
Sistemas Distribuídos - Comunicação Distribuída - Socket
Sistemas Distribuídos - Comunicação Distribuída - SocketSistemas Distribuídos - Comunicação Distribuída - Socket
Sistemas Distribuídos - Comunicação Distribuída - Socket
 
Testes: Por onde Começar?
Testes: Por onde Começar?Testes: Por onde Começar?
Testes: Por onde Começar?
 
Model View Controller
Model View ControllerModel View Controller
Model View Controller
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
Supervisão e Monitorização
Supervisão e MonitorizaçãoSupervisão e Monitorização
Supervisão e Monitorização
 
Introdução Play framework
Introdução Play frameworkIntrodução Play framework
Introdução Play framework
 
Servlets
ServletsServlets
Servlets
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5
 
Programação para Web II: NodeJS
Programação para Web II:  NodeJSProgramação para Web II:  NodeJS
Programação para Web II: NodeJS
 

Plus de Manoel Ribeiro (6)

7.Troca de mensagem (Message Parsing).pdf
7.Troca de mensagem (Message Parsing).pdf7.Troca de mensagem (Message Parsing).pdf
7.Troca de mensagem (Message Parsing).pdf
 
RI-8.pdf
RI-8.pdfRI-8.pdf
RI-8.pdf
 
RedesI-aula1.pdf
RedesI-aula1.pdfRedesI-aula1.pdf
RedesI-aula1.pdf
 
Criação de Videoaulas - aula #1.pptx
Criação de Videoaulas - aula #1.pptxCriação de Videoaulas - aula #1.pptx
Criação de Videoaulas - aula #1.pptx
 
9.-dados e processamento distribuido-hadoop.pdf
9.-dados e processamento distribuido-hadoop.pdf9.-dados e processamento distribuido-hadoop.pdf
9.-dados e processamento distribuido-hadoop.pdf
 
BANCO DE DADOS.pptx
BANCO DE DADOS.pptxBANCO DE DADOS.pptx
BANCO DE DADOS.pptx
 

6-RMI.pdf

  • 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
  • 2. 2 Tó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
  • 3. 3 Chamada remota de métodos class ...{ String hello(){ ... } } PROCESSO Chamada remota Cliente Servidor remoto
  • 4. 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 )
  • 5. 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.
  • 6. 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.
  • 7. 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.
  • 8. 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.
  • 9. 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.
  • 10. 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.
  • 12. 12 Interfaces para métodos remotos(I) A definição do serviço remoto é feita através de uma interface Java.
  • 13. 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.
  • 14. 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
  • 15. 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.
  • 16. 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.
  • 17. 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; }
  • 18. 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).
  • 19. 19 Exemplo import java.rmi.*; import java.rmi.server.*; import java.net.*; public class servidor extends UnicastRemoteObject implements Hello{ public servidor() throws RemoteException{ // Construtor super(); } public String sayHello() throws RemoteException{ // Método remoto return(“Oi cliente”); }
  • 20. 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.
  • 21. 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 .java 2. Chamar o aplicativo rmic para gerar o Stub e Skel 3. Ativar o controlador de registros (rmiregistry) 4. Chamar o interpretador com o servidor compilado
  • 22. 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.
  • 23. 23 Compilação do exemplo anterior servidor.java servidor.class servidor_Stub.class servidor_Skel.class javac rmic
  • 24. 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 .
  • 25. 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.
  • 26. 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); } }
  • 28. 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; }
  • 29. 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; }
  • 30. 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; } }
  • 31. 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(); } }
  • 32. 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); } } }
  • 33. 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
  • 34. 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 classe java.rmi.server.UnicastRemoteObject.