Chamadas Remotas de Procedimentos (RPC)

Propaganda
Chamadas Remotas de
Procedimentos (RPC)
O Conceito de Procedimentos
• Chamada Remota de Procedimento (RPC)
ou Chamada de Função ou Chamada de
Subrotina
main
proc1
proc2
proc6
proc5
• Método de transferência de controle de
parte de um processo para outra parte
proc3
proc4
proc7
proc8
- Um programa convencional consiste de um ou mais procedimentos, geralmente organizados em uma hierarquia de chamadas.
- Uma seta de um procedimento n para um procedimento m significa uma chamada de n
para m
• Procedimentos => permite a divisão do
programas em vários pedaços
RPC: Programa Distribuído
Computador 1
RPC: Modelo de Execução
P rograma P rincipal
na máquina 1
(cliente)
Computador 2
P rocedimento A
na máquina 2
(servidor)
main
proc1
proc5
proc2
proc3
proc6
chamada remota
proc. A
proc4
proc7
proc8
S aída
- A divisão ocorre entre o programa principal e o procedimento 4.
- Um protocolo de comunicação é necessário para implementar a chamada remota.
RPC
• Objetivo: Tornar mais fácil a implementação de Aplicações Distribuídas
• Esconde o código de chamadas a rede em procedimentos chamados
stubs
– Stubs -> procedimentos que contêm o código de chamadas a rede.
– Com stubs o RPC protege os programas de aplicação (cliente e
servidor) de preocupações com detalhes como sockets.
– O RPC inclui uma especificação para formato padrão dos dados
(visando interoperabilidade), e nos stubs acontece a conversão dos
dados
• No RPC da Sun o padrão para a representação dos dados é o
XDR (eXternal Data Representation Standard)
– Os stubs são gerados automaticamente por algum compilador.
Exemplo: O RPCGen da Sun
R esposta
• O processo cliente fica bloqueado durante a
execução do procedimento remoto!
Passos de uma Chamada Remota
de Procedimentos
Máquina do Cliente
Empacota
Parâmetros
Cliente
Desempacota
Parâmetros
Stub do Cliente
Desempacota
Resultado
KERNEL
Máquina do Servidor
Stub do Servidor
Servidor
Empacota
Resultados
transporte de mensagens via rede
KERNEL
transporte de mensagens via rede
1
Chamadas Remotas de
Procedimentos (RPC)
• Idéia do modelo é estender o conceito de chamada de
procedimento convencional para ambientes distribuídos.
– a ênfase é em distribuição e não em concorrência!
– objetivo é simplificar a programação distribuída,
tornando-a semelhante à programação convencional!
• Remote Procedure Call (RPC): subrotina chamada pode
ser função ou procedimento
• Procedimentos => permitem a divisão do programas em
vários pedaços que podem executar em máquinas
arbitrárias.
Semântica de Chamadas
Remotas
• Ao contrário do que acontece em chamadas convencionais,
uma das máquinas envolvidas pode falhar e a outra
permanecer ativa...
• Sistema pode garantir que a execução da rotina chamada
ocorre:
– exatamente uma vez
• difícil!!
– no mínimo uma vez
• operações devem ser idempotentes!
– no máximo uma vez
• Sistema deve retornar indicações no caso de máquina
servidora falhar!
RPC - Implementação
• O código das chamadas a rede é escondido em
procedimentos chamados stubs
– Stubs -> procedimentos que contêm o código de
chamadas a rede.
– Com stubs o RPC protege os programas de aplicação
(cliente e servidor) de preocupações com detalhes como
sockets.
• Cabe aos stubs a passagem de parâmetros entre
procedimentos.
– Máquinas diferentes podem usar representações
diferentes de dados como inteiros, caracteres, etc.
– O que fazer com dados complexos, como listas, etc?
Java RMI
• Java Remote Method Invocation (RMI) é um
protocolo Java para comunicação entre processos
• Permite objetos Java invocar transparentemente
métodos de outros objetos (que podem estar em
máquinas diferentes – objetos remotos)
• Java RMI libera o programador de tratar de
detalhes como endereçamento e codificação/
decodificação de mensagens
RMI
Remote Method Invocation
Chamadas Remotas de
Procedimentos (RPC)
• RMI consiste em chamada remota de
procedimentos em Java (onde as operações são
representadas por métodos)
• Chamada Remota de Procedimento (RPC) ou
Invocação Remota de Método (RMI) ou Chamada
Remota de Função
• Método de transferência de controle de parte de
um processo para outra parte
• Modelo de RPC é derivado da Chamada de
Procedimentos Convencionais
2
RPC - Implementação
• Stubs do lado do cliente: Stubs
• Stubs do lado do servidor: Skeleton
Cliente
Servidor
Stubs
Skeleton
Referência Remota
Referência Remota
Protocolo deREDE
Protocolo deREDE
Compilador rmic
• O compilador rmic
– recebe como entrada a descrição dos métodos remotos
– gera dois arquivos: Stub e Skeleton.
Descrição dos
Métodos remotos
rmic
Skeleton
(servidor)
Localização de Objetos Remotos
• Seria impraticável se para cada invocação
de método remoto fosse necessário incluir o
par (máquina,porta) para identificar onde se
encontra o objeto que contém o método
• RMI oferece um Serviço de Nomes (RMI
Registry) que oferece informações sobre a
localização de objetos remotos.
– o rmiregistry executa em um endereço
bem conhecido.
Stub
(cliente)
RMI Registry
Servidor
Naming.bind(“servobjA”,
ref_obj);
ref_obj:metodo()
Cliente
rmi registry
(nome,ender)
Naming.lookup(“uri://sol.dimap.ufrn.br/servobjA”)
ref_obj
Programação com RMI
• O modelo RMI:
– O servidor define objetos que o cliente pode
usar remotamente
– Os clientes podem invocar métodos nesse
objeto remoto como se ele estivesse executando
localmente.
– RMI esconde o mecanismo subjacente de
transporte, via rede, de argumentos dos
métodos e valores de retorno.
Programação com RMI
• Defina uma interface que declara os métodos
remotos
• O programa servidor
– deve incluir uma class that implementa essa
interface.
– deve criar um objeto remoto e registrá-lo no serviço de
nomes (rmi register)
• O programa cliente
– deve perguntar ao serviço de nomes pela referência do
objeto remoto.
– deve invocar o método sobre o objeto remoto
3
Interface
• Similar a classe
• Não há implementação, apenas declaração
de métodos
• Tudo é público
• É uma API que pode ser implementada por
uma classe
public interface BDados{
public string ler();
public void escreve(string);
}
public interface HelloWorld{
public string hello();
}
Servidor
Interface com métodos remotos
• A interface definida pelo servidor deve
declarar que os métodos da interface serão
invocados por clientes remotos
– A interface deve estender a interface Java
Remote que o pacote java.rmi oferece
import java.rmi.*
public interface HelloWorld extends Remote{
public string hello() throws RemoteException;
}
Indica que
a interface
é remota
Necessária para
Sinalizar erros da
Chamada remota
Servidor
Implementação da Classe
• Criar uma classe que implementa a interface. A
classe
deve
estender
UnicastRemoteObject*
• O código main() deve:
– Criar um objeto remoto
– Registrar esse objeto no serviço de Nomes
• A classe precisa definir um construtor para
RemoteException !
• A classe será usada pelo compilador rmic para
criar o código do stub e do skeleton.
Gerando Stubs e Skeletons
• Compile a interface remota e a implementação:
> javac HelloWorld.java HelloWorldImpl.java
• Use rmic para gerar
HelloWorldImpl_stub.class,
HelloWorldImpl_skel.class
Servidor
Implementação da Classe
import java.rmi.*
import java.rmi.server.*
public class HelloWorldImpl extends UnicastRemoteObject
implements HelloWorld{
public HelloWorldImpl() throws RemoteException
{ …. }
public string hello() {
return “==== Hello World!!!==== “;
}
public static void main (String args[]) {
try {
// criando o objeto remoto
HelloWorldImpl obj = new HelloWorldImpl();
// registrando esse objeto no serviço de nomes
Naming.bind(“HelloWorldServer”, obj);
} catch (RemoteException e) {
System.out.println(“ERRO”)
}
}
}
Cliente
• O cliente precisa obter, do serviço de
nomes, a referência para o objeto remoto
• O serviço de nomes usa URLs para
identificar objetos remotos.
> rmic HelloWorldImpl
4
Cliente
Implementação
Executando...
import java.rmi.*
try {
// recuperando o objeto remoto via o servidor de nomes
Object obj= Naming.lookup(“uri://pontanegra.dimap.ufrn.br
“
/HelloWorldServer);
// invocando o método hello do servidor remoto
mensagem = obj:hello()
} catch (RemoteException e) {
…
}
• Inicialmente deve-se executar o servidor de
Nomes
start rmiregistry
• Em seguida deve-se executar o servidor:
java HelloWorld
Passos do RMI
RMI
• 1. Defina a interface do servidor (estendendo a
interface java.rmi.remote)
• 2. Escreva o código do servidor que implementa a
interface
(herdando
da
classe
java.rmi.UnicastRemoteObject)
• 3. Compile o servidor
Interface Remota
Implementaçao
stub
skeleton
– Use o compilador javac para produzir o arquivo .class
– Execute o compilador rmic para obter o stub e skeleton
• 4. Execute o programa servidor (o rmiregister tem
de estar executando antes)
• 5. Execute o cliente
Desenvolvimento
Execução
Cliente
stub
rede
skeleton Servidor
RMI
• Implementa uma idéia “elementar” de
Sistema baseado em Middleware
RMI
5
Download