Sistemas Distribuı́dos: Conceitos e Projeto Java RMI Francisco José da Silva e Silva Grupo de Pesquisa em Sistemas Distribuı́dos (GSD) Departamento de Informática / UFMA http://www.lsd.deinf.ufma.br 18 de agosto de 2009 Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 1 / 17 Introdução a Java RMI 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. Fontes: http://java.sun.com/docs/books/tutorial/rmi/overview.html ou http://www.guj.com.br/java.tutorial.artigo.37.1.guj Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 2 / 17 Introdução a Java RMI A definição do comportamento e a implementação do comportamento são conceitos separados: a definição do serviço remoto é codificado usando uma interface (interface) Java, e a implementação do serviço remoto é codificado usando uma classe (class); A arquitetura RMI torna o uso de objetos Java distribuı́dos similar ao uso de objetos Java locais =⇒ transparência de acesso. Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 3 / 17 Implementação Java RMI Camada Stub e Skeleton: intercepta as chamadas de métodos feitas pelo cliente para que a variável de referência da interface redirecione essas chamadas para o serviço RMI remoto; Camada Remote Reference Layer: interpreta e gerencias referências feitas dos clientes para os objetos do serviço remoto. A conexão do cliente ao servidor é Unicast (um-para-um); Camada de transporte: é baseada nas conexões TCP/IP entre as maquinas em uma rede. Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 4 / 17 Argumentos e Valores de Retorno Podem ser passados de ou para um método remoto qualquer entidade que seja uma instância de um tipo primitivo, objeto remoto ou objeto serializável (que implementa a interface java.io.Serializable; Alguns objetos não atendem a estes critérios, normalmente por encapsular informação que faz sentido somente em um único espaço de endereçamento, como threads e descritores de arquivos; Muitas classes core Java, incluindo as constantes dos pacotes java.lang e java.util implementam a interface Serializable. Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 5 / 17 Objetos Remotos e Locais Objetos remotos são passados por referência; Objetos locais são passados por cópia, utilizando-se o mecanismo de serialização; Por padrão, todos os campos são copiados excetos aqueles marcados como estáticos ou transientes. Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 6 / 17 Localizando o Serviço Remoto RMI Pode-se utilizar diferentes tipos de serviços de diretório, incluindo o JNDI (Java Naming and Directory Interface); O próprio RMI inclue um simples serviço, chamado de RMI Registry; Ele executa em cada maquina que hospeda o serviço remoto, por definição na porta 1099; Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 7 / 17 Localizando o Serviço Remoto RMI O servidor: Cria um serviço remoto, instanciando o objeto que implemente aquele serviço; Exporta aquele objeto para o RMI. Quando o objeto é exportado o RMI cria um serviço que aguarda as conexões do cliente; Registra o objeto no RMI Registry, com um nome público. O Cliente: O RMI Registry é acessado através da classe estática Naming; Ela provém o método lookup(), que aceita a URL que especifica o nome do servidor e o nome do serviço desejado e retorna uma referência remota para o objeto do serviço; A URL é formada como seguinte: rmi://<host_name>[:port_number]/<service_name> Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 8 / 17 Passos para o Desenvolvimento do Servidor 1 Criar a interface do servidor, que deve estender a classe Remote. Todo método deve lançar a exceção RemoteException; 2 Implementar a interface criada; 3 Escrever o código que instancia a implementação do servidor, exporta o objeto para o RMI e o registra junto ao serviço de nomes da tecnologia Java (RMI registry). Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 9 / 17 Serviço de Nomes RMI Registry LocateRegistry: classe responsável por criar o stub para acesso ao serviço de registro (Registry); Alguns Métodos: createRegistry(int port): cria e exporta uma instância de Registry em uma máquina local que aceita pedidos em uma porta especı́fica; getRegistry(): retorna uma referência para o objeto remoto Registry para a máquina local no porta 1099, que é a porta padrão do serviço de registro; getRegistry(String host): retorna um referência para o objeto remoto Registry na máquina especı́fica na porta 1099. Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 10 / 17 Serviço de Nomes RMI Registry Métodos da interface Registry: void bind(String name, Remote obj): associa a referência remota ao nome especificado; String[] list(): retorna um array dos nomes registrados; Remote lookup(String name): retorna a referência remota correspondente ao nome especificado; void rebind(String name, Remote obj): substitui a amarração para o nome espeficado, associando-o à referência remota especificada; void unbind(String name): remove a amarração para o nome especificado. Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 11 / 17 Exemplo de Código Exemplo de código: calculadora Calculator.java CalculatorImpl.java CalculatorServer.java Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 12 / 17 Implementando o Cliente Obter uma referência ao objeto remoto através de uma chamada ao método lookup(‘‘servidor’’) da interface Registry; Basta agora utilizar o objeto remoto como se fosse local. Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 13 / 17 Exemplo de Código Exemplo de código: cliente da calculadora. CalculatorClient.java Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 14 / 17 Segundo Exemplo: Novas Funcionalidades do Servidor de Cotações Consultar a cotação de uma moeda; Cadastrar uma nova cotação para uma moeda; Alterar a cotação de uma moeda; Excluir a cotação de uma moeda. Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 15 / 17 Segundo Exemplo de Código Servidor RMI do Sistema de Cotações: BDCotacoes.java BDCotacoesImpl.java ServidorBDCotacoes.java Cliente RMI do Sistema de Cotações: ClienteBDCotacoes.java Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 16 / 17 Terceiro Exemplo de Código Compute Engine. Francisco Silva (UFMA/GSD) SD: Conceitos e Projeto 18 de agosto de 2009 17 / 17