Java
Autoria
!
Autores
" Cláudio Geyer
" Marcelo Castiglia Pereira
!
Local
" Instituto de Informática
" UFRGS
" disciplinas:
# Programação Distribuída e Paralela (CIC e ECP)
# Programação com Objetos Distribuídos
" Versão atual
Súmula
!
Súmula
" conceitos básicos de RMI
" lado servidor " lado cliente " exemplo Hello " roteiro de desenvolvimento " segurança " pacote RMI
Bibliografia
!
Bibliografia
" documentação JDK
# API geral: versão 7 (março 2012)
# http://docs.oracle.com/javase/7/docs/api/
Bibliografia !
Bibliografia
" documentação JDK # versão 1.5.0 http://java.sun.com/j2se/1.5.0/docs/guide/rmi/ index.html # => http://docs.oracle.com/javase/1.5.0/docs/guide/ rmi/index.html # inclui 3 tutoriais# básico: programa Helllo World
# variações de socket
# objetos ativáveis
Bibliografia
!
Bibliografia
" tutorial Java da Sun
# Oracle: # http://docs.oracle.com/javase/tutorial/rmi/ index.html # Sun # http://java.sun.com/docs/books/tutorial/rmi/ index.html
# em geral, esses endereços são independentes de
Bibliografia
!
Bibliografia
" Farley, J. Distributed Java
" Curso Java RMI do jGuru
" Orfali, R. et alli. Client/Server Programming with Java and
Corba. 2 edition, Wiley, 1998.
Conceitos Básicos
!
Conceitos básicos
" RMI - Remote Method Invocation
# chamada remota de método
" função/objetivo
# mecanismo que permite a chamada de métodos de
Conceitos Básicos
!
Conceitos básicos (cont.)
" Segue modelo cliente / servidor
" Aplicação RMI usualmente composta por 2 programas
# Cliente
Conceitos Básicos
!
Conceitos básicos (cont.)
" Servidor típico# Cria objetos remotos (RMI)
# Torna as referências desses objetos acessíveis aos
clientes
# Espera por chamadas dos clientes
" Cliente típico
# Obtém referência a um (1) ou mais objetos remotos
!
Arquitetura típica de RMI
Conceitos Básicos
!
Conceitos básicos (cont.)
" oferecer comunicação entre objetos distribuídos de
forma similar à comunicação entre objetos locais
# simplifica a programação de sistemas distribuídos
" características similares às de RPC (chamada remota
Conceitos Básicos
!
Conceitos básicos (cont.)
" tratamento automático/implícito da heterogeneidade
entre máquinas cliente/servidor
" comunicação bidirecional
# argumentos de entrada
# valor de retorno
" comunicação síncrona
# chamador (cliente, emissor) fica bloqueado até
retorno (void inclusive) do chamado (servidor, receptor)
Conceitos Básicos
!
Outras características
" permite passagem de objetos
" carga automática de classes (programas)
# Permite mudança dinâmica do comportamento de
programas
# Por exemplo, o cliente pode passar o código
(classe) de um cálculo a ser realizado pelo servidor
Conceitos Básicos
!
Outras características
" atendimento multithreaded a chamadas concorrentes
# implica uso de sincronização conforme aplicação
# por exemplo, se os métodos acessam variáveis de
instância em escrita
Conceitos Básicos
!
Diferenças entre RPC e RMI
" RPC: chamada de uma procedure de um módulo/
processo
# o módulo/processo é implícito na chamada
# so há uma procedure com determinado nome no
módulo
# registra-se a procedure e não o módulo
Conceitos Básicos
!
Diferenças entre RPC e RMI
" RMI: chamada de um método de um objeto
# o objeto é explícito na chamada
# vários objetos podem ter o mesmo método
# objetos tem dados (contexto) locais ou próprios
Remote Method Invocation (RMI) ... o.método () { ... ... } ... método remoto () { ... ... } objeto remoto Máquina Virtual Java #1
(Cliente) Máquina Virtual Java #2 (Servidor)
chamada (... parâmetros ...)
Recursos Básicos
!
Recursos básicos
" localizar objetos remotos: obtenção de referências a
objetos
# através de um servidor de nomes RMI: rmiregistry
# servidor registra seus objetos com nomes
especiais
# cliente obtém referência a partir do nome
Recursos Básicos
!
Recursos básicos
" comunicação entre objetos
# totalmente a cargo do RMI
# transparente ao programador
# similar à comunicação local
Recursos Básicos
!
Recursos básicos
" carga de classes de objetos passados pela rede
# tipos: argumentos, retorno, classe stub
# uso de servidores WEB
Comunicação entre os componentes
!
Comunicação entre os componentes do
sistema RMI
Registry
WEB server WEB server
RMI RMI RMI cliente servidor Protocolo URL Protocolo URL
Passagem de Parâmetros e Resultados
!
Passagem de Parâmetros e Resultados
" tipos primitivos# por exemplo, int, boolean, double, ...
# são passados por valor
" objetos remotos
# isto é, objetos que implementam a interface remota
# são passados como referências remotas
# apenas para permitir que o receptor possa chamar
os métodos dos objetos remotos
# implicitamente na busca do servidor pelo cliente
Passagem de Parâmetros e Resultados
!
Passagem de Parâmetros e Resultados (cont.)
" todos os outros objetos# são serializados
# passados por valor
Falhas
!
Outras diferenças entre chamada local e
remota
" diferentes tipos de falha podem ocorrer em um sistema
distribuído
# afeta programação
# por exemplo, a falha pode atingir somente o
servidor
" alguns métodos, hashCode, equals, and
Camadas de Software do Sistema RMI
Programa Cliente
Stub
Camada de Referência Remota
Camada de Transporte Internet
Esqueleto Programa Servidor Camada de Referência Remota Camada de Transporte caminho lógico
Camadas de Software do Sistema RMI
!
Camadas de software (implementação)
" Interface remota# Define os métodos de uma classe remota que
podem ser chamados remotamente
" Stub
# Classe derivada de uma classe remota (servidora)
# Implementa os métodos da interface remota
# Cliente faz a chamada ao stub
# Stub é responsável por redirecionar a chamada ao
objeto remoto
" Cliente
Programação: servidor
!
Aspectos básicos de programação
" O lado do servidor" O lado cliente
" Exemplo Hello
Programação: servidor
!
Aspectos básicos de programação
" o lado do servidor# uma interface remota
# uma classe que implementa a interface
Programação: servidor
!
Aspectos básicos de programação
" o lado do servidor# métodos remotos
# são especificados em uma interface remota que
estende java.rmi.Remote
# objetos servidores remotos
# são instâncias de classes que implementam a
interface remota
# essas classes são definidas como subclasses
de
# java.rmi.server.UnicastRemoteObj
O Lado do Servidor
!
Aspectos básicos de programação
" o lado do servidor# o programa servidor gerente (mestre)
# cria um (ao menos) um objeto remoto
# associa esse objeto a um nome simbólico
# e o adiciona ao rmiregistry
# métodos remotos e construtores de objetos
remotos
# podem disparar RemoteExceptions
Exemplo HelloWorld
!
Aspectos básicos de programação
" exemplo# aplicação HelloWorld em modo cliente/servidor
# servidor remoto
# um único método
# retorna um string “Hello World”
# cliente
Exemplo Hello
!
Exemplo hello: interface do servidor
// todos os arqs em um pacote
package hello;
// importa pacote de classes RMI
import java.rmi.*;
// interface do objeto servidor
public interface Hello extends Remote {
// um único método sayHello
public String sayHello()throws java.rmi.RemoteException;
Exemplo Hello
!
Exemplo hello: implementação do servidor
package hello;
import java.rmi.*;
import java.rmi.server.*;
// herda a UnicastRemoteObject e // implementa a interface Hello
public class HelloImpl extends UnicastRemoteObject
Exemplo Hello
// implementa o construtor
public HelloImpl() throws RemoteException {
super(); }
// implementa o método sayHello
public String sayHello() throws RemoteException {
return “Hello, World!”; }
Exemplo Hello
!
Exemplo hello: implem. do servidor (cont.)
// método main da classe servidora
public static void main (String args[]) { try {
// cria objeto HelloImpl
HelloImpl h = new HelloImpl()
//registra o objeto
Exemplo Hello catch (Exception e) { System.out.println(“HelloImpl.main: “ + e); } } }
Programação: cliente
!
Aspectos básicos de programação
" o lado do cliente# conhecimento da interface remota
# acesso à interface remota do servidor em tempo de
compilação
# localização de um (ao menos) objeto servidor no
rmiregistry
# conhecimento do nome associado ao objeto
O Lado do Cliente
!
Aspectos básicos de programação
" o lado do cliente# um cliente
# que queira utilizar classes de um servidor
remoto
# deve estabelecer um gerenciador de segurança
# por exemplo, RMISecurityManager
# o cliente referencia o objeto remoto
# usando seu nome simbólico para procurá-lo no
O Lado do Cliente
!
Aspectos básicos de programação
" o lado do cliente# agora, o cliente pode chamar métodos de um
objeto remoto
# da mesma maneira que ele chama métodos de
objetos locais
# o cliente deve tratar as RemoteExceptions
Implementação de um Cliente RMI
!
Exemplo hello: implementação do cliente
package hello;
import java.rmi.*;
public class HelloClient {
public static void main (String args[]) { System.setSecurityManager (new
Implementação de um Cliente RMI
try {
// busca referência com nome
Hello h = (Hello)
Naming.lookup(“rmi://ijui.inf.ufrgs.br/ hello”);
//chama um método remoto
String message = h.sayHello() System.out.println(message);
} catch (Exception e)
{ System.out.println(“Exception in main : “ + e);
Passos do Uso de RMI
!
Passos para gerar e executar uma aplicação RMI
" 1) Escreva arquivos Java para# interface remota
# classe que implementa a interface remota (servidor)
# classe que chama o método remoto (cliente)
" 2) Compile os arquivos .java com javac
# Atualmente gera todas as classes necessárias à
Passos do Uso de RMI
!
Passos para gerar e executar uma aplicação RMI
" 3) Gere stubs e skeletons com o compilador RMI rmic:# a partir da versão 1.x (com certeza 1.5 e 1.6) o uso
do rmic (abaixo~) não é mais necessário
# simplesmente compilar com javac
# rmic < classe que implementa a interface remota>
# cuidados em caso de package
# chamar o rmic do diretório pai do pacote: pai do
hello
# indicar todo o caminho da classe: hello.HelloImpl
“-Passos do Uso de RMI
!
Passos para gerar e executar uma aplicação
RMI
" 4) Torne as classes disponíveis na rede
" 5) Inicie o registry daemon na máquina remota:
# se Unix (Solaris) rmiregistry &
Passos do Uso de RMI
!
Passos para gerar e executar uma aplicação RMI
" 6 ) Inicie o servidor na máquina remota# se o RMISecurityManager foi criado, é preciso indicar a
política de controle de segurança
# as opções de políticas (sintaxe e semântica) são
bastante ricas (e complexas)
# política totalmente aberta (cuidado) para testes:
conteúdo de arquivo policy
grant { // Allow everything for now permission java.security.AllPermission; };
Passos do Uso de RMI
!
Passos para gerar e executar uma aplicação RMI
" 6 ) Inicie o servidor na máquina remota (cont.)# o interpretador Java tem muitas opções
# inclusive quanto à segurança
# variações conforme versão do JDK
# exemplo de chamada:
java -Djava.security.policy=
\myHome\mySources\policy hello.HelloImpl
Passos do Uso de RMI
!
Passos para gerar e executar uma aplicação RMI
" 7) Inicie o programa cliente na máquina clienteUsando RMI
!
Bootstrap do Cliente e RMI
Cliente
Servidor
Hello Client Stub Registry HelloImpl_Stub.class HelloImpl_Skel.class HelloImpl.class lookup(): onde está Hello?onde está
envia a referência (stub) aqui está o stub
sayHello() “Hello”
Aspectos Adicionais
Segurança do RMI
!
Segurança do RMI
" Um programa (normalmente o cliente) que queira
utilizar classes de uma máquina remota deve estabelecer um gerenciador de segurança, por exemplo:
# System.setSecurityManager (new
Segurança do RMI
!
Segurança do RMI
" O RMISecurityManager não permite que classes
remotas (entre outras)
# utilizem novas classes
# manipulem threads
# saiam da Máquina Virtual Java
" Outros gerenciadores de segurança
# construção por extensão do
RMISecurityManager
# exemplo: implementar autenticação de chaves
Outros Aspectos
!
Integridade referencial
" quando duas (ou mais) referências ao mesmo objeto
(não remoto) são passadas em uma mesma chamada remota
# na máquina receptora, elas apontarão para a
mesma (única) cópia do objeto
" Se em chamadas distintas
Outros Aspectos
!
Semântica de chamada RPC
" cada chamada é executada somente uma vez
" se a chamada falha (rede, servidor), há certeza de que
a chamada foi executada
# ou uma única vez
Extensões a RMI
!
Extensões a RMI
" diversos trabalhos acadêmicos
" correção de deficiências de RMI
" questões # cache # replicação # assincronismo # sincronização distribuída # chamada local
Extensões a RMI !
Extensões a RMI
" ver resumos em # http://gppd.inf.ufrgs.br/wiki/index.php/CMP167/ TrabalhosLeves1a2003s1 # Página perdidaResumo
!
Resumo
" RMI permite cliente chamar métodos de objetos
remotos em servidor
" Chamada de método (quase) usual
" Atendimento concorrente a múltiplas chamadas
" Carga automática de classes
" Obtenção de referências remotas por servidor de
nomes
" Objetos argumentos passados por cópia
" Interface RMI
Pacote java.rmi
!
Pacote java.rmi
" uso por clientes e servidores
" Classe Remote
# servidores com interface marcadora
" Classe Naming
# associação, desassociação e procura de objetos
remotos
" Observação:
Pacote java.rmi
!
Pacote java.rmi
" Classe RMISecurityManager
# testes de segurança em classes carregadas de
máquinas remotas
Pacote java.rmi
!
Pacote java.rmi (cont.)
" Classe RemoteException
# estende java.lang.Exception
# subclasses, por exemplo
# ConnectException
# AccessException
# NoSuchObjectException
# devem ser “pegas” num bloco catch ou declaradas
Pacote java.rmi
!
Pacote java.rmi.server
" necessitado por servidores apenas
" as classes mais importantes:
# RemoteObject
# estende java.lang.Object
# métodos como equals(), toString(), hashCode
(), que fazem sentido para objetos remoto
# RemoteServer
# métodos para obter informações sobre clientes e
Pacote java.rmi
!
Pacote java.rmi.server (cont.)
" as classes mais importantes:# UnicastRemoteObject
# subclasse de RemoteServer vinda com o pacote
# usa sockets TCP para comunicação
# referências remotas não permanecem válidas
após reinícios (falha - start) do servidor
Pacote java.rmi
!
Pacote java.rmi.server
" Classe java.rmi.activation.Activatable
# classe abstrata
# objetos remotos da classe são ativados somente
quando chamados
Interfaces de Registro
!
Conceitos
" Um registro é um objeto remoto que mapeia nomes para
objetos remotos.
" Um registro pode ser usado em uma máquina virtual com
Interfaces de Registro
!
Interfaces de Registro (cont.)
" para recuperação e registro de objetos através de um
simples nome.
# Interface java.rmi.registry.Registry
A interface Registry
!
A interface Registry
" A interface java.rmi.registry.Registry
# métodos para
# procura, associação, reassociação,
desassociação e listagem do conteúdo de um registro.
" A classe java.rmi.Naming
# usa a interface remota registry para o uso de
A interface Registry
A interface Registry:
package java.rmi.registry;
public interface Registry extends java.rmi.Remote
{
public static final int REGISTRY_PORT = 1099;
public java.rmi.Remote lookup(String name) throws java.rmi.RemoteException,
java.rmi.NotBoundException, java.rmi.AccessException;
A interface Registry
public void bind(String name, java.rmi.Remote obj)
throws java.rmi.RemoteException, java.rmi.AlreadyBoundException, java.rmi.AccessException;
public void rebind(String name java.rmi.Remote obj)
throws java.rmi.RemoteException, java.rmi.AccessException;
A interface Registry
public void unbind(String name)
throws java.rmi.RemoteException,
java.rmi.NotBoundException, java.rmi.AccessException;
public String[] list()
throws java.rmi.RemoteException, java.rmi.AccessException; }
A interface Registry
!
A interface Registry (cont.)
" REGISTRY_PORT é a porta default de registro
" lookup
# retorna o objeto remoto associado ao nome
especificado
# o objeto remoto implementa um conjunto de
interfaces remotas
# clientes podem juntar o objeto remoto à interface
A interface Registry
!
A interface Registry (cont.)
" bind# associa o nome ao objeto remoto obj.
# se o nome já está associado a um outro objeto, a
exceção AlreadyBoundException é ativada.
" Rebind
# associa o nome ao objeto remoto obj.
# qualquer associação do nome feita anteriormente é
A interface Registry
!
A interface Registry (cont.)
" unbind# remove a associação entre o nome e o objeto
remoto obj
# Se o nome não está associado a nenhum objeto, a
exceção NotBoundException é ativada.
" List
# retorna um array de strings contendo uma lista dos
A interface Registry
!
A interface Registry (cont.)
" Clientes# podem acessar o registro por
# interfaces LocateRegistry e Registry
A interface Registry
!
A interface Registry (cont.)
" Clientes X domínios# bind, unbind e rebind
# apenas de clientes que estejam no mesmo
domínio do servidor.
# Lookup
A classe LocateRegistry
!
A classe LocateRegistry
" java.rmi.registry.LocateRegistry
" métodos estáticos que retornam uma referência para o
registro:
# no domínio atual
# numa porta específica do domínio atual
# num domínio específico
A classe LocateRegistry
!
A classe LocateRegistry (cont.)
" createRegistry# cria e exporta um registro no domínio local na porta
especificada.
# o registro implementa uma sintaxe de nome
simples que associa o nome de um objeto remoto (uma string) a uma referência de um objeto remoto
# o nome e as associações do objeto remoto não
A classe LocateRegistry
!
A classe LocateRegistry (cont.)
" o que é retornado é o stub remoto para o registro com
o domínio especificado e a informação da porta.
" nenhuma operação remota precisa ser executada para
obter uma referência (stub) para qualquer registro em qualquer domínio.
A classe LocateRegistry
package java.rmi.registry;
public final class LocateRegistry {
public static Registry getRegistry() throws java.rmi.RemoteException;
public static Registry getRegistry(int port)
throws java.rmi.RemoteException;
public static Registry getRegistry(String host)
throws java.rmi.RemoteException,
A classe LocateRegistry
public static Registry getRegistry(String host, int port)
throws java.rmi.RemoteException,
java.rmi.UnknownHostException;
public static Registry createRegistry(int port) throws java.rmi.RemoteException;
A interface RegistryHandler
!
A interface RegistryHandler
" interface para implementações privadas.
package java.rmi.registry;
public interface RegistryHandler {
Registry registryStub(String host, int port) throws java.rmi.RemoteException,
java.rmi.UnknownHostException;
A interface RegistryHandler
Registry registryImpl(int port)
throws java.rmi.RemoteException; }
A interface RegistryHandler
!
registryStub
" retorna uma referência para contatar um registro
remoto no domínio e na porta especificados.
!
registryImpl
" constrói e exporta um registro na porta especificada
Revisão RMI básico
!
Revisão RMI básico
" o que é?" Apropriado para que tipo de arquitetura de SDs?
" RMI X OO?
" RMI X heterogeneidade de hw e plataforma?
" RMI X direcionalidade da comunicação?
Revisão RMI básico
!
Revisão RMI básico
" RMI X RPC?# estados?
# quantos podem ser chamados?
" semântica do atendimento em chamadas
concorrentes?
" transferência (passagem) de objetos
Revisão RMI básico
!
Revisão RMI básico
" localização do objeto servidor:
# via?
# como?
# servidor?
# cliente?
" carga de classes de objetos transferidos?
" quais as formas (3) de passagem de argumentos?
" qual a relação entre falhas e RMI?