Sistemas Distribuídos Introdução a Sistemas Distribuídos São Paulo, 2011 Universidade Paulista (UNIP) Java – Remote Method Invocation (RMI) Prof. MSc. Vladimir Camelo [email protected] 31/05/2017 [email protected] 1 Sistemas Distribuídos Introdução Introdução a Sistemas Distribuídos Sistemas distribuídos: Neste tipo de sistema existe uma necessidade de comunicação entre sistemas em máquinas distintas. Sockets como solução? Não oferecem um modelo de programação transparente e flexível tanto para o usuário quanto para o desenvolvedor respectivamente. 31/05/2017 [email protected] 2 Sistemas Distribuídos Introdução Introdução a Sistemas Distribuídos O principal objetivo em sistemas distribuídos é: Utilizar objetos ou componentes que estão localizados em outras máquinas sem se preocupar com a camada de transporte, ou seja, como será realizada essa comunicação entre as máquinas. 31/05/2017 [email protected] 3 Sistemas Distribuídos Programação com sockets em Java Introdução a Sistemas Distribuídos Sistemas modernos: Comunicam-se entre máquinas e algumas vezes entre processos na mesma máquina, por meio do uso de sockets. O que é socket? É um canal de comunicação por meio do qual uma aplicação se comunica com outra. É referenciado por um número de porta, de maneira que a camada TCP possa identificar a aplicação de destino, ou seja, a aplicação que realizou esta chamada. 31/05/2017 [email protected] 4 Sistemas Distribuídos Programação com sockets em Java Introdução a Sistemas Distribuídos Comunicação mais simples entre aplicativos localizados em máquinas diferentes, porém pela simplicidade não é bem aplicado na manipulação de tipos de dados ou de aplicações muito complexas, principalmente quando o componente da aplicação está em máquinas diferentes. 31/05/2017 [email protected] 5 Sistemas Distribuídos Programação com sockets em Java Introdução a Sistemas Distribuídos Existem três tipos de sockets: Datagram sockets: Envia o pacote sem a confirmação de que o servidor recebeu; esta interface é implementada pelo protocolo User Datagram Protocol (UDP). Stream sockets: Envia o pacote com o cuidado de que o servidor receba e que a conexão deva estar ativa no momento da comunicação; esta interface é implementada pelo protocolo Transfer Control Protocol (TCP). 31/05/2017 [email protected] 6 Sistemas Distribuídos Programação com sockets em Java Introdução a Sistemas Distribuídos Existem três tipos de sockets: Raw sockets: Envia o pacote sem utilizar as camadas de transporte, sendo utilizada a camada de rede Internet Protocol (IP) e no Internet Control Message Protocol (ICMP). 31/05/2017 [email protected] 7 Sistemas Distribuídos Programação com sockets em Java Introdução a Sistemas Distribuídos A biblioteca para sockets: ServerSocket: esta classe possibilita criar um servidor de sockets, sendo deste a obrigação de atender a uma demanda de conexão via a rede. Socket: esta classe possibilita criar um cliente socket que é um ponto final para a comunicação entre dois nós da rede (computadores). 31/05/2017 [email protected] 8 Sistemas Distribuídos Introdução a Sistemas Distribuídos Programação com sockets em Java (Exemplo) 31/05/2017 [email protected] 9 Sistemas Distribuídos Introdução a Sistemas Distribuídos Programação com sockets em Java (Exemplo) 31/05/2017 [email protected] 10 Sistemas Distribuídos Introdução a Sistemas Distribuídos Programação com sockets em Java (Exemplo) 31/05/2017 [email protected] 11 Sistemas Distribuídos Introdução a Sistemas Distribuídos Programação com sockets em Java (Exemplo) 31/05/2017 [email protected] 12 Sistemas Distribuídos Java para sistemas distribuídos Introdução a Sistemas Distribuídos Banco de dados: JDBC, SQLJ, JDO; Objetos distribuídos: Java RMI, RMI-IIOP, Java IDL, Enterprise Java Beans (EJB); Serviços distribuídos: JTA, JTS, JAAS, DGC, JNDI; Eventos distribuídos: JMS; Web e Web Services: JAXP, JAXB, JAXM, JAXR, JAX-RPC; E-mail: JavaMail; 31/05/2017 [email protected] 13 Sistemas Distribuídos Objetos remotos com Java RMI Introdução a Sistemas Distribuídos Java RMI (Remote Method Invocation) pode ser implementado usando protocolos e infra-estrutura do ambiente de desenvolvimento Java (JRMP e RMI Registry) ou usando IIOP e ORBs (especificações do ambiente CORBA). 31/05/2017 [email protected] 14 Sistemas Distribuídos Objetos remotos com Java RMI Introdução a Sistemas Distribuídos JRMP - Java Remote Method Protocol: Pacote java.rmi - RMI básico; Ideal para aplicações 100% Java. 31/05/2017 [email protected] 15 Sistemas Distribuídos Objetos remotos com Java RMI Introdução a Sistemas Distribuídos IIOP - Internet Inter-ORB Protocol: Pacote javax.rmi - RMI sobre IIOP; Ideal para ambientes heterogêneos. 31/05/2017 [email protected] 16 Sistemas Distribuídos Objetos remotos com Java RMI Introdução a Sistemas Distribuídos A forma de desenvolvimento é similar: Há poucas diferenças para a geração da infra-estrutura (Ex.: proxies) e para o registro dos objetos remotos alocados no servidor; RMI sobre IIOP possibilita programação Java RMI e comunicação em ambiente CORBA, viabilizando integração entre o Java e outras linguagens de programação sem a necessidade de aprender os conceitos de implementação do OMG IDL 31/05/2017 [email protected] 17 Sistemas Distribuídos Introdução a Sistemas Distribuídos Interface de programação Interface de comunicação em rede 31/05/2017 [email protected] 18 Sistemas Distribuídos Java Remote Method Invocation Introdução a Sistemas Distribuídos Possibilita a criação de aplicações Java para ambientes distribuídos; Com a obtenção da referência de um objeto remoto, sua utilização é igual a de um objeto local; O RMI encapsula a interface com o protocolo de rede (socket); 31/05/2017 [email protected] 19 Sistemas Distribuídos Java Remote Method Invocation Introdução a Sistemas Distribuídos Complexidade de programação e ambiente: É muito simples construir aplicações RMI, comparando-se com aplicações que utilizam tecnologia RPC e CORBA; Ambiente: Exige somente suporte TCP/IP e um serviço de nomes de objetos (rmiregistry), disponibilizado gratuitamente com o JDK/SDK. 31/05/2017 [email protected] 20 Sistemas Distribuídos Java Remote Method Invocation Introdução a Sistemas Distribuídos O Java RMI é uma interface que possibilita a intercomunicação entre objetos Java localizados em diferentes hosts; Cada objeto remoto implementa uma interface remota que especifica quais de seus métodos podem ser invocados remotamente pelos clientes; Os clientes invocam tais métodos exatamente como invocam métodos locais. 31/05/2017 [email protected] 21 Sistemas Distribuídos Arquitetura Java RMI Introdução a Sistemas Distribuídos Uma aplicação distribuída com RMI tem acesso transparente ao objeto remoto por meio de sua Interface remota: A "Interface remota" é uma interface que estende os métodos e propriedades da API java.rmi.Remote; A partir da Interface remota e implementação do objeto remoto o sistema gera objetos (proxies) que realizam todas as tarefas necessárias para viabilizar a comunicação em rede 31/05/2017 [email protected] 22 Sistemas Distribuídos Introdução a Sistemas Distribuídos Arquitetura Java RMI 31/05/2017 [email protected] 23 Sistemas Distribuídos Introdução a Sistemas Distribuídos Arquitetura Java RMI JVM “A” JVM “B” Aplicação Objeto remoto Stub Skeleton Camada de referência remota Gerados pelo desenvolvedor Gerados automaticamente Classes que Implementam o RMI (Java.rmi.*) Camada de transporte 31/05/2017 [email protected] 24 Sistemas Distribuídos Introdução a Sistemas Distribuídos Arquitetura Java RMI 31/05/2017 [email protected] 25 Sistemas Distribuídos Introdução a Sistemas Distribuídos Arquitetura Java RMI 31/05/2017 [email protected] 26 Sistemas Distribuídos Introdução a Sistemas Distribuídos Arquitetura Java RMI 31/05/2017 [email protected] 27 Sistemas Distribuídos Introdução a Sistemas Distribuídos Arquitetura Java RMI 31/05/2017 [email protected] 28 Sistemas Distribuídos Introdução a Sistemas Distribuídos Arquitetura Java RMI 31/05/2017 [email protected] 29 Sistemas Distribuídos Introdução a Sistemas Distribuídos Arquitetura Java RMI 31/05/2017 [email protected] 30 Sistemas Distribuídos Introdução a Sistemas Distribuídos Arquitetura Java RMI 31/05/2017 [email protected] 31 Sistemas Distribuídos Introdução a Sistemas Distribuídos Arquitetura Java RMI 31/05/2017 [email protected] 32 Sistemas Distribuídos Proxy Introdução a Sistemas Distribuídos A implementação RMI é um exemplo do padrão de projeto chamado Proxy; Proxy é uma solução para situações onde o objeto de interesse está inacessível diretamente, mas o cliente precisa operar em uma interface idêntica para ter acesso a esse objeto; A solução via Proxy: criar uma classe que tenha a mesma interface que o objeto de interesse e que implemente, em seus métodos, a lógica de comunicação com o objeto inacessível; Em RMI, o proxy é o Stub são gerados automaticamente pelo ambiente de desenvolvimento (rmic). 31/05/2017 [email protected] 33 Sistemas Distribuídos Proxy Introdução a Sistemas Distribuídos Stub Análogo ao RPC Stub é a representação local do objeto remoto localizado no cliente; É gerado automaticamente por meio do rmic Ex.: rmic Hello_Time Hello_Time_Stub.class 31/05/2017 [email protected] 34 Sistemas Distribuídos Stub Introdução a Sistemas Distribuídos Camada de referência remota (RRL): Responsável pela parte semântica da ativação remota; Uma chamada do Stub é repassada a essa camada que faz uso da camada de transporte; 31/05/2017 [email protected] 35 Sistemas Distribuídos Stub Introdução a Sistemas Distribuídos Camada de referência remota (RRL): Tratamento dos diferentes tipos de referência remota: Unicast: apenas um objeto Multicast: existe um conjunto de objetos e a RRL é quem faz as chamadas necessárias a todos eles por meio da camada de transporte. Implementa as estratégias para reconectar: Caso o objeto remoto torna-se inacessível. 31/05/2017 [email protected] 36 Sistemas Distribuídos Stub Introdução a Sistemas Distribuídos Camada de transporte: Trata da criação / manutenção das conexões; Efetua os envios / recebimentos de dados entre a máquina cliente e servidora; 31/05/2017 [email protected] 37 Sistemas Distribuídos Stub Introdução a Sistemas Distribuídos Camada de transporte: Padrão é utilizar sockets (java.net.Socket e ServerSocket) que são obtidos de uma fábrica (java.RMISocketFactory) através do métodos: CreateSocket; CreatServerSocket; Oferece também um mecanismo via HTTP para solucionar problemas com firewalls. 31/05/2017 [email protected] 38 Sistemas Distribuídos Stub Introdução a Sistemas Distribuídos O cliente, quando invoca remotamente um método, não conversa diretamente com o objeto remoto, mas com uma implementação da interface remota chamada stub, que é enviada ao cliente. O stub, por sua vez, passa a invocação para a camada de referência remota. 31/05/2017 [email protected] 39 Sistemas Distribuídos Execução no servidor Introdução a Sistemas Distribuídos O primeiro passo antes de executar o servidor é ativar uma espécie de servidor de nomes de servidores que atendem solicitações de métodos remotos. Isto é feito chamando-se o programa rmiregistry. Este programa pode estar ouvindo portas específicas, como por exemplo: % rmiregistry 2048 & e outras; Uma vez que este programa está executando, pode-se chamar o interpretador java para o arquivo servidor.class . 31/05/2017 [email protected] 40 Sistemas Distribuídos Esquema da chamada Introdução a Sistemas Distribuídos unip.br cliente lookup(.../Servidor) Servidor está aqui Registry Solicitação de stub Stub Stub sayHello() “Oi cliente” 31/05/2017 Servidor_Stub.class [email protected] Servidor..class 41 Sistemas Distribuídos Como usar RMI em 10 passos Introdução a Sistemas Distribuídos O objetivo deste módulo é oferecer apenas uma introdução básica a Java RMI. Isto será feito através de um exemplo simples: 1. Definir a interface 2. Implementar os objetos remotos 3. Implementar um servidor para os objetos 4. Compilar os objetos remotos 5. Gerar stubs com rmic 6. Escrever, compilar e instalar o(s) cliente(s) 7. Instalar o stub no(s) cliente(s) 8. Iniciar o RMI Registry no servidor 9. Iniciar o servidor de objetos 10. Iniciar os clientes informando o endereço do servidor. 31/05/2017 [email protected] 42 Sistemas Distribuídos Introdução a Sistemas Distribuídos São Paulo, 2011 Universidade Paulista (UNIP) Java – Remote Method Invocation (RMI) Prof. MSc. Vladimir Camelo [email protected] 31/05/2017 [email protected] 43