Sistemas Distribuídos: Conceitos e Projeto Java RMI

Propaganda
Sistemas Distribuı́dos: Conceitos e Projeto
Java RMI
Francisco José da Silva e Silva
Grupo de Pesquisa em Sistemas Distribuı́dos (GSD)
Departamento de Informática / UFMA
http://www.lsd.deinf.ufma.br
18 de agosto de 2009
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
1 / 17
Introdução a Java RMI
Sistemas distribuı́dos requerem que aplicações executando em
diferentes espaços de endereçamento, potencialmente em máquinas
diferentes, sejam capazes de trocar dados;
Java RMI é o mecanismo que permite um objeto invocar um método
de outro objeto que existe em outro espaço de endereçamento;
A invocação de método remoto permite que um objeto executando
sobre uma determinada JVM invoque métodos sobre um objeto
executando sobre outra JVM.
Fontes:
http://java.sun.com/docs/books/tutorial/rmi/overview.html ou
http://www.guj.com.br/java.tutorial.artigo.37.1.guj
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
2 / 17
Introdução a Java RMI
A definição do comportamento e a implementação do comportamento
são conceitos separados: a definição do serviço remoto é codificado
usando uma interface (interface) Java, e a implementação do
serviço remoto é codificado usando uma classe (class);
A arquitetura RMI torna o uso de objetos Java distribuı́dos similar ao
uso de objetos Java locais =⇒ transparência de acesso.
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
3 / 17
Implementação Java RMI
Camada Stub e Skeleton: intercepta as chamadas de métodos feitas
pelo cliente para que a variável de referência da interface redirecione
essas chamadas para o serviço RMI remoto;
Camada Remote Reference Layer: interpreta e gerencias referências
feitas dos clientes para os objetos do serviço remoto. A conexão do
cliente ao servidor é Unicast (um-para-um);
Camada de transporte: é baseada nas conexões TCP/IP entre as
maquinas em uma rede.
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
4 / 17
Argumentos e Valores de Retorno
Podem ser passados de ou para um método remoto qualquer entidade
que seja uma instância de um tipo primitivo, objeto remoto ou objeto
serializável (que implementa a interface java.io.Serializable;
Alguns objetos não atendem a estes critérios, normalmente por
encapsular informação que faz sentido somente em um único espaço
de endereçamento, como threads e descritores de arquivos;
Muitas classes core Java, incluindo as constantes dos pacotes
java.lang e java.util implementam a interface Serializable.
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
5 / 17
Objetos Remotos e Locais
Objetos remotos são passados por referência;
Objetos locais são passados por cópia, utilizando-se o mecanismo de
serialização;
Por padrão, todos os campos são copiados excetos aqueles marcados
como estáticos ou transientes.
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
6 / 17
Localizando o Serviço Remoto RMI
Pode-se utilizar diferentes tipos de serviços de diretório, incluindo o
JNDI (Java Naming and Directory Interface);
O próprio RMI inclue um simples serviço, chamado de RMI Registry;
Ele executa em cada maquina que hospeda o serviço remoto, por
definição na porta 1099;
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
7 / 17
Localizando o Serviço Remoto RMI
O servidor:
Cria um serviço remoto, instanciando o objeto que implemente aquele
serviço;
Exporta aquele objeto para o RMI. Quando o objeto é exportado o RMI
cria um serviço que aguarda as conexões do cliente;
Registra o objeto no RMI Registry, com um nome público.
O Cliente:
O RMI Registry é acessado através da classe estática Naming;
Ela provém o método lookup(), que aceita a URL que especifica o
nome do servidor e o nome do serviço desejado e retorna uma
referência remota para o objeto do serviço;
A URL é formada como seguinte:
rmi://<host_name>[:port_number]/<service_name>
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
8 / 17
Passos para o Desenvolvimento do Servidor
1
Criar a interface do servidor, que deve estender a classe Remote.
Todo método deve lançar a exceção RemoteException;
2
Implementar a interface criada;
3
Escrever o código que instancia a implementação do servidor, exporta
o objeto para o RMI e o registra junto ao serviço de nomes da
tecnologia Java (RMI registry).
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
9 / 17
Serviço de Nomes RMI Registry
LocateRegistry: classe responsável por criar o stub para acesso ao
serviço de registro (Registry);
Alguns Métodos:
createRegistry(int port): cria e exporta uma instância de
Registry em uma máquina local que aceita pedidos em uma porta
especı́fica;
getRegistry(): retorna uma referência para o objeto remoto Registry
para a máquina local no porta 1099, que é a porta padrão do serviço
de registro;
getRegistry(String host): retorna um referência para o objeto
remoto Registry na máquina especı́fica na porta 1099.
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
10 / 17
Serviço de Nomes RMI Registry
Métodos da interface Registry:
void bind(String name, Remote obj): associa a referência
remota ao nome especificado;
String[] list(): retorna um array dos nomes registrados;
Remote lookup(String name): retorna a referência remota
correspondente ao nome especificado;
void rebind(String name, Remote obj): substitui a amarração
para o nome espeficado, associando-o à referência remota
especificada;
void unbind(String name): remove a amarração para
o nome especificado.
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
11 / 17
Exemplo de Código
Exemplo de código: calculadora
Calculator.java
CalculatorImpl.java
CalculatorServer.java
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
12 / 17
Implementando o Cliente
Obter uma referência ao objeto remoto através de uma chamada ao
método lookup(‘‘servidor’’) da interface Registry;
Basta agora utilizar o objeto remoto como se fosse local.
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
13 / 17
Exemplo de Código
Exemplo de código: cliente da calculadora.
CalculatorClient.java
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
14 / 17
Segundo Exemplo: Novas Funcionalidades do Servidor de
Cotações
Consultar a cotação de uma moeda;
Cadastrar uma nova cotação para uma moeda;
Alterar a cotação de uma moeda;
Excluir a cotação de uma moeda.
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
15 / 17
Segundo Exemplo de Código
Servidor RMI do Sistema de Cotações:
BDCotacoes.java
BDCotacoesImpl.java
ServidorBDCotacoes.java
Cliente RMI do Sistema de Cotações:
ClienteBDCotacoes.java
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
16 / 17
Terceiro Exemplo de Código
Compute Engine.
Francisco Silva (UFMA/GSD)
SD: Conceitos e Projeto
18 de agosto de 2009
17 / 17
Download