450 likes | 559 Views
São Paulo, 2011 Universidade Paulista (UNIP) Java – Remote Method Invocation (RMI) Prof. MSc . Vladimir Camelo vladimir.professor@gmail.com. Introdução. Sistemas distribuídos : Neste tipo de sistema existe uma necessidade de comunicação entre sistemas em máquinas distintas.
E N D
São Paulo, 2011 Universidade Paulista (UNIP) Java – RemoteMethodInvocation (RMI) Prof. MSc. Vladimir Camelo vladimir.professor@gmail.com vladimir.professor@gmail.com
Introdução • 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. vladimir.professor@gmail.com
Introdução • 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. vladimir.professor@gmail.com
Programação com sockets em Java • 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. vladimir.professor@gmail.com
Programação com sockets em Java • 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. vladimir.professor@gmail.com
Programação com sockets em Java • Existem três tipos de sockets: • Datagramsockets: Envia o pacote sem a confirmação de que o servidor recebeu; esta interface é implementada pelo protocolo UserDatagramProtocol (UDP). • Streamsockets: 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 TransferControlProtocol (TCP). vladimir.professor@gmail.com
Programação com sockets em Java • Existem três tipos de sockets: • Rawsockets: Envia o pacote sem utilizar as camadas de transporte, sendo utilizada a camada de rede Internet Protocol (IP) e no Internet ControlMessageProtocol (ICMP). vladimir.professor@gmail.com
Programação com sockets em Java • 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). vladimir.professor@gmail.com
Programação com sockets em Java (Exemplo) vladimir.professor@gmail.com
Programação com sockets em Java (Exemplo) vladimir.professor@gmail.com
Programação com sockets em Java (Exemplo) vladimir.professor@gmail.com
Programação com sockets em Java (Exemplo) vladimir.professor@gmail.com
Java para 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; vladimir.professor@gmail.com
Objetos remotos com Java RMI • Java RMI (RemoteMethodInvocation) 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). vladimir.professor@gmail.com
Objetos remotos com Java RMI • JRMP - Java RemoteMethodProtocol: • Pacote java.rmi- RMI básico; • Ideal para aplicações 100% Java. vladimir.professor@gmail.com
Objetos remotos com Java RMI • IIOP - Internet Inter-ORBProtocol: • Pacote javax.rmi- RMI sobre IIOP; • Ideal para ambientes heterogêneos. vladimir.professor@gmail.com
Objetos remotos com Java RMI • 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 vladimir.professor@gmail.com
Interface de programação Interface de comunicação em rede vladimir.professor@gmail.com
Java RemoteMethodInvocation • 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); vladimir.professor@gmail.com
Java RemoteMethodInvocation • 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. vladimir.professor@gmail.com
Java RemoteMethodInvocation • 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. vladimir.professor@gmail.com
Arquitetura Java RMI • 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 vladimir.professor@gmail.com
Arquitetura Java RMI vladimir.professor@gmail.com
Arquitetura Java RMI JVM “A” JVM “B” Gerados pelo desenvolvedor Aplicação Objeto remoto Skeleton Stub Gerados automaticamente Camada de referência remota Classes que Implementam o RMI (Java.rmi.*) Camada de transporte vladimir.professor@gmail.com
Arquitetura Java RMI vladimir.professor@gmail.com
Arquitetura Java RMI vladimir.professor@gmail.com
Arquitetura Java RMI vladimir.professor@gmail.com
Arquitetura Java RMI vladimir.professor@gmail.com
Arquitetura Java RMI vladimir.professor@gmail.com
Arquitetura Java RMI vladimir.professor@gmail.com
Arquitetura Java RMI vladimir.professor@gmail.com
Arquitetura Java RMI vladimir.professor@gmail.com
Proxy • 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). vladimir.professor@gmail.com
Proxy • Stub • Análogo ao RPC • Stub é a representação local do objeto remoto localizado no cliente; • É gerado automaticamente por meio do rmic • Ex.: rmicHello_Time Hello_Time_Stub.class vladimir.professor@gmail.com
Stub • 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; vladimir.professor@gmail.com
Stub • 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. vladimir.professor@gmail.com
Stub • 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; vladimir.professor@gmail.com
Stub • 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. vladimir.professor@gmail.com
Stub • 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. vladimir.professor@gmail.com
Execução no servidor • 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 . vladimir.professor@gmail.com
Esquema da chamada unip.br lookup(.../Servidor) cliente Registry Servidor está aqui Solicitação de stub Servidor_Stub.class Stub Stub sayHello() “Oi cliente” Servidor..class vladimir.professor@gmail.com
Como usar RMI em 10 passos • O objetivo deste módulo é oferecer apenas uma introdução básica a Java RMI. Isto será feito através de um exemplo simples: • Definir a interface • Implementar os objetos remotos • Implementar um servidor para os objetos • Compilar os objetos remotos • Gerar stubs com rmic • Escrever, compilar e instalar o(s) cliente(s) • Instalar o stub no(s) cliente(s) • Iniciar o RMI Registry no servidor • Iniciar o servidor de objetos • Iniciar os clientes informando o endereço do servidor. vladimir.professor@gmail.com
São Paulo, 2011 Universidade Paulista (UNIP) Java – RemoteMethodInvocation (RMI) Prof. MSc. Vladimir Camelo vladimir.professor@gmail.com vladimir.professor@gmail.com