• Nenhum resultado encontrado

Java RMI - Remote Method Invocation. Programação com Objetos Distribuídos (C. Geyer) Java-RMI 1

N/A
N/A
Protected

Academic year: 2021

Share "Java RMI - Remote Method Invocation. Programação com Objetos Distribuídos (C. Geyer) Java-RMI 1"

Copied!
90
0
0

Texto

(1)

Java

(2)

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

(3)

Súmula

! 

Súmula

" conceitos básicos de RMI

" lado servidor " lado cliente " exemplo Hello " roteiro de desenvolvimento " segurança " pacote RMI

(4)

Bibliografia

! 

Bibliografia

" documentação JDK

#  API geral: versão 7 (março 2012)

#  http://docs.oracle.com/javase/7/docs/api/

(5)

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

(6)

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

(7)

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.

(8)
(9)

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

(10)

Conceitos Básicos

! 

Conceitos básicos (cont.)

" Segue modelo cliente / servidor

" Aplicação RMI usualmente composta por 2 programas

#  Cliente

(11)

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

(12)

! 

Arquitetura típica de RMI

(13)

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

(14)

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)

(15)

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

(16)

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

(17)

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

(18)

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

(19)

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 ...)

(20)
(21)

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

(22)

Recursos Básicos

! 

Recursos básicos

" comunicação entre objetos

#  totalmente a cargo do RMI

#  transparente ao programador

#  similar à comunicação local

(23)

Recursos Básicos

! 

Recursos básicos

" carga de classes de objetos passados pela rede

#  tipos: argumentos, retorno, classe stub

#  uso de servidores WEB

(24)

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

(25)

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

(26)

Passagem de Parâmetros e Resultados

! 

Passagem de Parâmetros e Resultados (cont.)

" todos os outros objetos

#  são serializados

#  passados por valor

(27)

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

(28)

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

(29)

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

(30)
(31)

Programação: servidor

! 

Aspectos básicos de programação

" O lado do servidor

" O lado cliente

" Exemplo Hello

(32)

Programação: servidor

! 

Aspectos básicos de programação

" o lado do servidor

#  uma interface remota

#  uma classe que implementa a interface

(33)

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

(34)

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

(35)

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

(36)

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;

(37)

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

(38)

Exemplo Hello

// implementa o construtor

public HelloImpl() throws RemoteException {

super(); }

// implementa o método sayHello

public String sayHello() throws RemoteException {

return “Hello, World!”; }

(39)

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

(40)

Exemplo Hello catch (Exception e) { System.out.println(“HelloImpl.main: “ + e); } } }

(41)

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

(42)

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

(43)

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

(44)

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

(45)

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);

(46)

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 à

(47)

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

(48)

“-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 &

(49)

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; };

(50)

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

(51)

Passos do Uso de RMI

! 

Passos para gerar e executar uma aplicação RMI

" 7) Inicie o programa cliente na máquina cliente

(52)

Usando 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”

(53)

Aspectos Adicionais

(54)

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

(55)

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

(56)

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

(57)

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

(58)

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

(59)

Extensões a RMI ! 

Extensões a RMI

" ver resumos em #  http://gppd.inf.ufrgs.br/wiki/index.php/CMP167/ TrabalhosLeves1a2003s1 #  Página perdida

(60)

Resumo

! 

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

(61)
(62)

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:

(63)

Pacote java.rmi

! 

Pacote java.rmi

" Classe RMISecurityManager

#  testes de segurança em classes carregadas de

máquinas remotas

(64)

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

(65)

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

(66)

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

(67)

Pacote java.rmi

! 

Pacote java.rmi.server

" Classe java.rmi.activation.Activatable

#  classe abstrata

#  objetos remotos da classe são ativados somente

quando chamados

(68)

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

(69)

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

(70)

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

(71)

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;

(72)

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;

(73)

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; }

(74)

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

(75)

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 é

(76)

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

(77)

A interface Registry

! 

A interface Registry (cont.)

" Clientes

#  podem acessar o registro por

#  interfaces LocateRegistry e Registry

(78)

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

(79)

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

(80)

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

(81)

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.

(82)

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,

(83)

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;

(84)

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;

(85)

A interface RegistryHandler

Registry registryImpl(int port)

throws java.rmi.RemoteException; }

(86)

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

(87)

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?

(88)

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

(89)

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?

(90)

Java

Referências

Documentos relacionados

Se você for retirar o kit para outra pessoa, você precisará de uma cópia do e-mail de confirmação e de uma cópia de um documento oficial da pessoa para a qual você está

Já na véspera à noite se fazem fogueiras com barricas de alcatrão em todas as ruas da cidade, assim como ao longo do rio em todas as ruas da cidade, assim como ao longo do rio,

Os empregadores que não efetuarem o pagamento das remunerações em moeda corrente deverão deixar o cheque à disposição dos empregados até às 13:30 horas do quinto dia útil e

2) Parâmetros quantitativos: a) espessura da prega nucal (PN): esta medida foi obtida por meio de corte transversal do sistema nervoso central, li- geiramente oblíquo e caudal,

Como aplicações futuras para o trabalho está a implementação de um painel aprimorado, com mais detalhes permitindo maior interação do usuário, modelagem de mais partes da

No seu livro mais conhecido, sobre o capital dito financeiro, Hilferding intro- duz a designação capital fictício no título da Parte Segunda (HILFERDING, 1985, pp. 11-ss), na

Desta forma, o presente estudo busca verificar a associação entre o hábito de sair de casa, a autopercepção de audição, o sexo e a faixa etária em idosos residentes no Estado

Para reduzir o consumo de energia eléctrica, água ou gás, não use o aparelho em vazio ou em condições que comprometam o rendimento máximo (por ex. portas ou tampas abertas, etc.);