INTRODUÇÃO ÀS PLATAFORMAS DISTRIBUÍDAS Introdução aos Sistemas Distribuídos Eleri Cardozo FEEC/UNICAMP http://www.fee.unicamp.br/~eleri Julho de 2002 (c) FEEC/UNICAMP 1 Um sistema distribuído é um sistema computacional com as seguintes propriedades: Sistemas Abertos são sistemas implementados segundo padrões abertos. 1. distribuição: um subconjunto de seus componentes encontram-se geograficamente dispersos; 2. concorrência: um subconjunto de seus componentes executam concorrentemente (em paralelo); 3. ausência de estado global: é impossível determinar-se precisamente o estado global do sistema; 4. falhas parciais: qualquer componente do sistema pode falhar independente dos demais; 5. assincronismo: as atividades do sistema não são regidas por um relógio global. Padrão aberto: documento estabelecido por consenso e publicado por organismo de padronização acreditado para uso comum e repetitivo. NOTA: esta definição exclui muitos padrões de-facto tais como Java, Windows e MATLAB. 3 Sistemas Abertos: Uma Classificação (c) FEEC/UNICAMP 4 Modelos de Referência Um modelo de referência é uma descrição de todos os possíveis componentes do sistema, bem como suas funções, relações, e formas de interação [SEI]. Exemplos: OSI, RM-ODP, OMA. Podemos classificar Sistemas Abertos em quatro categorias: 1. Modelos de Referência; 2. Arquiteturas de Referência; 3. Arquiteturas Abertas; 4. Implementações de Referência. (c) FEEC/UNICAMP 2 Sistemas Abertos Sistemas Distribuídos: Definição (c) FEEC/UNICAMP (c) FEEC/UNICAMP Por não imporem restrições para a realização de seus componentes, modelos de referência não garantem interoperabilidade entre diferentes implementações. Entretanto, modelos de referência são úteis para a concepção de arquiteturas para sistemas abertos. 5 (c) FEEC/UNICAMP 6 Arquiteturas de Referência Arquiteturas Uma arquitetura de referência é similar a um modelo de referência, mas prescreve interfaces entre seus componentes. Exemplos: TINA, CORBAservices. Uma arquitetura é similar a um modelo ou arquitetura de referência, mas prescreve protocolos de interoperabilidade para todos os seus componentes. Exemplos: CORBA, H.323, TCP/IP, ISDN. Arquiteturas de referência possuem lacunas na especificação que levam a diferentes interpretações e possibilidades de extensões. Estas lacunas tendem a comprometer a interoperabilidade entre diferentes implementações da arquitetura. (c) FEEC/UNICAMP Arquiteturas provêem interoperabilidade mínima entre suas implementações. 7 Implementações de Referência (c) FEEC/UNICAMP 8 Exemplo de Padrão Aberto: CORBA Objetos de Aplicação CORBA Facilities (vertical) CORBA Facilities (horizontal) Uma implementação de referência provê código fonte aberto (não necessariamente gratuito) para os componentes de uma arquitetura que são fundamentais para a interoperabilidade entre diferentes implementações desta arquitetura. Exemplos: FreeDCE, TMN API, HTTPd. O modelo de referência OMA. Implementações de referência garantem o maior nível possível de interoperabilidade para implementações de sistemas abertos. CORBA especifica o Object Request Broker do modelo OMA. Interoperabilidade entre implementações CORBA é garantida pela linguagem IDL e pelo protocolo IIOP. (c) FEEC/UNICAMP Object Request Broker (ORB) 9 (c) FEEC/UNICAMP 10 Sistemas Abertos: Conclusão Exemplo de Padrão Aberto: CORBA Sistemas abertos são fundamentais para: • IDL e IIOP garantem que duas implementações CORBA sempre irão interoperar no tocante a invocação remota de métodos. • tornar as implementações menos dependentes de fornecedor individual; • incentivar a competição entre diferentes fornecedores por melhores produtos; • desenvolver aplicações portáveis, confiáveis, com alto grau de interoperabilidade e capazes de evoluir de forma ordenada; • incentivar a inserção de novas tecnologias. • Serviços CORBA (CORBAservices) nem sempre interoperam pois apenas suas interfaces são especificadas (faltam implementações de referência e/ou melhor especificação de comportamento). • Gerência, configuração e recursos avançados de diferentes implementações CORBA não interoperam. (c) FEEC/UNICAMP Serviços CORBA (CORBAservices) 11 (c) FEEC/UNICAMP 12 O Conceito de Middleware Visão a Partir do Modelo OSI OPA! Isto eu conheço!!! O Conceito de Middleware APLICAÇÃO APRESENTAÇÃO SESSÃO TRANSPORTE REDE ENLACE FÍSICO (c) FEEC/UNICAMP 13 Agente Telecomunicações } Domínio de aplicação APRESENTAÇÃO SESSÃO SESSÃO TRANSPORTE Um novo Modelo OSI: camada nível 8 contendo funções típicas dos vários domínios de aplicação:Medicina, Finanças, Telecomunicações, etc. TRANSPORTE REDE REDE ENLACE ENLACE FÍSICO FÍSICO (c) FEEC/UNICAMP 15 (c) FEEC/UNICAMP 16 Conceito de Middleware e o Modelo OSI Conceito de Middleware e o Modelo OSI Domínio da aplicação Domínio da aplicação APLICAÇÃO Contexto da Aplicação SESSÃO TRANSPORTE REDE Gerenciamento de Rede APLICAÇÃO APRESENTAÇÃO ENLACE } Agente Ex: funções típicas de telecomunicações APLICAÇÃO APLICAÇÃO Cliente Finanças Medicina 14 Conceito de Middleware e o Modelo OSI Conceito de Middleware e o Modelo OSI APRESENTAÇÃO (c) FEEC/UNICAMP Contexto das Comunicações APRESENTAÇÃO A Camada de Transporte é um divisor entre o mundo das aplicações e o mundo das comunicações SESSÃO TRANSPORTE MIDDLEWARE REDE ENLACE FÍSICO FÍSICO (c) FEEC/UNICAMP 17 (c) FEEC/UNICAMP 18 Conceito de Middleware e o Modelo OSI Evolução em Middleware Domínio da aplicação agentes APLICAÇÃO componentes APRESENTAÇÃO objetos distribuídos chamada de procedimento remoto (RPC) Necessidade de Padronização do Middleware SESSÃO troca de mensagens } Sistema Operacional + Hardware Sistemas Heterogêneos! 1977 (c) FEEC/UNICAMP Evolução do Conceito de Middleware CPC-I 2007 20 tarefa 2 tarefa 1 Receive Socket Named Pipes API independente do transporte send(M1) send(M1) tarefa 2 tarefa 1 receive(M2) SNA 2002 (c) FEEC/UNICAMP Aplicação Send TLI 1997 1992 1987 Troca de Mensagens: Semântica Troca de Mensagens (primitivas SEND/RECEIVE) Aplicação 1982 19 TCP/IP IPX/SPX NetBIOS receive(M1) receive(M2) Pilhas de Transporte bloqueio NDIS ODI ... Token-ring Ethernet send(M2) Drivers de Rede Placas de Rede ISDN (c) FEEC/UNICAMP 21 (c) FEEC/UNICAMP 22 Evolução do Conceito de Middleware Troca de Mensagens: Implementação Chamada Remota de Procedimento (RPC) Aplicação Aplicação 2- Call (…) 1- Register (…) 3- Call (…) Remote Procedure Call (RPC) espaço do usuário TLI espaço do núcleo CPC-I Socket Named Pipes port (endpoint) API (socket) buffer sistema de transporte (TCP/IP) API (socket) SNA sistema de transporte (TCP/IP) TCP/IP IPX/SPX NDIS NetBIOS ODI LAN / WAN Token-ring (c) FEEC/UNICAMP 23 Ethernet (c) FEEC/UNICAMP ISDN 24 RPC: Implementação RPC: Semântica cliente servidor cliente servidor R = call P2(a1,a2) cliente call P2(a1,a2) servidor call P2(a1,a2) 1 4 5 dispatcher empacota desempacota parâmetros resultado P2 executa P2 P3 P2 P2(a1,a2) bloqueio P1 retorno 8 P1 P3 2 retorno desempacota parâmetros 3 7 a2 API (socket) (c) FEEC/UNICAMP 25 Evolução do Conceito de Middleware empacota resultado bibliotecas RPC 6 a1 P2 resultado API (socket) (c) FEEC/UNICAMP 26 Objetos: Constituição Objetos Distribuídos • O conceito de objetos surgiu para atender os requisitos estado: define um conjunto de variáveis internas que armazenam o estado corrente do objeto relacionados ao aumento na complexidade do desenvolvimento de software Reusabilidade Objeto interface: define, em termos de protótipo, um conjunto de operações (ou métodos) implementação: código dos métodos definidos tanto pelas interfaces quantos internos ao objeto Barramento de Software Interface Padrão (c) FEEC/UNICAMP 27 Objetos: Regras de Interação (c) FEEC/UNICAMP Objetos: Conceitos Básicos • toda a interação com um objeto se dá através da invocação de seus métodos declarados como públicos; Classificação: objetos são organizados em classes. Uma classe define o comportamento dos objetos dela derivados. • métodos declarados como privados só podem ser invocados pelos demais métodos definidos pelo objeto; Relacionamento: classes podem apresentar relações de interdependência, por exemplo • herança (relação tipo é-um/é-uma); • composição (relação tipo parte-de); • colaboração (relações tipo usa, delega, autoriza, etc). • as variáveis de estado são manipuladas apenas pelos métodos (públicos ou privados) definidos pelo objeto (isto é, são invisíveis externamente ao objeto). (c) FEEC/UNICAMP 28 29 (c) FEEC/UNICAMP 30 Objetos: Conceitos Básicos Objetos: Conceitos Básicos classe Instanciação: objetos são criados através de uma operação (denominada de instanciação) sobre uma classe. Encapsulamento: objetos “escondem” detalhes de sua implementação interna, expondo apenas suas interfaces para o meio externo. encapsulamento classe relação herança (especialização) instanciação estado classe Identidade: objetos possuem identidade única capaz de diferenciar um objeto dos demais. métodos (c) FEEC/UNICAMP M3 M1 interface invocação de métodos identidade Polimorfismo: métodos de mesmo nome podem apresentar diferentes comportamentos, dependendo do objeto que o implementa. M2 polimorfismo 31 Objetos Distribuídos M2 (c) FEEC/UNICAMP Objetos Distribuídos: Vantagens Deve-se notar que as tecnologias de middleware procuram acompanhar as tecnologias de desenvolvimento de software: Objetos distribuídos apresentam as seguintes vantagens sobre troca de mensagens e RPC: • troca de mensagens: estende o paradigma de programação não estruturada à programação de sistemas distribuídos (programação distribuída); • flexibilidade: qualquer entidade de software pode ser transformada em um objeto distribuído; • granularidade: objetos distribuídos podem apresentar diferentes níveis de granularidade; • confiabilidade: objetos distribuídos são entidades autocontidas o que facilita a identificação, isolação e correção de falhas; • custo: o desenvolvimento de objetos distribuídos é mais econômico graças ao reuso de software propiciado pela programação orientada a objetos. • RPC: estende o paradigma de programação estruturada à programação distribuída; • objetos distribuídos: estende o paradigma de programação orientada a objetos à programação distribuída. (c) FEEC/UNICAMP 33 Objetos Distribuídos: Interação (c) FEEC/UNICAMP 34 Interfaces Remotas Objetos distribuídos são capazes de interagir através de uma rede de comunicação (LAN, Intranet, Internet) de forma semelhante à interação entre objetos locais. Para tanto, padrões são necessários para prover: • definição de interfaces remotas; • identificação de objetos (referências); • "nomeação" de objetos (naming); • associação nome-referência (binding); • suporte à invocação remota de métodos (RPC). Objetos distribuídos devem definir pelo menos uma interface remota capaz de processar invocações através da rede. Em padrões neutros (independentes de linguagem de programação) como CORBA e DCOM, uma linguagem de definição de interface (IDL) é especificada. ORBs provêem compiladores IDL para cada linguagem alvo. Estes padrões são oferecidos por uma infra-estrutura denominada ORB (Object Request Broker). Por exemplo, RMI é o ORB nativo da linguagem Java. Um servant (ou implementação) é um objeto que implementa uma interface remota (i.e., supre código para os métodos da interface). Um objeto distribuído é constituído por um ou mais servants. (c) FEEC/UNICAMP 32 RMI, por ser uma solução puramente Java, utiliza interfaces Java derivadas da interface Remote para definir interfaces remotas. 35 (c) FEEC/UNICAMP 36 Referência de Objetos Objetos Distribuídos: Implementação Objetos distribuídos devem possuir uma identificação (referência) capaz de localizá-lo na rede. Esta identificação é dependente do ORB. Por exemplo, CORBA utiliza um identificador denominado IOR (Interoperable Object Reference) que agrega o endereço de rede do objeto (host e port do servidor), sua classe, seu identificador no servidor, etc. IOR é armazenado em uma cadeia de bytes. ORB (biblioteca) Descrição da(s) Interface(s) Compilador (C++, Java, ...) Compilador de Interfaces RMI utiliza as próprias instâncias das classes Java que implementam interfaces remotas para identificar objetos distribuídos. Implementação dos Servants (C++, Java, ...) Stubs / Skeletons OBS: Uma referência pode ser persistente ou transiente. servant (c) FEEC/UNICAMP 37 Stubs e Skeletons ORBs convencionam esquemas de nomes para os objetos distribuídos. Por exemplo, CORBA utiliza um espaço hierárquico e arbitrário de nomes definido em um contexto. RMI utiliza uma notação padrão URL: rmi://ferrugem.dca.fee.unicamp.br:8088/Servers/AccountServer //143.106.50.188/AccountServer interface remota cliente Stub invocação local M1 M2 M3 Rede protocolo de RPC Skeleton upcall M1 M1 M2 M3 objeto distribuído (c) FEEC/UNICAMP 39 Binding cliente servidor de nomes 3. invoke (c) FEEC/UNICAMP (c) FEEC/UNICAMP 40 Invocação Remota de Métodos ORBs provêem serviços de nomes para armazenar e recuperar associações nome-referência de objeto. No caso do RMI, um servidor de nomes denominado rmiregistry é fornecido com a plataforma Java. 2. lookup 38 Atribuição de Nomes Para interagir com um objeto remoto, um objeto cliente deve obter a referência do objeto remoto e converte-la em um objeto local denomindo proxy ou stub. Stubs definem os mesmos métodos da interface remota do objeto. Ao invocar um método no stub, o stub encaminha a requisição para o objeto remoto, recebe o retorno e o devolve como resultado da interação. Skeletons fazem o papel inverso do stub no lado do objeto remoto. M1 (c) FEEC/UNICAMP A invocação de métodos remotos exige protocolos de RPC (Remote Procedure Call). Tais protocolos especificam: • como parâmetros são codificados (número de parâmetros, tipos, valores e indireções); • como invocações e retornos são estruturados; • que protocolo de transporte é utilizado (TCP ou UDP); • como exceções são propagadas de volta para o cliente. 1. bind/rebind CORBA especifica o protocolo IIOP (Internet Inter-ORB Protocol), enquanto RMI especifica JRMP (Java Remote Method Protocol). Opcionalmente, para fins de interoperabilidade com CORBA, RMI pode utilizar IIOP. objeto distribuído 41 (c) FEEC/UNICAMP 42 Arquitetura de Distribuição Middleware: Padrões servidor cliente servant Indústria objeto distribuído Consórcios Stub Skeleton Object Request Broker Serviços Nomes Eventos Segurança (c) FEEC/UNICAMP 43 DCOM (Microsoft) RMI (SUN) DCE (OSF) EJB (Sun) CORBA (OMG) .NET (Microsoft) SOAP (W3C) OSI ODP ISO/ITU-T TCP/IP sockets WWW Internet 1977 1982 RPC 1987 1992 1997 2002 (c) FEEC/UNICAMP 44 Plataforma Java 2 A Plataforma Java 2 consiste de uma linguagem (Java), um ambiente de runtime (máquina virtual) e um conjunto de serviços de middleware disponibilizados através de interfaces de programação (APIs). Plataforma Java Linguagem Java Máquina Virtual APIs (c) FEEC/UNICAMP 45 Plataforma Java 2: Arquitetura Classes Java Estendidas Classes Java Básicas Máquina Virtual Java A SUN Microsystems fornece três tipos de plataformas Java 2: Suporte às Aplicações • Java 2 Platform, Micro Edition (J2ME): plataforma de desenvolvimento para dispositivos pequenos, tais como Palm Pilots, Pagers, etc. Contém uma forma bem restrita da linguagem Java; Plataforma Java Básica • Java 2 Platform, Standard Edition (J2SE): contém serviços Java bytecodes para Applets e Aplicações. Contém funcionalidades para entradasaída, interfaces gráficas de usuários, entre outras; Interface de Portabilidade Adaptador Browser Adaptador • Java 2 Platform, Enterprise Edition (J2EE): plataforma de S.O. Java desenvolvimento completa para empresa fornecendo um ambiente seguro, multi-usuário, portável, neutro (Sistema Operacional e Hardware) para o desenvolvimento de aplicações distribuídas escritas em Java (com ënfase no lado servidor). S.O. S.O. Hardware Hardware (c) FEEC/UNICAMP 46 Plataformas Java 2 APIs Applets, Pacotes, Frameworks (c) FEEC/UNICAMP Java Chip 47 (c) FEEC/UNICAMP 48 Plataforma Java 2EE: Tecnologias Plataforma Java 2EE: Tecnologias • Enterprise JavaBeans (EJB) • JNDI (Java Naming and Directory Interface) Define uma API que facilita a criação, instalação e gerência de aplicações baseadas em componentes. Utiliza RMI para comunicação cliente-servidor. Provê acesso unificado a serviços de nomes e de diretório para as aplicações Java. service providers Servidor EJB OMG COSNaming EJB Home Interface JNDI SPI JNDI API Container EJB RMI Registry EJB Bean JNDI Naming Manager Cliente Cliente EJB Remote Interface Internet LDAP Database Novell NDS (c) FEEC/UNICAMP 49 Plataforma Java 2EE: Tecnologias Plataforma Java 2EE: Tecnologias Provê uma interface uniforme para acesso a bases de dados. JDBC Driver API 50 • JTA (Java Transaction API) e JTS (Java Transaction Service) • JBDC (Java Database Connectivity) JDBC API (c) FEEC/UNICAMP JDBC Driver A Definem APIs para um serviço de transação em Java (baseados no Serviço de Transações do OMG - CORBA OTS). JTA é utilizada no EJB. Database A Transaction Coordinator JTS API JTA API JDBC Cliente JDBC Driver B Database B JDBC Driver C Database C Transaction Manager(s) JTS Cliente Resource Manager(s) Datastores (c) FEEC/UNICAMP 51 Plataforma Java 2EE: Tecnologias • RMI-IIOP (Java Remote Method Invocation CORBA Internet Inter-ORB Protocol) Permite aplicações Java interoperarem com outras plataformas CORBA (ex. Orbix). Prove compilador IDL e ORB simples que suporta IIOP. Cliente CORBA (C++) Servidor EJB Permite clientes Java acessarem, via RMI, serviços disponibilizados em CORBA (e vice-versa). RMI-IIOP utiliza JNDI. Servidor CORBA (C++) Cliente RMI Cliente CORBA Servidor RMI Servidor CORBA RMI-IIOP API IIOP Orbix Java 2 ORB 52 Plataforma Java 2EE: Tecnologias • Java IDL (Interface Definition Language) Applet Java (c) FEEC/UNICAMP RMI ORB CORBA ORB IIOP (c) FEEC/UNICAMP 53 (c) FEEC/UNICAMP 54 Plataforma Java 2EE: API Específicas, Extensões, Pacotes e Produtos Plataforma Java 2EE: Tecnologias • Outras Tecnologias: Java Media Framework (JMF): API para manipulação (local e através da rede) de áudio e vídeo; Java TV API: API para serviços interativos em TV digital (ex: vídeo sob demanda); Java Phone API: API para serviços de telefonia (ex: click-to-dial); Java Commerce Toolkit: pacote para desenvolvimento de aplicações de comércio eletrönico; Java Cryptography Extension e Java Authentication and Authorization Service: extensões de segurança; Java 2D, Java 3D, Java Advanced Imaging: APIs para computação gráfica; Jini: serviços de suporte à redes com topologia variável; .......... Dentre muitos outros !!! Java Server Pages (JPS) e Servlets: APIs que permitem estender as funcionalidades de um servidor WWW; Java Message Service (JMS): API para serviços de mensagens; JavaMail: API para serviços de E-mail; J2EE Connector: arquitetura para conectar a plataforma Java 2 com outros serviços de informação da empresa. (c) FEEC/UNICAMP 55 (c) FEEC/UNICAMP Java Remote Method Invocation (RMI) 56 RMI: Visão Geral Naming.lookup rmi://host:port/Name RMI é um ORB nativo da linguagem Java que provê uma infra-estrutura para invocação de métodos remotos, um compilador para geração de stubs e skeletons (rmic) e um servidor de nomes (rmiregistry). RMI utiliza o mecanismo de segurança nativo da linguagem Java através de security managers e class loaders. cliente RMI host rmiregistry Naming.bind rmi://host:port/Name ObjRef ObjRef Naming s.M1(...) servidor RMI Naming RMI tem como vantagens simplicidade e plena integração com Java (segurança, carregamento dinâmico de classes, passagem de objetos por valor, etc.). Entretanto, é uma solução 100% Java (mas capaz de interoperar com outras linguagens de programação através de CORBA). rmic M1 M2 M3 stub Servant M1 JRMP TCP/IP M2 M3 skel. socket socket IIOP (c) FEEC/UNICAMP 57 Java RMI 58 RMI: Interfaces Remotas Interfaces remotas em RMI são declaradas como interfaces Java que estendem a interface Remote. Cada método da interface remota deve lançar uma exceção do tipo RemoteException (que será propagada ao cliente). O ciclo de desenvolvimento de objetos distribuídos em RMI possui os seguintes passos: 1. definição da interface remota; 2. compilação da interface remota (javac); 3. desenvolvimento do servant; 4. geração de stubs e skeletons a partir do servant via compilador RMI (rmic); 5. desenvolvimento do servidor. (c) FEEC/UNICAMP TCP/IP (c) FEEC/UNICAMP import java.rmi.Remote; import java.rmi.RemoteException; public interface Account extends Remote { void deposit( long amount ) throws RemoteException; void withdraw( long amount ) throws RemoteException; long balance() throws RemoteException; } 59 (c) FEEC/UNICAMP 60 RMI: Passagem de Parâmetros em Métodos de Interfaces Remotas RMI: Servants import java.rmi.*; import java.rmi.server.*; Parâmetros e retornos em invocações remotas são sempre passados por valor (isto e, uma cópia é passada). Objetos Java passado como parâmetros devem ser "serializáveis" (todos os tipos nativos são). public class AccountServant implements Account { long balance; long limit; Referências de objetos remotos podem ser passados como parâmetros ou retorno (no caso, uma cópia de seu stub é passada). Tais objetos devem possuir apenas interfaces remotas. public AccountServant(long lim) throws RemoteException { super(); balance = 0; limit = lim; } Caso a classe de um objeto passado ou retornado não se encontra presente na JVM, a mesma pode ser carregada dinamicamente via HTTP (detalhes a seguir). (c) FEEC/UNICAMP 61 (c) FEEC/UNICAMP RMI: Servants (cont.) RMI: Classes <<interface>> Remote public void deposit( long amount ) throws RemoteException { balance = balance + amount; } AccountServant_Stub extends <<interface>> Account deposit() withdraw() balance() deposit() withdraw() balance() geradas por rmic AccountServant_Skel deposit() withdraw() balance() public long balance() throws RemoteException { return balance; } } 63 RMI: rmic (Compilador RMI) implements deposit() withdraw() balance() (c) FEEC/UNICAMP 64 RMI: Serviço de Nomes A plataforma Java provê um compilador capaz de gerar stubs e skeletons para suporte à distribuição de objetos com RMI. O compilador recebe como argumento a classe compilada do servant e gera dois arquivos compilados: um contendo o stub (utilizado pelo cliente) e outro o skeleton (utilizado pelo servidor). Exemplo: C:\ dir *.class Account.class AccountServant.class C:\ rmic AccountServant C:\ dir *.class Account.class AccountServant.class AccountServant_Stub.class AccountServant_Skel.class (c) FEEC/UNICAMP AccountClient AccountServant public void withdraw( long amount ) throws RemoteException { if((limit + balance - amount) < 0) throw new RemoteException("Limit Exceeded"); balance = balance - amount; } (c) FEEC/UNICAMP 62 A plataforma Java provê um serviço de nomes para registro de servants RMI. O serviço de nomes é suportado por um servidor transiente, rmiregistry, que armazena as referências de objetos localizados em seu próprio nó. A referência de objeto no formato URL estipula o seu endereço de host e, opcionalmente, port do servidor de nomes. Exemplo: seja um objeto registrado como: rmi://ferrugem.dca.fee.unicamp.br/Servers/AccountServer O acesso à referência do objeto deve se dar no endereço de host "ferrugem.dca.fee.unicamp.br" e port default do servidor de nomes (1099). 65 (c) FEEC/UNICAMP 66 RMI: A Classe Naming RMI: Servidores O servidor de nomes rmiregistry é acessível através da classe Naming que provê os seguintes métodos estáticos: import java.rmi.*; import java.rmi.server.*; import java.net.*; • void bind(String name, Remote ref): associa um nome a uma referência de objeto; • void rebind(String name, Remote ref): re-associa um nome a uma referência de objeto; • Remote loopkup(String name): busca uma referência associada ao nome; • void unbind(String name): desassocia a referência do nome; • String[] list(String registry): lista todos os nomes mantidos por um servidor rmiregistry. (c) FEEC/UNICAMP public class AccountServer { public static void main(String[] args) { // if no security manager was set, set the RMI´s one if(System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } 67 (c) FEEC/UNICAMP RMI: Servidores (cont.) 68 RMI: Clientes import java.rmi.*; import java.net.*; try { String host = (InetAddress.getLocalHost()).getCanonicalHostName(); String name = "rmi://" + host + "/Account"; Account objRef = new AccountServant((long)1000); Naming.rebind(name, objRef); // bind System.out.println("AccountServant registered"); } catch (Exception e) { System.err.println("AccountServant exception: " + e.getMessage()); e.printStackTrace(); } } (c) FEEC/UNICAMP public class AccountClient { public static void main(String args[]) { if(args.length != 1) { System.out.println("I need the server's host name as argument"); System.exit(0);} // if no security manager was set, set the RMI´s one if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager());} try { // get reference of the remote object String host = (InetAddress.getByName(args[0])).getCanonicalHostName(); String name = "rmi://" + host + "/Account"; Account accountRef = (Account) Naming.lookup(name); 69 RMI: Clientes (cont.) 70 RMI: Aspectos de Segurança No lado servidor, RMI exige que todas as permissões de socket sejam habilitadas para os domínios onde os clientes se localizam. Adicionalmente, permissão para conexão local ao port 1099 (rmiregistry) deve ser habilitada. Por exemplo, o trecho do arquivo .java.policy abaixo libera interações com clientes localizados em qualquer host do domínio "dca.fee.unicamp.br" accountRef.deposit( 100 ); accountRef.deposit( 300 ); accountRef.deposit( 100 ); accountRef.withdraw( 240 ); accountRef.withdraw( 10 ); System.out.println("Balance is " + accountRef.balance()); accountRef.withdraw( 10000 ); } catch (Exception e) { System.err.println("AccountClient exception: " + e.getMessage()); } } grant { permission java.net.SocketPermission "*.dca.fee.unicamp.br", "listen,accept,connect"; permission java.net.SocketPermission "localhost:1099", "connect"; }; } (c) FEEC/UNICAMP (c) FEEC/UNICAMP 71 (c) FEEC/UNICAMP 72 RMI Sobre HTTP RMI: Propriedades Devido a presença de firewalls, uma requisição RMI pode ser impedida de atingir o objeto remoto. Nestes casos, é possível tunelar-se a requisição RMI sobre o protocolo HTTP. cliente RMI O comportamento de clientes e servidores RMI pode ser configurado através de propriedades da máquina virtual. As mais comuns são: • java.rmi.server.codebase: localização (URL) das classes que devem ser carregadas dinamicamente (skeletons, parâmetros, etc.); • java.rmi.server.logCalls: gera um log em System.err; • java.rmi.activation.port: define um port de ativação para o daemom RMI (default 1098); • java.rmi.server.disableHttp: desabilita tunelamento através de HTTP. Serv. HTTP Firewall HTTP POST Stub proxy HTTP script CGI (java-rmi.cgi) servidor RMI Skeleton sockets especiais (c) FEEC/UNICAMP 73 (c) FEEC/UNICAMP 74 Modelo OSI O Modelo OSI possui algumas funcionalidades na camada 7 para o desenvolvimento de sistemas distribuídos: ODP (Open Distributed Processing) • ROSE (Remote Operation Service Element); • CCR (Concurrency, Commitment, Recovery); • TP (Transaction Processing); • DS (Directory Service); • MHS (Message Handling System). (c) FEEC/UNICAMP 75 Modelo OSI (c) FEEC/UNICAMP ODP: Open Distributed Processing Problemas no desenvolvimento de Sistemas Distribuídos diretamente sobre o OSI: Padrão OSI/ITU-T para processamento distribuído aberto (ITU-T X.901,902,903,904). • baixa disponibilidade de implementações completas; • padrão “estacionado”; • ausência de serviços importantes (segurança, principalmente); • ASN.1/BER pouco flexível; • eficiência dos protocolos. É um modelo de referência apenas (protocolos não são especificados) que vem influenciando outras atividades de padronização (exemplo: CORBA). (c) FEEC/UNICAMP 76 Seu desenvolvimento foi fortemente influenciado pelo projeto ANSA (Universidade de Lancaster, UK). 77 (c) FEEC/UNICAMP 78 ODP: Pontos de Vista ODP: Pontos de Vista Empresa Pontos de vista não são hierarquizados, mas sim diferentes visões de um mesmo sistema. Informação Computação especificação SD SD implementação ponto de vista Engenharia Tecnologia (c) FEEC/UNICAMP 79 especificação ODP: Pontos de Vista 80 ODP: Ponto de Vista de Empresa O ponto de vista de empresa modela o sistema em termos de grandezas relevantes para a organização onde o sistema será empregado. Empresa Em linhas gerais, pode ser considerada um “resumo executivo” do sistema, onde suas principais características são levantadas. SD Informação implementação (c) FEEC/UNICAMP ORB Engenharia Computação Este ponto de vista estabelece as principais restrições impostas ao projeto do sistema. Não existe uma linguagem formal para descrever o sistema neste ponto de vista. Textos, gráficos, diagramas, esquemas podem ser livremente utilizados. Tecnologia (c) FEEC/UNICAMP 81 (c) FEEC/UNICAMP ODP: Ponto de Vista de Empresa ODP: Ponto de Vista de Informação Grandezas relevantes para este ponto de vista: O ponto de vista de informação tem por objetivo modelar o sistema enfocando a informação produzida e consumida pelo sistema. • requisitos (QoS, custos, ...); • objetivos (mercados, público-alvo, …); • benefícios (lucro, produtividade, …); • políticas (segurança, acesso, taxação, ...); • domínios administrativos/federações; • restrições/privilégios de uso do sistema; • pontos de referência (protocolos, acordos, ...); • funcionalidades (agentes, relações, contratos, ...). (c) FEEC/UNICAMP 82 Neste ponto de vista são levantados os principais componentes manipuladores de informação, componentes estes denominados objetos de informação. 83 (c) FEEC/UNICAMP 84 ODP: Ponto de Vista de Informação ODP: Ponto de Vista de Computação Objetos de informação identificam as principais entidades do domínio, suas relações (especialização, decomposição, etc.) e principais variáveis e operações. O ponto de vista de computação modela o sistema em termos de entidades de processamento de informação. Estas entidades, denominadas objetos computacionais, são os blocos fundamentais a partir dos quais o sistema distribuído é contruido. Este ponto de vista pode ser descrito através de notação gráfica introduzidas por metodologias de desenvolvimento orientado a objeto (UML, principalmente). Este ponto de vista pode ser descrito através de notação gráfica introduzidas por metodologias de desenvolvimento orientado a objeto (UML, principalmente). (c) FEEC/UNICAMP 85 (c) FEEC/UNICAMP ODP: Ponto de Vista de Computação ODP: Interfaces Computacionais No ODP, objetos computacionais básicos (BCO: basic computacional object) possuem múltiplas interfaces computacionais, cada uma associada a determinado tipo. O tipo define as características da interface. iniciador respondedor sinal sinal cliente servidor evocação operação interface computacional terminação BCO produtor T2 T1 86 tipo da interface (c) FEEC/UNICAMP stream 87 consumidor fluxo (c) FEEC/UNICAMP 88 ODP: Ligação (Binding) Primitiva ODP: Ligação (Binding) Composta Na ligação primitiva dois objetos computacionais básicos têm suas interfaces conectadas sem o auxílio de um artefato específico de interconexão. Exemplo: objetos C++ num mesmo programa. Na ligação composta dois objetos computacionais básicos têm suas interfaces conectadas com o auxílio de um artefato específico de interconexão. Na visão de computação este artefato é representado por um objeto de ligação (BO: binding object). Exemplo: ligação tipo publicador-consumidor. T T’ interface de controle BCO BCO T’: tipo complementar a T T (c) FEEC/UNICAMP 89 BCO BO BCO T T’ (c) FEEC/UNICAMP T’ 90 ODP: Ponto de Vista de Engenharia ODP: Ponto de Vista de Engenharia Objetos Básicos de Engenharia (BEO) O ponto de vista de engenharia fornece a visão “espacial” (distribuída) do sistema. Nesta visão os objetos computacionais (BCO e BO) da visão de computação são realizados através de objetos básicos de engenharia (BEO: Basic Engineering Object). Regras de estruturação que estabelecem agrupamentos e ligações entre BEOs. Este ponto de vista pode ser descrito através de diagramas UML de colaboração, de sequência, de atividade de distribuição, etc. (c) FEEC/UNICAMP checkpoint, recover, delete, ... São as unidades de processamento no ponto de vista de engenharia. Possuem uma interface de gerenciamento e uma ou mais interfaces de serviço, interfaces estas denominadas interfaces de engenharia. 91 interface de gerenciamento BEO interface de engenharia (c) FEEC/UNICAMP ODP: Regras de Estruturação 92 ODP: Regras de Estruturação Cluster checkpoint, recover, delete, ... Cápsula checkpoint, recover, delete, ... Cluster é um agregado de BEOs compartilhando um mesmo espaço de endereçamento. Um BEO especial no cluster (Gerente de Cluster - GCL) provê uma interface de gerenciamento para o cluster. É a unidade de migração do ODP (exemplo: pacote Java, agente móvel). Cápsula é um agregado de clusters. Um BEO especial na cápsula (Gerente de Cápsula) provê uma interface de gerenciamento para a cápsula. É a unidade de alocação de recursos do ODP (exemplo: processo UNIX). GCL BEO GCP GCL GCL CLUSTER CLUSTER CÁPSULA CLUSTER (c) FEEC/UNICAMP 93 (c) FEEC/UNICAMP ODP: Regras de Estruturação ODP: Regras de Estruturação Canal Nó Um nó é composto de um conjunto de cápsulas e um núcleo. No ODP o nó representa uma unidade de processamento, armazenamento e comunicação. Exemplo: computador conectado à rede. Canal é a realização do objeto de ligação na visão de engenharia. É composto de três objetos básicos de engenharia de cada lado: stub, binder e protocol adapter. Adicionalmente, um controlador de canal expõe uma interface única de controle para o canal. CÁPSULA núcleo NÓ (c) FEEC/UNICAMP 94 CÁPSULA 95 BEO2 BEO1 interface de controle stub stub contr. de canal binders protocol adapters canal rede (c) FEEC/UNICAMP 96 ODP: Canal ODP: Canal Stub Binder Stub é responsável pelos serviços de apresentação (conversão/compactação de dados, criptografia, etc) do canal. Binder é responsável pelo gerenciamento fim-afim do canal. Funções típicas do binder: monitoramento do fluxo de informação através do canal, gerência de qualidade de serviço e destruição de seu extremo do canal. Apresenta uma interface de dados para o objeto de engenharia no extremo do canal e uma interface de controle utilizada pelo controlador de canal. (c) FEEC/UNICAMP Possui interfaces de dados para o stub e protocol adapter, além de uma interface de controle utilizadada pelo controlador de canal. 97 (c) FEEC/UNICAMP ODP: Canal 98 ODP: Canal Protocol Adapter Controlador de Canal Protocol Adapter é responsável pela comunicação fim-a-fim no canal. Funções típicas: estabelecimento e encerramento de conexões de transporte através da rede. Controlador de canal apresenta uma interface única de controle para o canal. Esta interface realiza na visão de engenharia a interface computacional do objeto de ligação (BO) presente na visão de computação. Apresenta uma interface de dados para o binder e uma interface de controle utilizada pelo controlador de canal. (c) FEEC/UNICAMP Controlador de canal interage com os demais objetos do canal para realizar a ação de controle solicitada em sua interface. 99 ODP: Canal (exemplo) cliente (c) FEEC/UNICAMP 100 ODP: Mapeamento Computação/Engenharia BEO2 BEO1 BCO1 servant stub stub Stub STUB Skeleton RMI BINDER RMI ADAP. PROTOCOLO TCP/IP TCP/IP contr. de canal BO binders protocol adapters BCO2 canal transparência (c) FEEC/UNICAMP 101 (c) FEEC/UNICAMP rede 102 ODP: Transparência ODP: Transparência Tipos de transparência: Transparência é um conceito chave que permite a visão de engenharia (associada à implementação do sistema) se aproximar da visão de computação (associada ao modelamento do sistema). • acesso; • localização; • migração; • concorrência (transação); • relocação; • falha; • replicação; • persistência. Transparência deve ser provida pelo núcleo, canal e demais infra-estruturas de suporte à implementação (ORBs, repositórios, etc.). As transparências de acesso e localização são as mais comumente encontradas nos sistemas distribuídos. (c) FEEC/UNICAMP 103 (c) FEEC/UNICAMP 104 Object Management Group (OMG) CORBA (Common Object Request Broker Architecture) (c) FEEC/UNICAMP O OMG foi fundado em 1989 por 11 empresas (dentre elas 3Com, HP, Data General, Unisys, Sun e Philips) como uma empresa sem fins lucrativos. Hoje possui 800 membros, dentre eles todos os “peso-pesados” das indústrias de informática e de telecomunicações. 105 OMG: Missão (c) FEEC/UNICAMP 106 OMG: Estrutura O OMG é estruturado em três comitês: A missão do OMG é prover a indústria com especificações detalhadas na área de gerência de objetos distribuídos visando estabelecer uma base comum para o desenvolvimento de aplicações. Estas especificações incluem: uma arquitetura de referência (OMA) e sua implementação (CORBA); uma linguagem de especificação (IDL); protocolos de interoperabilidade (GIOP, IIOP); aplicações específicas (TMN, IN, etc.). (c) FEEC/UNICAMP 1. Platform Technology Committee (PTC); 2. Domain Technology Committee (DTC); 3. Architecture Board. Cada comitê é subdividido em Task Forces, Special Interest Groups (SIGs) e Working Groups (WGs). 107 (c) FEEC/UNICAMP 108 OMG: Processo de Padronização OMG: Padrões Alternativos As principais tecnologias que competem com as padronizadas pelo OMG são: Membros do OMG possuem um dos três níveis de influência: • voto no nível de Task Forces (universidades, governos, pequenas empresas); • voto no nível de Platform TC, Domain TC ou ambos (grandes usuários de tecnologia); • submissão de padrões para adoção nos TCs (gigantes da informática e telecomunicações). • Microsoft DCOM (Distributed Component Object Model). Problema: uma empresa, uma tecnologia (Windows). • Sun Java (linguagem, APIs, toolkits, frameworks, etc.). Problema: uma linguagem de programação. • W3C (WWW Consortium): introdução de objetos na Web (XML, HTTP, SOAP, etc.). Problema: soluções centradas na Web. (c) FEEC/UNICAMP 109 (c) FEEC/UNICAMP A Arquitetura OMA OMA: Componentes OMA (Object Management Architecture) é uma arquitetura de referência para gerência de objetos distribuídos. A arquitetura identifica componentes, interfaces e protocolos necessários para o desenvolvimento de sistemas de software interoperáveis entre os principais sistemas de hardware, sistemas operacionais e linguagens de programação. (c) FEEC/UNICAMP OMA possui um componente central, o Object Request Broker (ORB), e 4 categorias de interfaces: • Serviços de Objetos (Object Services); Facilidades Comuns (Common Facilities); • Interfaces Específicas do Domínio (Domain Interfaces); • Interfaces Específicas da Aplicação (Application Interfaces). • 111 OMA: Componentes Application Interfaces Domain Interfaces (c) FEEC/UNICAMP 112 OMA: Object Request Broker O Object Request Broker (ORB) é um facilitador de comunicação entre objetos distribuídos. Funções típicas desempenhadas pelo ORB: Common Facilities • transparência de comunicação (localização, conversão de dados, referência de objetos, etc.); • gerência da execução de objetos servidores; • manutenção de repositórios de servidores e suas interfaces; • gerência de tipos específicos de dados (Any, NVList, etc.). Object Request Broker (ORB) Object Services (c) FEEC/UNICAMP 110 113 (c) FEEC/UNICAMP 114 OMA: Serviços de Objetos OMA: Facilidades Comuns São arquiteturas e interfaces para serviços de propósito geral tais como: São interfaces (denominadas horizontais) para serviços orientados para aplicações-fim. Exemplos: • nomes; • eventos; • propriedades; • ciclo de vida; • transações; • persistência; • externalização/ internalização; • segurança; • coleções. • agentes móveis; • data interchange; • interfaceamento com o usuário; • gerenciamento da informação; • gerenciamento de sistemas; • gerenciamento de tarefas (workflow). dentre muitos outros ... (c) FEEC/UNICAMP 115 OMA: Interfaces Específicas do Domínio 116 OMA: Interfaces de Aplicação São interfaces para os serviços específicos da aplicação. Estes serviços em geral utilizam os serviços de objetos, as facilidades comuns ou serviços específicos do domínio. São interfaces (denominadas verticais) para serviços em domínios específicos. Exemplo: • CORBA/TMN and CORBA/SNMP Interworking • CORBA/Intelligent Networks Interworking • Notification Service • Control and Management of A/V Streams • Telecom Log Service • Wireless Access & Control (c) FEEC/UNICAMP (c) FEEC/UNICAMP Exemplo: uma aplicação de gerência de redes pode utilizar o serviço de eventos (serviço de objetos) e o Telecom Log Service (serviço específico do domínio). 117 A Arquitetura CORBA (c) FEEC/UNICAMP 118 CORBA: Características • Estabelece uma arquitetura orientada a objetos; A Arquitetura CORBA (Common Object Request Broker Architecture) especifica um ORB para a Arquitetura de Referência OMA. • Separa a interface do serviço de sua implementação; • Prevê uma vasta gama se serviços e funcionalidades; Os demais elementos da OMA, quando implementados sobre CORBA são denominados CORBAservices (serviço de objetos) e CORBAfacilities (facilidades comuns). (c) FEEC/UNICAMP • Permite a utilização de múltiplas linguagens de programação (C++, Java, Smalltalk, etc.); • Previsão de vir embutido nos sistemas operacionais e linguagens de programação (Java 1.2). 119 (c) FEEC/UNICAMP 120 CORBA: Arquitetura CORBA: Arquitetura A Arquitetura CORBA é composta dos seguintes componentes básicos: servidor cliente • ORB (Object Request Broker); • Compilador IDL (Interface Definition Language); • SII (Static Invocation Interface); • DII (Dynamic Invocation Interface); • BOA/POA (Basic/Portable Object Adaptor); • Repositórios de Interfaces e de Implementação. IDL stub DII ORB interface POA ORB Repositório de Implementação Repositório de Interfaces (c) FEEC/UNICAMP IDL skeleton 121 (c) FEEC/UNICAMP CORBA: Object Request Broker (ORB) 122 CORBA: ORB É o componente básico de interconexão da Arquitetura CORBA, sendo responsável pelo encaminhamento de requisições de métodos para objetos remotos. cliente (Java) Windows NT O ORB provê independência de plataforma, localização e linguagem de implementação dos objetos comunicantes. servidor (C++) Solaris ORB Usualmente é implementado como um daemon que executa em todas as máquinas da rede. (c) FEEC/UNICAMP 123 (c) FEEC/UNICAMP 124 CORBA: Interface Definition Language (OMG IDL) CORBA: Internet Inter-ORB Protocol (IIOP) Objetivo: Prover interoperabilidade entre ORBs de diferentes fornecedores. Objetivo: especificar interfaces (métodos e atributos) de objetos. cliente OMG IDL não é linguagem de programação; ORB (IONA) INTERNET (TCP/IP) A especificação CORBA provê mapeamentos de IDL para linguagens orientadas e não orientadas a objetos (C, C++, Java, etc.). servidor IIOP ORB (IBM) (c) FEEC/UNICAMP 125 (c) FEEC/UNICAMP 126 OMG IDL: Compiladores IDL: Estrutura de uma Interface Módulo Compiladores IDL traduzem as interfaces IDL em construções de uma linguagem alvo (Java, C++, etc.), bem como geram stubs e skeletons para clientes e servidores que utilizam e disponibilizam a interface. Definições (tipos complexos, exceções) Interface Atributos Operações Dependendo da linguagem alvo, compiladores IDL podem gerar tambem código auxiliar para a manipulação de tipos e passagem de parâmetros. Interface Atributos Operações (c) FEEC/UNICAMP 127 IDL: Tipos Básicos (c) FEEC/UNICAMP 128 IDL: Tipos Complexos Enumerações: • um conjunto de possíveis valores Ponto Flutuante: • float (IEEE 32 bits) • double (IEEE 32 bits) Inteiros: • long: -231 ... +231 -1 • unsigned long: 0 ... +232 -1 • long long: -263 ... +263 -1 • unsigned long long: 0 ... +264 • short: -215 ... +215 -1 • unsigned short: 0 ... +216 -1 Outros Tipos: • boolean: TRUE ou FALSE • char: 8 bits (usualmente ASCII) • octet: 8 bits (opaco) • any: armazena qualquer tipo IDL Estruturas: • um conjunto de tipos (básicos ou complexos) "empacotados". Exemplo: struct cliente { string nome; long idade; }; Nota: IDL não define inteiros ! (c) FEEC/UNICAMP 129 IDL: Tipos Complexos (cont.) (c) FEEC/UNICAMP 130 IDL: Tipos Complexos (cont.) Uniões: • contruções capazes de armazenar um tipo IDL dentre um conjunto de tipos declarados. Exemplo: enum formato {formatoString, formatoDigital}; struct DataStruct { short dia; short mes; short ano; }; union Data switch (formato) { case formatoString: string dataString; case formatoDigital: long dataDigital; default: DataStruct dataStruct; (c) FEEC/UNICAMP }; Exemplo: enum moeda {real, dolar, euro, peso}; moeda.real, moeda.dolar, moeda.iene Strings: • armazenam uma sequência de caracteres ASCII com tamanho máximo especificado (bounded) ou não (unbounded). Exemplos: string<30> cliente; // maximo 30 caracteres string cliente; // tamanho ilimitado 131 (c) FEEC/UNICAMP 132 IDL: Tipos Complexos (cont.) IDL: Tipos Complexos (cont.) Seqüências: • armazenam uma seqüência de um mesmo tipo IDL com tamanho máximo especificado (bounded) ou não (unbounded). Arrays: • armazenam um mesmo tipo IDL em uma estrutura multidimensional. Exemplos: sequence<string, 10> nomes; // máximo 10 elementos sequence<string> nomes; sequence<DataStruct> vencimentos; (c) FEEC/UNICAMP Exemplos: DataStruct vencimentos[16]; float Z[50][50]; 133 IDL: Tipos Complexos (cont.) 134 IDL: Tipos Complexos (cont.) Constantes: • permite associar valores a um identificador. Tipo Fixo: • permite representar um número em duas partes: valor e escala (posição do ponto decimal). Exemplos: const float pi = 3.1415926535; const string palmeiras = "alviverde imponente"; Exemplos: fixed<6,2> preco; // (-/+)9999.99 fixed<4,3> taxaDolar; // (-/+)9.999 (c) FEEC/UNICAMP (c) FEEC/UNICAMP 135 IDL: Tipos Complexos (cont.) (c) FEEC/UNICAMP 136 IDL: Tipos Complexos (cont.) Typedefs: • permitem definir nomes para tipos complexos. Tipo Any: • permite armazenar um valor pertencente a qualquer tipo IDL (simples ou complexo), inclusive outro tipo any. Exemplos: typedef sequence<DataStruct> Datas; Datas vencimentos; typedef long integer; integer dataDigital; O mapeamento de IDL para linguagens alvo deve prover mecanismos para: • inserção de valores em tipos any; • extração de valores armazenados em tipos any; • inspeção do tipo armazenado. Nota: Tipos any são um remédio à imposibilidade de sobregarregar operações (métodos) em IDL. (c) FEEC/UNICAMP 137 (c) FEEC/UNICAMP 138 IDL: Exceções IDL: Interfaces Operações nas interfaces IDL podem lançar exceções. Exceções são declaradas em IDL da seguinte forma: Interfaces são comumente definidas no escopo de um módulo (podem também estar desassociadas de um módulo). Interfaces são definidas em IDL da seguinte forma: interface <nome> { atributos operações }; exception <nome> { parâmetros }; Exemplos: exception operationFailed { string reason; short errorCode; }; exception noFunds {}; (c) FEEC/UNICAMP Exemplo: interface Account { void deposit (in long amount); void withdraw(in long amount) raises {noFunds, operationFailed}; long balance(); }; 139 IDL: Atributos de Interfaces (c) FEEC/UNICAMP 140 IDL: Operações Atributos são variáveis associadas às interfaces (similares a atributos públicos de classes em OO). Atributos podem ser "readonly" ou "read-write", sendo definidos em IDL da seguinte forma: Operações são definidas no escopo de uma interface IDL da seguinte forma: <tipo> <nome> (<indireção> <tipo> parâmetro, ...) raises {E1, ... En}; <readonly> attribute <nome>; Exemplos: void withdraw(in long amount) raises {noFunds, operationFailed}; long balance(); Exemplo: interface Account { readonly attribute string customerName; readonly attribute sequence<octet> number; ... }; Nota: IDL não permite a sobrecarga de operações (mesmo nome com diferentes assinaturas) ou operações com número de parâmetros variável. Nota: o compilador IDL gera métodos get e set para operação com atributos. (c) FEEC/UNICAMP 141 IDL: Parâmetros de Operações (c) FEEC/UNICAMP 142 IDL: Retorno de Operações Parâmetros de operações podem assumir qualquer tipo (básico ou complexo). A indireção do parâmetro é obrigatória e possui três modos: • in: o parâmetro é de entrada, isto é, passado do cliente para o servidor. Seu valor permanece inalterado após o retorno da operação. • out: o parâmetro é de saída, isto é, passado do servidor para o cliente. Seu valor comumente se altera após o retorno da operação. • inout: o parâmetro é de entrada/saída, isto é, passado nos dois sentidos. Seu valor comumente se altera após o retorno da operação. Operações podem retornar o tipo void ou qualquer tipo IDL (básico ou complexo). Operações em CORBA são sempre síncronas (mesmo retornando void). Operações assíncronas podem ser definidas com a palavra-chave oneway. Neste caso, devem retornar void e não definir exceções. Exemplo: oneway void deposit(); Nota: parâmetros com valor NULL são proibidos ! (c) FEEC/UNICAMP 143 (c) FEEC/UNICAMP 144 IDL: Interfaces e Tipos Complexos IDL: Definições Postergadas Ao declarar uma interface em IDL, está-se declarando também um novo tipo complexo. Este tipo pode ser utilizado em parâmetros e retornos de operações. Exemplo: É comum referenciar uma interface antes da mesma ser definida. IDL permite postergar a definição de interface declarando-se apenas o seu nome. Exemplo: interface Account { ... }; interface A; interface B { void op1 (in A p1, ...); ... }; interface AccountFactory { Account makeAccount(in string customerName, in sequence<octet> accountNumber); }; interface A { void op2 (in B p1, ...); ... }; Nota: makeAccount retorna uma referência para um objeto distribuído que implementa a interface Account. (c) FEEC/UNICAMP 145 IDL: Herança de Interfaces IDL module boolean char octet string short, unsigned short long, unsigned long long long, unsigned long long float double fixed interface D : A,B,C { ... }; Exemplo: interface SavingAccount : Account { readonly attribute float interestRate; float computeInterest(); }; 147 Mapeamento IDL-Java IDL enum, struct, union sequence, array interface constant (fora de uma interface) constant (em uma interface) exception any typedef readonly attribute readwrite attribute operação Java package boolean char byte java.lang.String short int long float double java.math.BigDecimal (c) FEEC/UNICAMP 148 Parâmetros out e inout em Java Java class array interface, helper & holder classes public interface fields na interface Java class org.omg.CORBA.Any helper classes accessor method accessor and modifer methods método (c) FEEC/UNICAMP 146 Mapeamento IDL-Java IDL permite herança simples e múltipla de interfaces. (c) FEEC/UNICAMP (c) FEEC/UNICAMP 149 Em linguagens que suportam ponteiros (como C++), parâmetros out e inout são passados por referência quando mapeados para a linguagem alvo. Em Java, todo parâmetro possui uma classe Holder associada. O pacote org.omg.CORBA define as classes holder para os tipos básicos, enquanto o compilador IDL gera as classes holder para os tipos complexos. Portanto: • para um tipo qualquer X existe a classe XHolder; • a classes XHolder possui um atributo público do tipo X denominado value; • este atributo contém o valor a ser passado para o servidor (inout), bem como tem o seu valor alterado no retorno da operação. (c) FEEC/UNICAMP 150 Parâmetros out e inout em Java (cont.) Classes Helper Exemplo: // IDL interface Account { ... void withdraw(inout long amount); }; // Java intHolder amt = new IntHolder(); amt.value = 10000; acc.withdraw(amt); System.out.println("Amount: " + amt.value); // Java public interface AccountOperations { ... void withdraw(intHolder amount); }; Tal como classes holder, cada tipo IDL X possui uma classe XHelper associada quando mapeado para Java. Classes helper oferecem três funcionalidades (via métodos estáticos): • inserção do tipo em um tipo any: void insert(org.omg.CORBA.Any a, X that); • extração do tipo armazenado em um tipo any: X extract(org.omg.CORBA.Any a); • criação de stubs a partir da referência do objeto remoto: X narrow(org.omg.CORBA.Object obj); (c) FEEC/UNICAMP 151 (c) FEEC/UNICAMP Mapeamento IDL-Java: Exemplo 152 Exemplo: Account.idl Account.idl interface Account { exception LimitExceeded{string reason;}; Compilador IDL Interface AccountOperations Interface Account class AccountHolder class _AccountStub class AccountHelper class AccountPOA (c) FEEC/UNICAMP void deposit( in long long arg0 ); void withdraw( in long long arg0 ) raises (LimitExceeded); long long balance( ); }; 153 Exemplo: AccountOpeations.java 154 Exemplo: Account.java public interface AccountOperations { void deposit (long arg0); void withdraw (long arg0) throws AccountPackage.LimitExceeded; long balance (); } // interface AccountOperations (c) FEEC/UNICAMP (c) FEEC/UNICAMP public interface Account extends AccountOperations, org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity { } 155 (c) FEEC/UNICAMP 156 Exemplo: AccountHolder.java Exemplo: AccountHelper.java abstract public class AccountHelper { private static String _id = "IDL:Account:1.0" public final class AccountHolder implements org.omg.CORBA.portable.Streamable { public Account value = null; public static void insert (org.omg.CORBA.Any a, Account that) { ... } public AccountHolder () {} public static Account extract (org.omg.CORBA.Any a) { ... } public AccountHolder (Account initialValue) { value = initialValue; } ... } (c) FEEC/UNICAMP public static Account narrow (org.omg.CORBA.Object obj) { .... } public static String id () { return _id;} } 157 Exemplo LimitExceeded.java (c) FEEC/UNICAMP 158 IDL: Passagem de Objetos por Valor package AccountPackage; CORBA, por ser um padrão neutro, não suporta passagem de objetos nas invocações de métodos remotos. Recentemente, o OMG introduziu o padrão denominado "Objeto por Valor" (Object by Value - OBV). public final class LimitExceeded extends org.omg.CORBA.UserException { public String reason = null; public LimitExceeded () { super(LimitExceededHelper.id()); } // ctor OBV permite: • definir um objeto em IDL (estado + métodos); • utilizar este objeto como parâmetro ou retorno de invocações, passando-o por valor. public LimitExceeded (String _reason) { super(LimitExceededHelper.id()); reason = _reason; } // ctor (c) FEEC/UNICAMP 159 (c) FEEC/UNICAMP IDL: OBV IDL: OBV (cont.) Mas: • e se o cliente e servidor forem escritos em diferentes linguagens de programação (que eventualmente não suportam o conceito de objeto, como C, Fortran, etc.) ? • como objetos são serializados / de-serializados ? classes Helper, Holder valuetype estado métodos construtor Compilador IDL Resposta: O padrão OBV permite apenas transferir o estado do objeto (similar a uma IDL struct) em uma invocação. Os métodos devem ser implementados localmente, tanto no lado cliente quanto no lado servidor, em suas respectivas linguagens de programação. (c) FEEC/UNICAMP 160 Value Factory 161 Default Factory (c) FEEC/UNICAMP Objeto Java Implementação do Objeto 162 IDL: Valuetypes IDL: Uso de Valuetypes // "objeto" a ser passado por valor valuetype Empregado { // definicao do estado public string nome; public string cargo; public float idade; public long salario; // interface que utiliza o "objeto" interface RH Empregado obtemEmpregado(in string nome); void adicionaEmpregado(in Empregado emp); void removeEmpregado(in Empregado emp); }; // metodos - pode haver varios long computaSalario(); // construtor factory init(in string n, in string c, in float i); }; (c) FEEC/UNICAMP 163 IDL: Implementação de Valuetypes (c) FEEC/UNICAMP IDL: Implementação de Valuetypes (cont.) // construtor vazio tambem é necessario public EmpregadoImpl() { this.nome = new String(""); this.cargo = new String(""); this.idade = 0; this.salario = 0; } import org.omg.CORBA.*; public class EmpregadoImpl extends Empregado { // construtores // conforme definido na IDL (facory init) public EmpregadoImpl(String n, String c, float i) { this.nome = new String(n); this.cargo = new String(c); this.idade = i; this.salario = computaSalario(); // <<< operacao local } (c) FEEC/UNICAMP public int computaSalario () { if(cargo.equals("gerente")) return(8000); return(3000); } } 165 IDL: Valuetypes - lado cliente (c) FEEC/UNICAMP 166 IDL: Valutypes - lado servidor import org.omg.CORBA.*; import java.util.*; // creia fabrica de Empregados (local) EmpregadoDefaultFactory fact = new EmpregadoDefaultFactory(); Empregado e = fact.init("Jose", "gerente", (float)43.0); public class RHServant extends RHPOA implements RHOperations { rh.adicionaEmpregado(e); EmpregadoDefaultFactory the_factory = null; Hashtable empregados = null; float massaSalarial = 0; Empregado e1 = rh.obtemEmpregado("Joao"); System.out.println("Empregado obtido: " + e1.nome + " - cargo: " + e1.cargo + " - idade: " + e1.idade); public RHServant() { // cria fabrica e hashtable the_factory = new EmpregadoDefaultFactory(); empregados = new Hashtable(); } System.out.println("O salario de " + e1.nome + " e' " + e1.computaSalario()); // <<< chamada local !! (c) FEEC/UNICAMP 164 167 (c) FEEC/UNICAMP 168 IDL: Valutypes - lado servidor (cont.) CORBA: Basic Object Adapter (BOA) public Empregado obtemEmpregado (String nome) { Empregado e = (Empregado)empregados.get(nome); if(e == null) e = the_factory.init("", "", (float)0.0); return e; } Objetivo: instanciar (criar) servidores e controlar a execução de métodos. O BOA identifica o código dos objetos servidores interagindo com o Repositório de Implementação. public void adicionaEmpregado (Empregado emp) { Empregado e = the_factory.init(emp.nome, emp.cargo, emp.idade); massaSalarial += emp.computaSalario(); // <<< chamada local ! empregados.put(emp.nome, e); } Usualmente, o BOA provê três tipos de instanciação de servidores: • compartilhada; • não compartilhada; • por método. public void removeEmpregado (Empregado emp) { if(empregados.remove(emp.nome) != null) massaSalarial -= emp.computaSalario(); // <<< chamada local ! } } (c) FEEC/UNICAMP 169 (c) FEEC/UNICAMP CORBA: BOA compartilhada não compartilhada M1 M1 CORBA: BOA por método M1 A tendência é utilizar a instanciação por processo e servidores multitheaded (para cada evocação o servidor cria uma thread para processá-la). M1 O BOA implementa também funções elementares de segurança (Ex: verificação se um cliente possui permissão para instanciar um servidor) via atributos do sistema de arquivos. M2 M3 método processo M2 M2 M3 M3 M2 (c) FEEC/UNICAMP Pode-se implementar diferentes adaptadores de objetos em prejuizo da portabilidade. 171 Adaptador de Objeto Portável (POA) (c) FEEC/UNICAMP 172 POA: Stubs e Skeletons Portáveis cliente servant result = get(n, m) value = gridRef.get(x,y) POA (Portable Object Adapter) é uma parte importante da arquitetura CORBA que trata do controle dos objetos que implementam interfaces remotas (objetos servants). POA vem eliminar muitas das deficiências do BOA (Basic Object Adapter), principalmente sua dependência de implementação. result = get(n, m) out in POA permite esquemas flexíveis de controle através da combinação de políticas de controle do POA com diferentes modos de ativação de objetos servants. stub out skeleton in invoke out = invoke(”get”,in) in = invoke(out) get n m invoke ORB (c) FEEC/UNICAMP 170 173 IIOP result (c) FEEC/UNICAMP ORB 174 POA: Arquitetura Servidor CORBA POA Manager POA Raiz POA P2 Políticas POA P1 Servant Manager (default) POA Raiz é obtido através do método resolve_initial_references("RootPOA") disponibilizado pelo ORB. Definidas pelo desenvolvedor Um POA é sempre criado a partir de um POA pai (exceto o Root POA) através do método create_POA invocado no POA pai. Object ID Object ID Object ID Object ID Mapa de Objetos Ativos POA P3 (c) FEEC/UNICAMP Servant Manager 175 Servants (implementações) POA: Arquitetura código suprido pelo desenvolvedor (c) FEEC/UNICAMP POA: Operação Típica 176 POA: Políticas POA define 7 políticas: 1. Atribuição de OIDs: USER_ID; SYSTEM_ID (default) servant POA mapa objs. ativos 2. Retenção de Servants: RETAIN (servants são retidos no mapa de objetos ativos); NON_RETAIN (não existe mapa de objetos ativos). upcall M(...) _invoke(M, ...) skeleton OID 3. Processamento de Requisição: USE_ACTIVE_OBJECT_MAP_ONLY (default); USE_DEFAULT_SERVANT; USE_SERVANT_MANAGER. parâmetros 4. Ativação Implícita: IMPLICIT_ACTIVATION (default) - atribui um OID e o adiciona no mapa de objetos ativos quando necessário (não ativa o servant !); NO_IMPLICIT_ACTIVATION. _invoke (c) FEEC/UNICAMP 177 (c) FEEC/UNICAMP POA: Políticas (cont.) POA: Políticas (cont.) 7. Política de Thread: ORB_CTRL_THREAD (default) - o POA mantém um pool de threads para atender as requisições; SINGLE_THREAD_MODEL - o pool possui apenas 1 thread; MAIN_THREAD_MODEL - não há threads, exceto a thread "main". 5. Unicidade de OIDs: UNIQUE_ID (default) - cada servant possui um único ID; MULTIPLE_ID - um servant pode possui mais de um ID. 6. Tempo de Vida: TRANSIENT (default) - referências atribuidas por um POA se tornam inválidas quando o POA que as atribuiu é desativado; PERSISTENT - referências sobrevivem à desativação do POA (neste caso, a referência de objeto (IOR) que abriga o OID deve "apontar" para o daemon de ativação do ORB e não para o POA que a criou). POA POA ORB (c) FEEC/UNICAMP 178 179 POA ORB (c) FEEC/UNICAMP ORB 180 POA: Gerenciador de Servants POA: Gerenciador de POA Existem dois tipos de gerenciador de servants (servant manager) cuja utilização pelo POA se dá através da política USE_SERVANT_MANAGER: O Gerenciador de POA (POA Manager) disponibiliza um conjunto de métodos que permite colocar o POA um um dos quatro estados abaixo: • Ativador de Servants (Servant Activator): utilizado em conjunto com a política RETAIN, disponibiliza ao POA um método que retorna um servant ativado dado um OID. O POA invoca esta operação quando o OID não está presente no mapa de objetos ativos; • espera: suspende temporariamente o processamento das requisições, enfileirando-as; • ativo: processa normalmente as requisições; • descarte: descarta requisições; • inativo: estado pré-destruição (completa processamento das requisições pendentes e descarta novas requisições). • Localizador de Servants (Servant Locator): utilizado em conjunto com a política NON_RETAIN, disponibiliza ao POA um método que retorna um servant ativado dado um OID. O POA invoca esta operação para cada requisição que recebe do ORB. (c) FEEC/UNICAMP 181 POA: Indentificadores de Objeto (OID) 182 CORBA: Static Invocation Interface (SII) OIDs podem ser atribuidos pelo POA (mais comum) ou pela aplicação. OIDs é uma sequência de bytes presente no IOR que identifica o servant. IORs são criados pelo POA via métodos create_reference (POA atribui OID) ou create_reference_with_id (aplicação atribui OID). SII é a forma mais simples do cliente invocar um método num servidor. SII requer que todas as interfaces de servidores sejam conhecidas em tempo de compilação (portanto, SII é type-safe). Quando atribuído pela aplicação, em geral o OID é uma chave de acesso para o estado do servant armazenado em uma base de dados. Isto permite a criação de servidores persistentes. (c) FEEC/UNICAMP (c) FEEC/UNICAMP 183 CORBA: SII (c) FEEC/UNICAMP 184 CORBA: Dynamic Invocation Interface (DII) DII é um conjunto de serviços que permitem a clientes: servidor cliente • Verificar a existência de interfaces no Repositório de Interfaces; proxy IDL stub • Descobrir os parâmetros (tipos) e métodos (protótipos) de determinada interface; IDL skeleton POA • Preparar passo-a-passo uma evocação para um servidor que implementa esta interface. ORB (c) FEEC/UNICAMP 185 (c) FEEC/UNICAMP 186 CORBA: Repositórios de Interfaces e Implementação CORBA: DSI DSI (Dynamic Skeleton Interface) é equivalente ao DII para o lado servidor. DSI permite a um servidor inspecionar uma invocação antes de seu processamento, obtendo o nome do método e respectivos parâmetros. DSI permite também ao servidor retornar um valor para o cliente. Objetivo: armazenar de forma persistente as interfaces IDL e as implementações de servidores. Estes repositórios podem ser implementados diretamente no sistema de arquivo nativo do sistema operacional ou através de uma base de dados (relacional ou OO). Nota: O uso de DII no lado cliente não implica no uso de DSI no lado servidor e vice-versa. (c) FEEC/UNICAMP As implementações CORBA provêem aplicativos para a manutenção destes repositórios. 187 CORBA: CORBAservices (c) FEEC/UNICAMP 188 CORBAservices: Nomes CORBAservices define arquiteturas e interfaces (não implementações !) para os seguintes serviços: O serviço de nomes especifica interfaces IDL para: • criar contextos para definições de nomes; • associar (bind) um nome a um objeto (usualmente um servant); • pesquisar um nome (e obter o objeto associado); • navegar pelo diretório de nomes. • nomes (diretório); • eventos; • ciclo de vida; • segurança; • transações; • time; • persistência; interfaces IDL do serviço servant CORBA servidor de nomes diretório de nomes (persistente ou transiente) dentre muitos outros ! (c) FEEC/UNICAMP 189 CORBAServices: Ciclo de Vida encontra create_object cria copy move remove 190 CORBAServices: Propriedades O serviço de propriedades proporciona operações que permitem definir pares atributo-valor (propriedades) e associa-los a qualquer entidade da aplicação. O serviço de propriedades proporciona operações que permitem criar, destruir, copiar objetos. find_factories (c) FEEC/UNICAMP servant CORBA create_propertyset create_initial_propertyset create_constrained_propertyset FactoryFinder CORBA.Object obj = GenericFactory.CreateObject(pars); servant CORBA servant CORBA PropertySetFactory define_property get_property delete_property GenericFactory servant CORBA ...... servidor de propriedades LifeCycleObject (c) FEEC/UNICAMP 191 (c) FEEC/UNICAMP servant CORBA PropertySet 192 CORBAServices: Eventos CORBAServices: Object Transaction Service O serviço de eventos prove um mecanismo de notificação segundo os modelos push e pull. OTS (Object Transaction Service) implementa um serviço de transações aberto baseado no protocolo 2-phase commit. obtain_push_consumer obtain_push_supplier connect_push_consumer connect_push_supplier disconnect_push_supplier interfaces IDL do serviço - begin - commit - abort, ... push push evento push supplier servant CORBA interface XA (X/Open) servidor OTS canal de eventos push consumers permite a integração com produtos que implementam esta interface servidor de eventos (c) FEEC/UNICAMP 193 CORBAservices: Trader 4 Trader 3 2 (c) FEEC/UNICAMP 194 Java IDL Trader, conceito introduzido no modelo ODP, foi padronizado pelo OMG. Trader é um serviço de nomes mais sofisticado que permite clientes encontrar servidores que melhor atendam suas necessidades. Cenário típico de utilização do trader é dado abaixo. cliente CORBA base de dados (Oracle, Sybase, etc.) A plataforma Java dispõe de uma implementação CORBA denominada Java IDL. Esta implementação, compatível com a versão CORBA 2.3, vem sendo aprimorada desde a sua introdução na versão 1.2 e dispõe atualmente de: servidor CORBA • um compilador idl (idlj); • um conjunto de pacotes (org.omg.CORBA, ...); • um daemon de ativação / servidor de nomes (orbd); • um aplicativo para registro de servidores no repositório de implementação (servertool). 1 ORB 1. exporta capacidades do servidor (desempenho, custo, etc.) 2. importa requisitos (desempenho mínimo, custo máximo, etc.) 3. retorna IOR do servidor 4. interage com o servidor (provavelmente via DII) (c) FEEC/UNICAMP 195 (c) FEEC/UNICAMP 196 Considerações Finais: Tendências em Plataformas Distribuídas Java IDL • existe uma clara convergência de plataformas distribuídas com a Internet; Java IDL suporta: • Adaptador de Objeto Portável (POA); • servidores persistentes; • passagem de objeto por valor (Object by Value); • Intercerceptadores Portáveis (suporte parcial). • neste contexto, as tecnologias voltadas para XML têm papel chave nas plataformas distribuídas; • a comunicação através de RPC deve ser expandida com a introdução de novas formas de comunicação (messaging, streamming, etc.); Java IDL não suporta: • segurança (IIOP/SSL, por exemplo); • repositório de interfaces; • passagem de contexto nas invocações (Current); • outros serviços CORBA. (c) FEEC/UNICAMP • plataformas distribuídas devem suportar o desenvolvimento de aplicações ubíquas (onipresentes). Dispositivos "leves" sem fio devem ser capazes de se comunicar com a aplicação. 197 (c) FEEC/UNICAMP 198 Plataformas Distribuídas: Cenário WML Dispositivo Sem Fio Considerações Finais: Tendências Futuras XML, SOAP, WSDL, UDDI Servidor Web Aplicações de Negócio Firewall HTML, Java, XML HTTP • mais componentes e menos objetos; • mais especificação e menos codificação; • mais evolução e menos adaptação; • mais qualidade e menos complexidade; • mais integração e menos substituição; • mais padrões abertos e menos soluções proprietárias; • mais serviços e menos aplicativos. RMI, CORBA, EJB Desktop Servlet/JSP INTERNET/TCP-IP XML Pode-se especular o seguinte cenário futuro para as plataformas distribuídas: Servidor de Aplicação WAP Bases Corporativas Sistemas Legados JDBC, SQLX SOAP Servidor Corporativo Segurança (SSL, Cert. Digital, Criptografia, etc.) (c) FEEC/UNICAMP 199 (c) FEEC/UNICAMP 200