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