Adriano Reine Bueno Rafael Barros Silva Introdução RMI Tecnologias Semelhantes Arquitetura RMI Funcionamento Serialização dos dados Criando Aplicações Distribuídas com RMI Segurança Exemplo prático Referências Sistemas distribuídos requerem que aplicações executando em diferentes espaços de endereçamento, potencialmente em máquinas diferentes, sejam capazes de trocar dados Java RMI é o mecanismo que permite um objeto invocar um método de outro objeto que existe em outro espaço de endereçamento A invocação de método remoto permite que um objeto executando sobre uma determinada JVM invoque métodos sobre um objeto executando sobre outra JVM Sockets: mecanismo básico de comunicação grande flexibilidade, mas complexidade de programação. RPC: comunicação abstraída para o nível do procedimento. abstração desenquadrada do modelo de programação, inapropriado para Java. RMI: comunicação fundida com o mecanismo de invocação de métodos integração com o modelo de programação. Java Orientada a objetos Possui diversas APIs Multi-plataforma: Java Virtual Machine (JVM) Integrada à Internet: Applets, JavaScript, JSP, Servlets Suporte a componentes: JavaBeans Fácil aprendizagem e boa aceitação entre programadores J2SE (para desktops) e J2EE (para servidores) possuem suporte para a invocação remota de métodos (RMI). RMI é uma interface de programação que permite que um programa rodando em uma dada máquina efetue chamadas à objetos instanciados em outra máquina Através da utilização da arquitetura RMI, é possível que um objeto ativo em uma máquina virtual Java possa interagir com objetos de outras máquinas virtuais Java, independentemente da localização dessas máquinas virtuais Aplicações RMI geralmente consistem de dois programas separados Cliente e servidor Pacote java.rmi API para implementação de objetos clientes, servidores e interfaces API para utilizar os serviços de runtime Serviços de runtime Registro de objetos remotos (permite localizá-los) Ferramentas JRMI: Primeira aparição: JDK 1.1 Até JDK 1.4: compilador rmic para gerar stubs Após: Stubs podem ser gerados automaticamente pela JVM (a partir de JDK 1.5) Socket RMI Transporte UDP / TCP JRMP Descrição do Serviço Não existe Java Interface Conhece endereço RMI Naming Service Look Up matching Não existe Exact String Match Remote reference Socket Proxy object Synchronous Synchronous Garbage Collection Não existe Não existe Language paradigm Streams Method call Localização Synchronicity Existem duas outras tecnologias que se assemelham muito com a RMI: CORBA Já a tecnologia CORBA é divulgada à mais tempo e possui a vantagem de possuir bibliotecas em diversas linguagens, assim um objeto CORBA pode ser utilizado em vários programas escritos em linguagens diferentes .NET Remoting Pode ser vista como a resposta Microsoft à tecnologia RMI, e possui quase as mesmas características A tecnologia RMI foi feita exclusivamente para a plataforma Java Stub e Skeleton Camada de Referência Remota Camada de Transporte Stub Representa o servidor para o cliente Efetua serialização e envio dos parâmetros Recebe a resposta do servidor, desserializa e entrega ao cliente Skeleton Recebe a chamada e desserializa os parâmteros enviados pelo cliente Faz a chamada no servidor e retorna o resultado ao cliente. Camada de Referência Remota Responsável pela localização dos objetos nas máquinas da rede Permite que referências para um objeto servidor remoto sejam usadas pelo cliente para chamar métodos Camada de Transporte Cria e gerencia conexões de rede entre objetos remotos Elimina a necessidade do código cliente ou do servidor interagirem com o suporte da rede É baseada nas conexões TCP/IP entre as máquinas em uma rede. O servidor, ao iniciar, se registra no serviço de nomes (RMI Registry) O cliente obtém uma referência para o objeto servidor no serviço de nomes e cria o stub O cliente chama o método na stub fazendo uma chamada local A stub serializa os parâmetros e transmite a chamada pela rede para o skeleton do servidor O skeleton do servidor recebe a chamada pela rede, desserializa os parâmetros e faz a chamada do método no objeto servidor O objeto servidor executa o método e retorna um valor para o skeleton, que o desserializa e o envia pela rede à stub do cliente A stub recebe o valor do retorno serializado, o desserializa e por fim o repassa ao cliente É preciso serializar e desserializar os parâmetros da chamada e valores de retorno para transmiti-los através da rede Utiliza o sistema de serialização de objetos da máquina virtual Tipos pré-definidos pela linguagem Objetos serializáveis: implementam interface java.io.serializable Passos gerais para desenvolver aplicação distribuída com RMI: Projetar e implementar os componentes de sua aplicação distribuída Compilar os fontes Tornar as classes acessíveis via rede Iniciar a aplicação Projetar e implementar os componentes de sua aplicação distribuída Inicialmente, determine a arquitetura de sua aplicação, definindo componentes locais e componentes acessíveis remotamente: Defina as interfaces remotas: especifica métodos que podem ser invocados remotamente por um cliente Defina tipos dos parâmetros e retorno dos métodos Implemente os objetos remotos: objetos remotos devem implementar uma ou mais interfaces. Implemente os clientes Compile os fontes Como qualquer programa java, use javac para compilar os programas fonte Declarações de interfaces remotas, suas implementações, outras classes de serviço, clientes Versões anteriores a JSE 5.0 necessitam do rmic Tornar as classes acessíveis via rede Neste passo, torne certas definições de classes acessíveis via rede Como definições para interfaces remotas e seus tipos associados, e definições de classes que precisam ser acessadas por clientes e servidores Geralmente tornam-se acessíveis através de um servidor web Iniciar a aplicação Inclui, além do cliente e do servidor, o serviço de registro de nomes, rmiregistry O RMI fornece o "RMISecurityManager", sem o qual objetos locais se tornam incapazes de baixar código ou utilizar métodos remotos O RMISecurityManager segue o modelo de segurança do JDK 1.6 no qual o código, local ou remoto, é sempre executado sob uma política de segurança A política de segurança define um conjunto de permissões disponíveis para o código Cada permissão define um acesso a um recurso em particular, como por exemplo, permissão de leitura ou escrita a um diretório específico ou permissão de conexão para um host e porta Exemplo Prático http://pt.wikipedia.org/wiki/RMI dainf.ct.utfpr.edu.br/~tacla/EspSD/Aula3/0070-RMI- RPC.pdf http://pt.wikibooks.org/wiki/Java_RMI http://www.dca.fee.unicamp.br/cursos/PooJava/objdis t/javarmi.html