Curso de Sistemas de Informação Tópicos em Sistemas Distribuídos Prof. Giuliano Prado de Morais Giglio RMI Remote Method Invocation RMI – Remote Method Invocation Modelo de objetos distribuídos ● ● ● Referência a objeto remoto: outros objetos podem invocar métodos de um objeto remoto somente se tiverem acesso a sua referência de objeto remoto – identificador único do objeto no sistema – pode ser utilizado como parâmetro ou resultado de uma invocação de método remoto Interface remota: todo objeto remoto possui uma interface remota que especifica qual dos métodos pode ser invocado remotamente – implementada pela classe do objeto remoto. Considerações de projeto ● Transparência – A latência de uma chamada local é bastante menor que de uma chamada remota. – Chamadas remotas são mais vulneráveis a falhas do que chamadas locais. – As invocações de métodos remotos são iguais as invocações aos métodos locais, porém as diferenças entre os objetos remotos e locais devem estar expressos nas suas interfaces. (e.g. as classes de objetos remotos em Java implementam a interface Remote) Objetos remotos: objetos que podem receber invocações remotas. Modelo de objetos distribuídos Modelo de objetos distribuídos ● Invocação de método remoto: invocação de um método entre objetos localizados em diferentes processos, estejam estes na mesma máquina ou não. ● ● ● Comunicação em um sistema de objetos distribuídos: invocação de método para objetos que estão localizados em diferentes processos. Coleta de lixo de objetos remotos: se a linguagem possuir coleta de lixo para objetos locais, então o mesmo deve valer para objetos remotos. Exceções: a invocação remota de um método pode causar uma exceção levantada pelo método ou devido a problemas decorrentes da distribuição (e.g. crash de um objeto, problema no canal de comunicação – timeouts) Implementação Implementação ● Módulo de comunicação – responsável pela semântica de invocação (maybe, at least once, at most once) Módulo de referência remota – ● ● ● marshaling de parâmetros, unmarshaling de resultados Dispatcher (localizado no servidor) – realiza a tradução entre referências de objetos remotos e locais, e cria referências de objetos remotos ● Proxy (localizado no cliente) – protocolo request-reply ● ● Implementação recebe a requisição do módulo de comunicação e chama o método indicado na mensagem (methodId) Skeleton (localizado no servidor) – unmarshaling dos parâmetros, marshaling dos resultados Existe um proxy, um dispatcher e um skeleton para cada classe que representa um objeto remoto! utiliza uma tabela de objetos remotos Implementação Implementação ● Geração das classes para proxies, dispatchers e skeletons – ● Ativação de objetos remotos – Objetos passivos – utilizados para evitar o desperdício de recursos a atividade do objeto é por demanda A ativação consiste em criar um objeto ativo a partir do objeto passivo criando uma nova instância de sua classe e inicializando suas variáveis com o estado armazenado Binder – ● ● geradas pelo compilador de interfaces ● ● serviço que mantém uma tabela contendo os mapeamentos de nomes textuais para referências de objetos remotos. (e.g. rmiregistry) Threads do servidor – para cada invocação remota é disparada uma thread no servidor (concorrência) Implementação ● Localização de objetos – Java RMI ● Serviço de localização ● ● ● auxilia clientes a localizarem os objetos remotos a partir das suas referências base de dados para as referências aos objetos remotos aos possíveis locais onde possam estar (pode ocorrer migração) se objeto não está no lugar indicado, então utiliza-se uma mensagem de broadcast para encontrar o objeto ● Utiliza mesma sintaxe para invocação de métodos de objetos locais ou remotos Todo objeto remoto implementa uma interface remota: – extende a interface java.rmi.Remote – todos os métodos da interface devem prever a exceção java.rmi.RemoteException (cláusula throws) além das exceções próprias da aplicação public interface MyRemoteClass extends java.rmi.Remote Exemplo - objeto remoto Java RMI – IDL (Interface Definition Language) ● sintaxe e semântica de Java – desvantagem: não suporta outras linguagens! Exemplo - servidor Exemplo - compilação ● Compilando a implementação do objeto remoto ● Geração dos stubs – javac CalculatorImpl.java – rmic CalculatorImpl – gera os arquivos ● ● CalculatorImpl_Skel.class CalculatorImpl_Stub.class Exemplo - cliente Exemplo - execução ● Compilando servidor e cliente e executando a aplicação Java RMI ● ● Passagem de parâmetros e resultados ● rmiregistry (Binder) – objetos remotos: referência do objeto remoto – – objetos não-remotos: cópia do objeto (classe deve estender a classe Serializable) deve ser executado em toda máquina que hospeda objetos remotos – mantém uma tabela para mapeamento da representação textual dos objetos aos objetos localizados na máquina – representação textual – acessado pelos métodos da classe Naming Carga de classes – carregamento automático de classes de objetos desconhecidos na JVM – flexibilidade (e.g. extensão de funcionalidades de um módulo) – servidor deve criar RMISecurityManager para segurança Desenvolvimento usando Java RMI ● Java RMI Passos – Projetar e implementar os componentes da aplicação distribuída ● ● ● – Compilação dos códigos-fontes e geração dos stubs ● ● – definição das interfaces remotas implementação dos objetos remotos implementação do servidor e clientes geração das classes do servidor e cliente (javac) criação dos stubs (rmic) Iniciar a aplicação ● ● iniciar o binder para guardar os objetos remotos (rmiregistry) iniciar o servidor e cliente(s) rmi: //computerName:port/objectName