Sistemas Distribuídos LICENCIATURA EM COMPUTAÇÃO Prof. Adriano Avelar Site: www.adrianoavelar.com Email: eam.avelar@gmail.com
Relembrando... Mecanismos de Comunicação Middleware
Cenário em uma rede Local (LAN)
RPC ( UNIX )
RPC ( UNIX ) - Interface
RPC ( UNIX ) - Servidor
RPC ( UNIX ) - Cliente
No mundo Java, temos o JAVARMI
Arquitetura Java RMI Host Cliente Host Servidor Interface do Objeto do Servidor Interface do Objeto do Servidor Programa Cliente Stub do Serviço (4) Comunicação Skeleton do Serviço Objeto do Serviço (1) Registro do Objeto do Serviço (3) Retorna o STUB do Objeto (2) Busca pelo Objeto Host do registro RMI RMI Registry
Arquitetura Java RMI Host Cliente IMensageiro.java Host Servidor IMensageiro.java MensageiroImpl.java Cliente.java Stub do Serviço (4) Comunicação Skeleton do Serviço Servidor.java (1) Registro do Objeto do Serviço (3) Retorna o STUB do Objeto (2) Busca pelo Objeto Host do registro RMI RMI Registry https://github.com/adrianoavelar/rmimessage
Interface do Serviço public interface IMensageiro extends Remote { public String docommunication(string name) throws RemoteException; }
Implementação da Interface public class MensageiroImpl extends RemoteException implements IMensageiro { public MensageiroImpl() { super(); } } public String docommunication(string name) throws RemoteException { return "\nservidor diz: Olá " + name+ "\n"; }
Servidor (Provedor do Serviço) public class Servidor { public Servidor() { try { IMensageiro m = new MensageiroImpl(); Naming.rebind("MensageiroServico", m); System.out.println("Mensageiro vinculado ao serviço de nome 'MensageiroServico' "); } catch (Exception e) { System.out.println("ERROR: "+e.getlocalizedmessage()); } } public static void main(string[] args) { new Servidor(); } }
Cliente (Consumidor do Serviço) public class Cliente { public Cliente(){ try { String uri = new String("rmi://" +"localhost"+"/"+"mensageiroservico"); IMensageiro m = (IMensageiro) Naming.lookup(uri); String name = JOptionPane.showInputDialog(null, "Digite seu nome:"); String respostadoservidor = m.docommunication(name); System.out.println(respostaDoServidor) } catch (Exception ex) { ex.printstacktrace(); } } public static void main(string[] args) { new Cliente(); } }
RMI x Sockets mais facilidade na construção da aplicação distribuída com RMI não dá para perceber, mas o socket é mais rápido duas novidades no RMI especificação da Interface (java) serviço de nome ( rmiregistry ) RMI usa socket, mas isto fica invisível (lembra da transparência?) ao programador
RMI x Sockets RMI usa TCP no RMI invoca-se explicitamente uma operação remota, no socket a operação remota ficou implícita no RMI precisa-se que o rmiregistry esteja funcionando no socket o host do servidor é informado ao cliente, no RMI o nome do serviço é informado ao cliente (transparência de localização)
Chegamos ao turbinado CORBA CORBA (Common Object Request Broker Architecture) CORBA é uma especificação as implementações do CORBA usam TCP JDK implementa o CORBA (Sun)
CORBA
Interface
Cliente
Cliente
CORBA Servidor
CORBA Servidor
RMI x CORBA ambos fornecem facilidades para construção da aplicação distribuída não dá para perceber, mas o RMI é mais rápido não dá para perceber, mas o CORBA é muito mais complexo RMI e CORBA usam socket, mas isto fica invisível (lembra da transparência?) ao programador
RMI x CORBA RMI e CORBA usam TCP não dá para perceber, mas no CORBA cliente e servidor podem ser construídos em linguagens diferentes (heterogeneidade) no RMI precisa-se que o rmiregistry estejam funcionando, no CORBA precisa-se que o serviço de nomes (orbd) esteja funcionando a interface no RMI é especificada em Java, a interface em CORBA é especificada em IDL
Trabalho (Em Dupla) Desenvolva uma calculadora usando JAVA RMI. A aplicação cliente deve perguntar a operação desejada ao usuário e os números que entrarão como argumento da operação. O código fonte deve ser enviado via e-mail (para: eam.avelar@gmail.com) Exemplo: https://github.com/adrianoavelar/rmimessage Data de entrega: Antes da prova I (26 de setembro)