Prévia do material em texto
1 Chamadas Remotas de Procedimentos (RPC) • Chamada Remota de Procedimento (RPC) ou Chamada de Função ou Chamada de Subrotina • Método de transferência de controle de parte de um processo para outra parte • Procedimentos => permite a divisão do programas em vários pedaços O Conceito de Procedimentos main proc1 proc5 proc2 proc3 proc4 proc6 proc8proc7 - Um programa convencional consiste de um ou mais procedimentos, geralmente organi- zados em uma hierarquia de chamadas. - Uma seta de um procedimento n para um procedimento m significa uma chamada de n para m RPC: Programa Distribuído - A divisão ocorre entre o programa principal e o procedimento 4. - Um protocolo de comunicação é necessário para implementar a chamada remota. main proc1 proc5 proc2 proc3 proc4 proc6 proc8proc7 Computador 1 Computador 2 RPC: Modelo de Execução P rograma Principal P rocedimento A na máquina 1 na máquina 2 (cliente) (servidor) chamada remota proc. A Saída R esposta • O processo cliente fica bloqueado durante a execução do procedimento remoto! 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 Passos de uma Chamada Remota de Procedimentos transporte de mensagens via rede Cliente Empacota Parâmetros Desempacota Resultado Máquina do Cliente Stub do Cliente KERNEL Servidor Empacota Resultados Desempacota Parâmetros Máquina do Servidor Stub do Servidor KERNELtransporte de mensagens via rede 2 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? RMI Remote Method Invocation 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 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 3 RPC - Implementação • Stubs do lado do cliente: Stubs • Stubs do lado do servidor: Skeleton Servidor Skeleton Referência Remota Protocolo deREDE Cliente Stubs Referência Remota Protocolo deREDE Compilador rmic • O compilador rmic – recebe como entrada a descrição dos métodos remotos – gera dois arquivos: Stub e Skeleton. rmic Skeleton (servidor) Stub (cliente) Descrição dos Métodos remotos 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. RMI Registry (nome,ender) Naming.lookup(“uri://sol.dimap.ufrn.br/servobjA”) ref_obj rmi registryCliente Servidor Naming.bind(“servobjA”, ref_obj); ref_obj:metodo() 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 4 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 HelloWorld{ public string hello(); } public interface BDados{ public string ler(); public void escreve(string); } 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. 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”) } } } 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 > rmic HelloWorldImpl 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. 5 Cliente Implementação 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) { … } Executando... • Inicialmente deve-se executar o servidor de Nomes start rmiregistry • Em seguida deve-se executar o servidor: java HelloWorld Passos do 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 – 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 RMI Interface Remota Implementaçao stub skeleton Desenvolvimento Execução Cliente Servidorstub skeletonrede RMI • Implementa uma idéia “elementar” de Sistema baseado em Middleware RMI