Você está na página 1de 3

1

Trabalho de RMI Disciplina de Sistemas Distribudos. Maurcio Oliveira Lino e Miguel L. de Arajo Jr.
RMI (Remote Method Invocation)
Overview
1
Invocao de Mtodos Remotos ou simplesmente RMI um mecanismo utilizado para
executar comunicao em rede e possibilita que um objeto ativo em uma mquina virtual Java
possa interagir com objetos de outras mquinas virtuais Java, independente de sua localizao.
Aplicaes RMI geralmente compreendem dois sistemas distintos, um servidor e um
cliente. Um sistema servidor tpico cria alguns objetos remotos, faz referncias a esses objetos
acessveis, e aguarda os clientes para invocar mtodos nesses objetos. Um sistema cliente
tpico obtm uma referncia remota a um ou mais objetos remotos em um servidor e ento
invoca mtodos deles.
Arquitetura RMI - Camadas
A arquitetura RMI oferece a transparncia de localizao atravs da organizao de
trs camadas entre os objetos cliente e servidor:
1. A camada de stub/skeleton oferece as interfaces que os objetos da aplicao usam
para interagir entre si. Esta intercepta as chamadas de mtodos feitas pelo cliente
para que a varivel de referncia da interface redirecione essas chamadas para o
servio RMI remoto. Ex: Quando um objeto local invoca um mtodo num objeto
remoto, o "stub" fica responsvel por enviar esta chamada para o objeto remoto. J o
"skeleton" responsvel por enviar a chamada ao objeto remoto.
2. A camada de referncia remota - Remote Reference Layer - o middleware entre a
camada de stub/skeleton e o protocolo de transporte. esta camada que estabelece a
semntica da ligao RMI entre clientes e objetos remotos;
3. A camada do protocolo de transporte oferece o protocolo de dados binrios que envia
as solicitaes aos objetos remotos pela rede entre as vrias JVMs.
Para se fixar vamos exemplificar novamente este funcionamento:
1 O cliente chama o mtodo remoto usando um Stub;
2 O Stub ento envia uma mensagem para o Skeleton na mquina remota, contento
os argumentos da chamada ao mtodo remoto;
3 O Skeleton empacota a resposta e a reenvia ao stub na mquina do cliente;
Vale lembrar tambm que tipos primitivos de dados so passados por valor e objetos
so passados por referncia nas chamadas dos mtodos.
Um objeto, para ser passado por valor deve implementar java.io.Serializable.
Exemplo: public class MeuObjeto implements Serializable
Um objeto, para ser passado por referncia, deve estender a sua interface
java.rmi.Remote.
Exemplo: interface IObjetoRemoto extends Remote
2
Trabalho de RMI Disciplina de Sistemas Distribudos. Maurcio Oliveira Lino e Miguel L. de Arajo Jr.
Essa figura ilustra a organizao dessas trs camadas em uma aplicao RMI:
Comunicao e Interface
O ambiente de comunicao RMI formado por trs elementos: servidor, cliente e
servidor de registro;
Servidor
Cria objetos remotos (que sero invocados atravs do sistema RMI);
Deve especificar uma interface contendo os mtodos a serem disponibilizados para
acesso remoto e ainda estabelece uma associao entre o objeto da classe que
implementa esses mtodos e um endereo IP e porta TCP locais;
Espera por chamadas dos clientes aos mtodos dos objetos criados;
Cliente
Obtm referncias para os objetos remotos disponibilizados pelo servidor;
Invoca os mtodos dos objetos como se estes fossem locais;
Servidor de registros
Funciona de forma parecida com um servidor DNS;
Armazena as informaes de localizao dos servidores RMI que estejam registrados;
Os servidores RMI precisam se associar ao servidor de registro;
Os clientes RMI precisam consultar esses servidores;
Ambos devem saber o endereo do servidor de registros;
O conjunto de mdulos que se comunicam proporcionando a comunicao entre essa
estrutura so chamadas de interfaces. Esta comunicao pode acontecer por meio de
chamadas de procedimentos entre eles ou pelo acesso direto s variveis de outro mdulo.
A classe que implementa o comportamento roda do lado do servidor RMI. A classe que
roda no cliente atua como um Proxy para o servio remoto. Lembrando que um Proxy um
servidor que atende a requisies repassando os dados do cliente frente.
Observadas as funes de cada elemento para que tudo isso funcione, inicialmente
necessrio se definir uma interface remota de servios, a qual ir possibilitar o acesso aos
servios oferecidos pelo servidor. Estes servios devero ser implementados atravs da
interface RMI definida e nessa implementao devero ser definidos quais os objetos da classe
3
Trabalho de RMI Disciplina de Sistemas Distribudos. Maurcio Oliveira Lino e Miguel L. de Arajo Jr.
que podero ser acessados remotamente.
Todo mtodo da interface dever declarar que a exceo RemoteException pode ser
gerada na execuo do mtodo.
Exemplo de Interface
// Count Interface faz referncia a um contador remoto
import java.rmi.*;
// a interface estende Remote pois esta a classe de interface remota do java que permite a identificao de interfaces cujos
mtodos podemser invocados a partir de uma mquina virtual no-local, ou seja, remota.
// RemoteException uma superclasse que trata as excees ocorridas durante a execuo de uma chamada de mtodo remoto.
public interface Count extends Remote {
void set(int val) throws RemoteException; // define um valor inicial para o contador;
void reset() throws RemoteException; // reinicia o contador atribuindo o valor 0;
int get() throws RemoteException; // consulta o valor do contador;
int increment() throws RemoteException; // l o valor do contador e incrementa-o;
}
Implementao do Servio
Para a implementao do servio necessrio que se defina a classe que implementa a
interface, em seguida preciso incluir as funcionalidades para que um objeto dessa classe
possa ser acessado remotamente como um servidor. Essas funcionalidades so especificadas
atravs do uso da classe RemoteServer do pacote java.rmi.server quando o objeto servidor
estende dessa classe uma de suas subclasses como a UnicastRemoteObject, que permite
representar um objeto que tem uma nica implementao em um servidor (ou seja, no
replicado em vrios servidores) mantendo uma conexo ponto-a-ponto com cada cliente que o
referencia.
Exemplo:
// CountImpl.java
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
// classe CountImpl extende a subclasse Unicast da classe RemoteServer e implementa a interface anteriormente definida.
public class CountImpl extends UnicastRemoteObject implements Count {
private int sum;
public CountImpl() throws RemoteException {
}
public void set(int val) throws RemoteException {
sum = val;
}
public void reset() throws RemoteException {
sum = 0;
}
public int get() throws RemoteException {
return sum;
}
public int increment() throws RemoteException {
return sum++;
4
Trabalho de RMI Disciplina de Sistemas Distribudos. Maurcio Oliveira Lino e Miguel L. de Arajo Jr.
}
}
A partir deste ponto possvel se criar as aplicaes cliente e servidor. O servidor RMI
uma classe que cria o objeto que implementa o servio e cadastra esse servio na plataforma
de objetos distribudos.
Exemplo de Servidor RMI
// CountServer.java
import java.rmi.registry.*;
public class CountServer {
public static void main(String[] args) {
try {
// Este o nome pelo qual o servio ser posteriormente localizado
String serviceName = "Count001";
// Cria objeto servidor
CountImpl myCount = new CountImpl();
// Obtm referncia para rmiregistry * que est executando na mquina local, operando na
porta default (1099)
Registry r = LocateRegistry.getRegistry();
// Registra a ligao nome-objeto servidor no rmiregistry
r.bind(serviceName, myCount);
// Tudo feito, servidor est preparado para receber solicitaes de clientes
System.out.println("Count Server ready.");
}
catch (Exception e) {
System.out.println("Exception: " + e.getMessage());
e.printStackTrace();
}
}
}
O desenvolvimento de um cliente RMI requer essencialmente a obteno de uma
referncia remota para o objeto que implementa o servio, o que ocorre atravs do cadastro
realizado pelo servidor. Uma vez obtida essa referncia, a operao com o objeto remoto
exatamente igual ao da operao com um objeto local.
* O aplicativo rmiregistry uma implementao de umservio de nomes para RMI. O servio de nomes uma
espcie de diretrio, onde cada servio disponibilizado na plataforma registrado atravs de um nome do servio -
uma string nica para cada objeto que implementa servios emRMI.
Exemplo de Cliente RMI
// CountReset.java
import java.rmi.registry.*;
public class CountReset {
public static void main(String args[]) {
try {
// Localiza o servio pelo nome atravs do rmiregistry executando na mquina local
5
Trabalho de RMI Disciplina de Sistemas Distribudos. Maurcio Oliveira Lino e Miguel L. de Arajo Jr.
Registry r = LocateRegistry.getRegistry();
Count myCount = (Count) r.lookup("Count001");
// Realiza operaes com objeto remoto da classe Count
myCount.reset();
}
catch(Exception e) {
e.printStackTrace();
}
System.exit(0);
}
}
Para que um servio oferecido por um objeto possa ser acessado remotamente atravs
de RMI, preciso tambm as classes auxiliares internas de stubs e skeletons, responsveis pela
comunicao entre o objeto cliente e o objeto que implementa o servio, conforme observado
na figura representativa das camadas. Para tanto, utiliza-se o aplicativo compilador RMI, rmic,
disponibilizado juntamente com o kit de desenvolvimento Java. Neste ponto ocorre o processo
de empacotamento e desempacotamento demonstrado entre stub e skeleton.
Nomeao
Os servios remotos so localizados pelos clientes atravs do servio de nomeao ou
diretrio (naming or directory). O prprio RMI inclue um simples servio, chamado de RMI
Registry. Esse mtodo aceita a URL que especifica o nome do servidor e o nome do servio
desejado. O mtodo retorna uma referncia remota para o objeto do servio.
As interfaces remotas em Java so declaradas da mesma forma que uma interface Java
comum exceto por um detalhe, essas interfaces devem estender da interface Remote do
pacote java.rmi.
O pacote java.rmi.registry oferece uma classe e uma interface para que classes Java
tenham acesso ao servio de nomes RMI.
A interface Registry representa uma interface para o registro de objetos RMI operando
em uma mquina especfica. Atravs de um objeto dessa classe, possvel invocar o
mtodo bind() que associa um nome de servio (umString) ao objeto que o implementa.
Exemplo:
// Classe LocateRegistry fornece mtodo getRegistry() que obtmreferncia para o servio de registro local na porta padro
Registry r = LocateRegistry.getRegistry();
// o mtodo bind() utilizado para registrar umnovo servio j disponibilizado o acesso
r.bind(serviceName, myCount);
Pode-se ainda utilizar para o objeto r mtodos para atualizar o servio, rebind(); para
eliminar, ubind(); obter uma lista com os nomes de todos os servios registrados, list(); e o
nome do objeto remoto que implementou o servio, lookup();
Tolerncia a Falhas
Uma soluo para o problema de falhas seria se utilizar tcnicas de replicao, porm
isso no ocorre com muita freqncia neste tipo de sistema, por outro lado, existem
6
Trabalho de RMI Disciplina de Sistemas Distribudos. Maurcio Oliveira Lino e Miguel L. de Arajo Jr.
semnticas que podem ser muito teis para se garantir tolerncia falha em sistemas
distribudos:
Retentativa de mensagem de requisio - retransmitir a mensagem e requisio at
que uma resposta seja recebida ou falha.
Filtragem de duplicadas - usada em retransmisso ou para eliminar requisies
replicadas no servidor.
Retransmisso de resultados - Mantm histrico das mensagens de resposta a fim de
permitir retransmisso.
Segurana
O carregamento do cdigo de uma classe para a JVM realizado pelo class loader da
mquina virtual. O class loader, deve obedecer a uma poltica de segurana estabelecida para
aquela mquina virtual.
Sendo assim o RMI fornece o "RMISecurityManager", sem o qual objetos locais se
tornam incapazes de baixar cdigo ou utilizar mtodos remotos. O RMISecurityManager segue
o modelo de segurana do JDK 1.6. No modelo de segurana do JDK 1.6, o cdigo,
independentemente se local ou remoto, sempre executado sob uma poltica de segurana.
Para se criar um SecurityManager padro para aplicaes usando RMI, a seguinte linha
de cdigo deve ser includa antes de executar qualquer operao envolvendo classes remotas:
System.setSecurityManager(new RMISecurityManager());
E para permitir que o cliente se conecte com o registro do RMI e com o objeto do
servidor, deve ento ser criado umarquivo de poltica.
Exemplo: //Arquivo client.policy
grant
{
permission java.net.SocketPermission
*:1024-65535, connect;
};
A execuo do programa cliente dever especificar o arquivo de poltica criado.
Exemplo de execuo emlinha de comando:
> java Djava.security.policy=client.policy CountReset
Concluso
O RMI de fcil implementao e manuteno justamente por ser orientado a objetos.
Outro aspecto positivo a portabilidade, pois se tratando de cdigo totalmente escrito em
Java, qualquer computador que possua uma JVM pode rodar estes programas.

Você também pode gostar