Java RMI - Introdução
RMI significa Remote Method Invocation. É um mecanismo que permite que um objeto residente em um sistema (JVM) acesse / invoque um objeto em execução em outra JVM.
RMI é usado para construir aplicativos distribuídos; ele fornece comunicação remota entre programas Java. É fornecido no pacotejava.rmi.
Arquitetura de um aplicativo RMI
Em um aplicativo RMI, escrevemos dois programas, um server program (reside no servidor) e um client program (reside no cliente).
Dentro do programa do servidor, um objeto remoto é criado e a referência desse objeto é disponibilizada para o cliente (usando o registro).
O programa cliente solicita os objetos remotos no servidor e tenta invocar seus métodos.
O diagrama a seguir mostra a arquitetura de um aplicativo RMI.
Vamos agora discutir os componentes dessa arquitetura.
Transport Layer- Esta camada conecta o cliente e o servidor. Ele gerencia a conexão existente e também estabelece novas conexões.
Stub- Um stub é uma representação (proxy) do objeto remoto no cliente. Ele reside no sistema do cliente; ele atua como um gateway para o programa cliente.
Skeleton - Este é o objeto que reside no lado do servidor. stub se comunica com este esqueleto para passar a solicitação ao objeto remoto.
RRL(Remote Reference Layer) - É a camada que gerencia as referências feitas pelo cliente ao objeto remoto.
Trabalho de um aplicativo RMI
Os pontos a seguir resumem como funciona um aplicativo RMI -
Quando o cliente faz uma chamada para o objeto remoto, ele é recebido pelo stub que eventualmente passa essa solicitação para o RRL.
Quando o RRL do lado do cliente recebe a solicitação, ele invoca um método chamado invoke() do objeto remoteRef. Ele passa a solicitação para o RRL no lado do servidor.
O RRL no lado do servidor passa a solicitação para o Skeleton (proxy no servidor), que finalmente chama o objeto necessário no servidor.
O resultado é passado de volta ao cliente.
Marshalling e Unmarshalling
Sempre que um cliente invoca um método que aceita parâmetros em um objeto remoto, os parâmetros são agrupados em uma mensagem antes de serem enviados pela rede. Esses parâmetros podem ser do tipo ou objetos primitivos. No caso do tipo primitivo, os parâmetros são colocados juntos e um cabeçalho é anexado a eles. Caso os parâmetros sejam objetos, eles são serializados. Este processo é conhecido comomarshalling.
No lado do servidor, os parâmetros compactados são descompactados e, em seguida, o método necessário é chamado. Este processo é conhecido comounmarshalling.
Registro RMI
O registro RMI é um namespace no qual todos os objetos do servidor são colocados. Cada vez que o servidor cria um objeto, ele registra esse objeto com o RMIregistry (usandobind() ou reBind()métodos). Eles são registrados usando um nome exclusivo conhecido comobind name.
Para invocar um objeto remoto, o cliente precisa de uma referência desse objeto. Nesse momento, o cliente busca o objeto do registro usando seu nome de ligação (usandolookup() método).
A ilustração a seguir explica todo o processo -
Objetivos do RMI
A seguir estão os objetivos do RMI -
- Para minimizar a complexidade do aplicativo.
- Para preservar a segurança do tipo.
- Coleta de lixo distribuída.
- Minimize a diferença entre trabalhar com objetos locais e remotos.