CENTRO UNIVERSITÁRIO VILA VELHA CURSO DE CIÊNCIA DA COMPUTAÇÃO Diogo Francisco Sales da Silva Flávio Rodrigo Lovatti Computação Distribuída, Web Service - um estudo de caso VILA VELHA 2009 Diogo Francisco Sales da Silva Flávio Rodrigo Lovatti Computação Distribuída, Web Service - um estudo de caso Trabalho de Conclusão de Curso apresentado ao Centro Univertário Vila Velha como requisito parcial para a obtenção do grau de Bacharel em Ciência da Computação. Orientador: Cristiano Biancardi VILA VELHA 2009 Diogo Francisco Sales da Silva Flávio Rodrigo Lovatti Computação Distribuída, Web Service - um estudo de caso BANCA EXAMINADORA Prof. Msc. Cristiano Biancardi Centro Universitário Vila Velha Orientador Prof. Msc. Leonardo Muniz de Lima Centro Universitário Vila Velha Prof. Msc. Vinícius Rosalém Centro Universitário Vila Velha Trabalho de Conclusão de Curso aprovado em 05/06/2009. Dedico este trabalho aos meus pais e irmão, que abdicaram de muitas coisas e se esforçaram para que eu atingisse meu objetivo. Dedico também a minha tia Sandra, que me acolheu em sua casa durante o tempo que precisei. "Diogo Francisco Sales da Silva" Dedico esse trabalho aos meus pais que estiveram sempre ao meu lado e fizeram todo esforço necessário para que este meu objetivo fosse alcançado. "Flávio Rodrigo Lovatti" AGRADECIMENTOS Agradecemos primeiramente a Deus por ter nos dado a força e a perseverança necessária para que este objetivo fosse alcançado. Agradecemos aos nossos pais por terem sido nosso apoio e peça fundamental nesse difícil caminho que foi trilhado. Agradecemos aos nossos familiares que, direta ou indiretamente nos ajudaram a tornamos esse sonho em realidade. É com grande satisfação que damos o nosso "Muito Obrigado!". “Não existe guerra que não possa ser vencida. Não existe barreira que não possa ser quebrada. E não existe objetivo que não possa ser alcaçado” Sun-Tzu LISTA DE FIGURAS 1 Passos em uma comunicação cliente e servidor RPC . . . . . . . . . . 19 2 Ilustração do funcionamento do RMI . . . . . . . . . . . . . . . . . . . . 21 3 Sistema de distribuição de recurso P2P . . . . . . . . . . . . . . . . . . 22 4 Descoberta de par em um modelo P2P centralizado . . . . . . . . . . . 24 5 Descoberta de par em um modelo P2P descentralizado . . . . . . . . . 24 6 Arquitetura básica de um Grid . . . . . . . . . . . . . . . . . . . . . . . . 25 7 Arquitetura das camadas de um Grid . . . . . . . . . . . . . . . . . . . 27 8 Exemplo de Cluster controlado por um servidor . . . . . . . . . . . . . . 30 9 Visão Geral de CORBA . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 10 Requisição de um cliente . . . . . . . . . . . . . . . . . . . . . . . . . . 32 11 Funcionamento básico de um serviço web. . . . . . . . . . . . . . . . . 35 12 Exemplo de um WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 13 Exemplo de interação entre entidades . . . . . . . . . . . . . . . . . . . 37 14 Comunicação entre dois serviços web . . . . . . . . . . . . . . . . . . . 50 15 Ilustração da comunicação entre um serviço cliente e um serviço servidor 52 16 comunicação entre uma aplicação cliente e um serviço web . . . . . . . 52 17 Demonstração da aplicção . . . . . . . . . . . . . . . . . . . . . . . . . 76 18 Caso de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 19 Método construtor da classe HibernateUtil . . . . . . . . . . . . . . . . . 79 20 Diagrama de pacotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 21 Diagrama de classes Entity . . . . . . . . . . . . . . . . . . . . . . . . . 81 22 diagrama de classe DAO . . . . . . . . . . . . . . . . . . . . . . . . . . 82 23 Diagrama de classes faces . . . . . . . . . . . . . . . . . . . . . . . . . 82 24 Diagrama de sequência . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 25 Diagrama de implantação . . . . . . . . . . . . . . . . . . . . . . . . . . 87 26 Classe TransfereciaService . . . . . . . . . . . . . . . . . . . . . . . . . 88 27 WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 28 Schema da aplicação . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 29 WSDL do cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 30 Classe ClienteFaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 31 Arquivo WSDL importado pelo C Sharp . . . . . . . . . . . . . . . . . . 94 32 Método criado dentro do arquivo reference.cs . . . . . . . . . . . . . . . 95 33 Chamada do método transferencia dentro do cliente C Sharp . . . . . . 95 34 Estado inicial do serviço web e aplicação cliente web . . . . . . . . . . 96 35 Estado do servidor e aplicação cliente após a execução da transferência 97 36 Estado do servidor e aplicação cliente C Sharp depois de realizada uma transferência . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 SUMÁRIO 1 INTRODUÇÃO 12 1.1 JUSTIFICATIVA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.2 DESCRIÇÃO DOS CAPÍTULOS . . . . . . . . . . . . . . . . . . . . . . 13 2 REFERENCIAL TEÓRICO 15 2.1 SISTEMAS DISTRIBUÍDOS . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.1.1 Desempenho e escalabilidade . . . . . . . . . . . . . . . . . . . 16 2.1.2 Conectividade e segurança . . . . . . . . . . . . . . . . . . . . . 16 2.1.3 Confiabilidade e tolerância a falhas em sistemas distribuídos . . 16 2.1.4 Transparência . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.1.5 Comunicação em sistemas distribuídos . . . . . . . . . . . . . . 17 2.2 MODELOS DE COMPUTAÇÃO DISTRIBUÍDA . . . . . . . . . . . . . . 18 2.2.1 Chamada de procedimento remoto - Remote Procedure Call (RPC) 18 2.2.2 Invocação de método remoto - Remote Method Invocation (RMI) 20 2.2.3 Computação distribuída Peer-to-peer (P2P) . . . . . . . . . . . . 21 2.2.4 Grid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.2.5 Cluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.2.6 CORBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.2.7 Serviço web (Web Service) . . . . . . . . . . . . . . . . . . . . . 35 2.3 TABELAS COMPARATIVAS . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.3.1 CORBA vs serviço web . . . . . . . . . . . . . . . . . . . . . . . 38 2.3.2 RPC vs RMI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.3.3 Grid vs Cluster vs P2P . . . . . . . . . . . . . . . . . . . . . . . . 3 DEFINIÇÃO DO MODELO ESCOLHIDO 39 40 3.1 Serviços web, uma visão mais abrangente . . . . . . . . . . . . . . . . . 40 3.1.1 Benefícios de serviços web . . . . . . . . . . . . . . . . . . . . . 42 3.1.2 Evolução de tecnologias e produtos . . . . . . . . . . . . . . . . 43 3.1.3 Segurança . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.1.4 Reusabilidade, disponibilidade e escalabilidade. . . . . . . . . . 44 3.1.5 Típicos cenários de serviços web . . . . . . . . . . . . . . . . . . 45 3.1.6 Interação com padrões de negócio . . . . . . . . . . . . . . . . . 46 3.1.7 Integrando com sistemas de informação existentes . . . . . . . . 46 3.1.8 Alcançando diversos clientes . . . . . . . . . . . . . . . . . . . . 47 3.2 Padrões e Tecnologias . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.2.1 Overview dos padrões de serviços web . . . . . . . . . . . . . . 47 3.3 Modelos de desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . 49 3.3.1 Desenvolvimento de serviços web para usarem outros serviços . 49 3.3.2 Desenvolvimento de aplicações clientes para usarem serviços web 52 3.3.3 Design de serviço de ponto final . . . . . . . . . . . . . . . . . . 4 ESTUDO DE CASO 56 76 4.1 DESCRIÇÃO DA APLICAÇÃO EXEMPLO . . . . . . . . . . . . . . . . . 76 4.2 DIAGRAMA DE CASO DE USO . . . . . . . . . . . . . . . . . . . . . . 77 4.3 ESPECIFICAÇÃO DO PROJETO . . . . . . . . . . . . . . . . . . . . . . 77 4.3.1 Tecnologias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 4.3.2 Arquitetura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 4.3.3 Diagramas de classes . . . . . . . . . . . . . . . . . . . . . . . . 80 4.3.4 Diagrama de sequência . . . . . . . . . . . . . . . . . . . . . . . 83 4.3.5 Classes Entity . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 4.3.6 Classes DAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 4.3.7 Classes faces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 4.3.8 Páginas web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 4.3.9 Diagrama de implantação . . . . . . . . . . . . . . . . . . . . . . 86 4.4 CONSTRUINDO E CONSUMINDO O SERVIÇO WEB . . . . . . . . . . 87 4.4.1 Implementando um serviço web . . . . . . . . . . . . . . . . . . 87 4.4.2 Consumindo um serviço web . . . . . . . . . . . . . . . . . . . . 91 4.4.3 Visualização da aplicação em funcionamento . . . . . . . . . . . 95 5 CONCLUSÃO 98 REFERÊNCIAS 100 Anexo 1 - Classe HibernateUtil 102 Anexo 2 - Classe Cliente - Entity 103 Anexo 3 - Classe Conta - Entity 104 Anexo 4 - Classe ClienteConta - Entity 105 Anexo 5 - Classe ClienteContaPK - Entity 106 Anexo 6 - Classe GenericDAO 107 Anexo 7 - Classe ClienteContaFaces 108 Anexo 8 - Classe TransferenciaFaces 109 12 1 INTRODUÇÃO A computação toma rumos onde aplicações deixam de ser apenas locais, ou seja, concentradas em uma única estação ou servidor, e passam a ser distribuídas geograficamente em um ambiente qualquer, a fim de distribuir tarefas em uma rede. Nestas aplicações, há necessidade de se ter um maior recurso computacional com um custo baixo, motivando o uso da computação distribuída nos últimos anos, resultando em um aumento de pesquisa nesta área. Com o aumento do uso de redes de computadores e a sofisticação dos ambientes multitarefa torna-se inquestionável a importância dos mecanismos de otimização de computação. A utilização de técnicas de programação distribuída visa cumprir metas importantes baseadas em funcionalidades cujo objetivo é prover soluções a fim de proporcionar um melhor uso da capacidade computacional, propiciando vantagens como à interoperabilidade, o desempenho, a escalabilidade, a conectividade, a confiabilidade, a transparência, a tolerância à falhas e segurança em ambientes heterogêneos e homogêneos. Assim, cresce o número de aplicações que demandam acesso de forma integrada, uniforme em tais ambientes [6]. Quando se fala em aplicações hoje em dia é praticamente certo que o assunto acabará em web. E com essa visão, o trabalho foi direcionado a discutir uma tecnologia de comunicação, entre aplicações, que abstraísse em qual plataforma as aplicações estão rodando ou em quais linguagens de programação foram desenvolvidas. Dentro deste contexto, este trabalho apresenta um estudo dos modelos de computação distribuída, conceituando e exemplificando suas características de uma forma bem ampla e aprofundada, fazendo uma comparação entre elas. Além disso, um estudo de caso foi definido, com o intuito de exemplificar o funcionamento e a troca de 13 informações entre aplicações clientes e os serviços propriamente ditos, além da interoperabilidade, que é uma das principais características dos modelos de computação distribuída. Esse estudo de caso é baseado em um cenário onde a computação distribuída é fortemente usada, simulando uma transferência entre contas de um banco. Com base no estudo feito e no cenário do estudo de caso (ver capítulo 4), foi escolhido um modelo específico (web service) para o desenvolvimento. Para tanto, um serviço e uma aplicação cliente foram desenvolvidos na linguagem de programação Java, e com o intuito de mostrar a interoperabilidade dos serviços web, outra aplicação cliente foi desenvolvida na linguagem C Sharp. 1.1 JUSTIFICATIVA O foco das empresas e a crescente demanda por aplicações distribuídas no cenário do mercado nacional, os desafios e a inovação que serviços web proporcionam às empresas de software, acrescidos da vontade de conhecer a fundo uma tecnologia nova, tomando como base uma linguagem de desenvolvimento nova, como o Java e o C Sharp, para o estudo aprofundado da referida tecnologia nos motivou a realizar este estudo. E a cada vez que detínhamos conhecimento sobre o assunto, era necessário aprender mais e mais. 1.2 DESCRIÇÃO DOS CAPÍTULOS O capítulo 2 apresenta um referencial teórico, descrevendo o conceito de sistemas distribuídos e alguns modelos de computação distribuída com suas principais características, exemplos de aplicação, vantagens e desvantagens. Além disso, apresenta também uma comparação entre os modelos estudados. O capítulo 3 apresenta a definição de um modelo de computação distribuída (serviços web), dentre as estudadas, para um estudo mais aprofundado, mostrando suas características, benefícios e outras peculiaridades relacionadas. 14 O capítulo 4 apresenta um estudo de caso, baseado em um cenário onde a computação distribuída é usada com ênfase. Esse estudo mostra a descrição de uma aplicação exemplo, bem como o seu desenvolvimento. Além disso, caracteriza uma demonstração prática da aplicação desenvolvida. O capítulo 5 contém a conclusão do trabalho, mostrando os pontos que foram abordados durante o mesmo. Além disso, são apresentadas algumas sugestões de trabalhos futuros. O capítulo 6 mostra as referências dos conceitos que foram utilizadas ao longo do trabalho. 15 2 REFERENCIAL TEÓRICO Neste capítulo são apresentados o conceito de sistemas distribuídos e alguns modelos de computação distribuída, usados como base para a análise de suas principais características e escolha de um modelo para o desenvolvimento de uma aplicação exemplo. 2.1 SISTEMAS DISTRIBUÍDOS A comunicação remota via rede, originalmente reservada para grandes instalações de computadores e ambientes acadêmicos, foi amplamente difundida. Em um sistema distribuído, computadores independentes cooperam via rede de modo que pareçam uma máquina local. Aplicações de sistemas distribuídos podem executar código em máquinas locais e remotas e compartilhar dados, arquivos, e outros recursos entre máquinas. Sistemas distribuídos quase sempre surgem da necessidade de melhorar a capacidade, a confiabilidade de uma única máquina e atender uma grande base de usuários. Algumas das vantagens de se utilizar a tecnologia de sistema distribuído é que se pode atingir um alto nível de desempenho por um custo menor do que um sistema único [6] Os sistemas distribuídos são atribuídos de vantagens em relação a sistemas centralizados como desempenho e escalabilidade, conectividade e segurança, confiabilidade, tolerância a falhas e transparência. Vantagens essas que são apresentadas ao longo deste tópico. 16 2.1.1 Desempenho e escalabilidade Em um sistema centralizado, um único servidor trata todas as requisições de usuários. Com um sistema distribuído, as requisições podem ser enviadas a diferentes servidores aumentando o desempenho. Escalabilidade permite que um sistema distribuído cresça sem afetar as aplicações e os usuários existentes [6]. 2.1.2 Conectividade e segurança Um sistema distribuído pode fornecer acesso sem descontinuidade e recursos através da rede [5]. Se o recurso for um processador, o sistema distribuído deverá permitir que tarefas sejam executadas em qualquer máquina. Se o recurso for um sistema de arquivos globalmente compartilhado, usuários remotos poderão acessá-lo como acessariam um sistema de arquivos local, privado. Conectividade em sistemas distribuídos requer protocolos de comunicação de estado a fim de manter uma operação eficiente, devem fornecer interfaces comuns a todos os computadores do sistema. Sistemas distribuídos devem permitir que apenas usuários autorizados acessem recursos e garantir que a informação transmitida pela rede somente possa ser lida pelos recipientes pretendidos [6]. 2.1.3 Confiabilidade e tolerância a falhas em sistemas distribuídos Sistemas distribuídos implementam tolerância a falhas fornecendo replicação de recursos através do sistema. A replicação oferece aos usuários maior confiabilidade e disponibilidade em relação a implementações de máquinas isoladas. Sistemas distribuídos devem ter um software que detecte e reaja a falhas no sistema, fornecer mecanismos para assegurar a consistência entre informações de estado de máquinas diferentes, e precisam estar equipados para reintegrar recursos que falharam, logo que sejam reparados [5]. 2.1.4 Transparência Transparência em sistemas distribuídos é ocultar dos usuários seus aspectos distribuídos [7]. Esses sistemas devem implementar transparência de localização, ocul- 17 tando a localização de recursos no sistema distribuído daqueles que estão tentando acessá-lo, permitindo acesso a arquivos remotos como se fossem locais. Essa característica pode ser alcançada por replicação ou por ponto de verificação/recuperação de sistema onde a replicação fornece vários recursos que executam a mesma função e, ao usar pontos de verificação, periodicamente serão armazenados informações de estado de um objeto, como um processo. Além dessas, também devem ser implementadas transparências de migração ou transparência de realocação, onde a transparência de migração se preocupa em mascarar a movimentação de um objeto de uma localização para outra no sistema. Já a transparência de realocação mascara a realocação de um objeto por meio de outros objetos que se comunicam entre eles. Por fim, sistemas distribuídos devem implementar transparência de transação, permitindo que um sistema obtenha consistência mascarando a coordenação entre um conjunto de recursos [6]. 2.1.5 Comunicação em sistemas distribuídos Gerenciar a comunicação entre computadores é um desafio em sistemas distribuídos, onde se deve estabelecer interoperabilidade entre computadores e aplicações heterogêneas [6]. Para que um sistema, ao ser projetado, alcance as características de um sistema distribuído, esse deve ser desenvolvido em cima de algum modelo de computação distribuída, e como exemplo desses modelos, tem-se: RPC, RMI, P2P, CORBA, Grid, Cluster e Web Services, que são apenas alguns, de vários existentes. Esses modelos serão apresentados e discutidos nos próximos tópicos. 18 2.2 MODELOS DE COMPUTAÇÃO DISTRIBUÍDA Os modelos apresentados a seguir podem ser tomados como base para o desenvolvimento de aplicações distribuídas. É lógico que o modelo a ser escolhido depende do objetivo da aplicação a ser desenvolvida. 2.2.1 Chamada de procedimento remoto - Remote Procedure Call (RPC) A comunicação entre um componente e outro em um sistema distribuído usando a técnica de RPC proporciona uma abordagem estruturada de alto nível [6]. Por usar a arquitetura cliente/servidor com base, RPC permite que um processo que esteja em execução em um computador cliente chame um procedimento que esteja em execução em outro computador servidor [5], onde o usuário não sabe se o procedimento está sendo executado por seu computador ou por outro computador. A execução desse procedimento sempre ocorre no servidor, e o resultado então é transmitido pela rede ao cliente. O funcionamento do RPC é semelhante a uma chamada de procedimento local, levando em conta que existem dois processos, um invocador e um servidor, onde o invocador envia uma mensagem para o servidor e aguarda uma mensagem de resposta. A mensagem de invocação contém os parâmetros do procedimento; já a mensagem de resposta contém os resultados da execução do procedimento. Já do lado do servidor, um processo permanece aguardando até chegar uma requisição e, quando essa requisição chega, seus parâmetros são extraídos e processados, gerando o resultado, que é enviado na mensagem de resposta. Após isso, o servidor volta a esperar uma requisição. Essa interação entre cliente e servidor é ilustrada na figura 1. 19 Figura 1: Passos em uma comunicação cliente e servidor RPC A chamada de procedimento remoto introduz o conceito de stub, que é o componente da aplicação servidora responsável pela identificação do endereço da aplicação cliente, para empacotar informações do método cliente. Para emitir uma chamada de procedimento remoto, o processo cliente faz uma chamada ao procedimento no stub do cliente, passando os parâmetros apropriados. O stub do cliente executa a montagem de dados, que empacota argumentos de procedimento juntamente com o nome do procedimento em uma mensagem para transmissão via rede. Ao receber a mensagem do stub do cliente, o sistema operacional do servidor transmite a mensagem ao stub do servidor, então a mensagem é desmontada e o stub do servidor envia os parâmetros ao procedimento local apropriado. Quando o procedimento for concluído, o stub do servidor monta o resultado e o envia de volta ao cliente. Por fim, o stub do cliente desmonta o resultado, notifica o processo e passa o resultado para ele [6]. As vantagens de se usar RPC é que essa técnica oculta os detalhes de soquetes, uma abstração computacional que mapeia diretamente uma porta de transporte (TCP ou UDP) e mais um endereço de rede, do ponto de vista dos programadores de aplicações, e ainda possui ligação dinâmica com as portas dos servidores [6]. Existem diversas complicações associadas à chamada de procedimento remoto. Ela pode executar sobre protocolos TCP ou UDP, o que significa que implementações diferentes podem oferecer níveis variáveis de confiabilidade. Implementação de cha- 20 mada de procedimento remoto está diretamente relacionada com o tipo de sistema de arquivos de rede, onde cada implementação pode oferecer um nível diferente de segurança. 2.2.2 Invocação de método remoto - Remote Method Invocation (RMI) Em sistemas distribuídos, outra forma de comunicação entre componentes de uma rede é usando a técnica de invocação de método remoto que, assim como o RPC, usa a arquitetura cliente/servidor como base. Tome duas aplicações distintas onde estas aplicações são construídas utilizando linguagens orientadas a objeto. A aplicação que proverá o método a ser utilizado é chamada de aplicação servidora e a aplicação que irá fazer uso deste método é chamada de aplicação cliente. A aplicação servidora irá habilitar um determinado método em seu corpo a fim de este poder ser invocado a partir da aplicação cliente, seja esta local ou remota [6]. Três camadas distintas de software caracterizam a arquitetura de invocação a método remoto [5]: a camada de stub/esqueleto, a camada remota de referência e a camada de transporte. A camada de stub/skeleton usa o stub para empacotar informações do método cliente. E o skeleton, que é o componente da aplicação cliente, usado para a identificação do endereço da aplicação que irá prover o método desejado, para desempacotar as informações do lado servidor. A camada remota de referência é onde o stub usa a serialização de objeto para criar sua mensagem montada, característica que permite que objetos sejam codificados em correntes de bytes e transmitidos de um espaço de endereçamento para outro. A camada de transporte é responsável por pegar os dados enviados pela camada de referência e separá-los em pacotes que serão transmitidos pela rede [6]. RMI tem seus métodos definidos nas interfaces e tem seus métodos implementados nas classes. Esse funcionamento do RMI pode ser visto na figura 2. 21 Figura 2: Ilustração do funcionamento do RMI RMI pode ser utilizado da seguinte forma: imagine duas aplicações que troquem informações pela internet (via http), e que possam fazer uso da técnica referida. Ao executar uma determinada tarefa, a aplicação cliente recorre a um método; este, por sua vez, não se encontra em seu corpo. Tal método é chamado no corpo da aplicação e a aplicação irá procurar o referido método em suas interfaces. Sendo encontrado, são passados para o método os devidos parâmetros e todo o trabalho de envio dos dados, computação efetuada e recebimento dos dados de resposta ficarão transparentes ao usuário. Tal tecnologia é muito utilizada para a distribuição de poder computacional a aplicações que executem tarefas específicas, como por exemplo, uma determinada aplicação de uma agência de turismo. Esta irá precisar verificar reservas em hotéis, passagens aéreas dentre outros. Ao invés do agente de turismo ter uma aplicação para cada tipo de negócio, o mesmo pode ter uma única aplicação que faça uso de outras aplicações específicas, fazendo valer-se do RMI para a troca e execução das informações pretendidas. 2.2.3 Computação distribuída Peer-to-peer (P2P) Em sistemas distribuídos, um dos modelos de distribuição de recurso é o modelo P2P que consiste em uma distribuição de processamento e requisição de informação em uma rede de computadores, onde todos os componentes isolados do sistema P2P, chamado de nós, executam ambas as tarefas de cliente e servidor, distribuindo as responsabilidades de processamento e informação para muitos computadores [6]. 22 Tal modelo é apresentado na figura 3, mostrando de forma visual o conceito de um sistema P2P. Note que computadores distintos, juntos, formam as redes de computadores do sistema P2P, e essas se ligam a outras redes formando blocos, os quais estão ligados a outros blocos formando uma rede maior ainda, centralizadas ou descentralizadas [6]. Figura 3: Sistema de distribuição de recurso P2P Clientes enviam consultas a servidores que, por sua vez, acessam as bases de dados, onde todas as informações ficam armazenadas e respondem com uma informação. Aplicações P2P são diferentes de aplicações cliente/servidor [10]. Enquanto aplicações cliente/servidor possuem funções definidas, nas aplicações peer-to-peer todos os componentes têm a capacidade de enviar uma requisição e enviar uma resposta, podendo compartilhar recursos. A grande vantagem de aplicações P2P é que não é necessário nenhum administrador de rede [6], [5]. Um sistema distribuído P2P propõe um modelo com as seguintes características: 1. Todos os nós são usuários de serviços em potencial e são, ao mesmo tempo, provedores em potencial desses serviços. 2. Todo nó é independente. 3. Os nós são dinâmicos, podem existir e deixar de existir imprevisivelmente. 23 4. A capacidade de cada nó é altamente variável. Aplicações peer-to-peer centralizada versus aplicações peer-to-peer descentralizadas Aplicações P2P podem ser de duas formas: centralizadas e descentralizadas [6]. Uma aplicação P2P centralizada usa um sistema servidor central que se conecta a cada par. Em uma aplicação centralizada, de mensagens instantâneas, quando um par quer falar com outro par, primeiramente precisa obter o endereço do par requisitado no servidor. Então, o par requisitante se comunica com o par requisitado. Se um ou mais servidores centrais falharem, a rede inteira poderá falhar [10]. Já uma aplicação descentralizada, ou aplicação P2P pura, não tem um servidor. Em uma aplicação P2P pura de mensagens instantâneas, quando o par quer se comunicar com outro, ele não precisa mais se comunicar com o servidor; em vez disso, o par requisitante descobre o par requisitado visto mecanismos de busca distribuída e envia a mensagem ao par requisitado, diretamente [6]. Buscas em tempo real podem ser lentas e aumentam o tráfego da rede à medida que consultas se propagam por ela. Aplicações P2P puras são completamente descentralizadas. A centralização melhora o desempenho de busca, mas torna a rede dependente de um servidor. Fazer transferências de arquivos entre pares reduz a carga do servidor [6]. Descoberta e busca de par Descoberta de par é o ato de descobrir pares em uma aplicação P2P [5]. Uma solução para a descoberta de par pode ser os usuários, primeiramente, se juntarem à rede especificando o seu endereço de rede. Sem conhecer pelo menos um par servidor da rede, um usuário não pode se juntar à ela. O servidor da rede recebe a pesquisa que o par previamente acoplado à rede e realiza uma busca nos arquivos indexados contidos nela. Encontrando, envia o endereço de rede do par, ou pares, que contém o alvo da busca; não encontrando, não envia resultado algum. Outra forma de executar a des- 24 coberta de um par é um par enviar uma mensagem com critérios de busca aos pares conectados a ele. Então, esses pares propagam a busca por toda a rede de pares. Se um par particular puder atender a busca, passa a informação de volta a quem enviou a primeira mensagem. Então, esse primeiro par se conecta diretamente com o par alvo e, assim, podem trocar informações. O par que fez a consulta original pode se identificar somente quando se conectar diretamente com o par que tem a informação requisitada para, assim, poder iniciar a transferência requisitada [10]. Figura 4: Descoberta de par em um modelo P2P centralizado Na figura 4 é apresentado o diagrama de como funciona a conectividade entre pares em um sistema P2P centralizado no que tange a descoberta de par. Quando um par requer uma determinada informação, este irá buscar no índice do servidor a fim de receber como resposta o endereço do par que contém a informação em questão. Figura 5: Descoberta de par em um modelo P2P descentralizado 25 Na figura 5 é apresentada a forma que os pares tomam quando se juntam à rede P2P. Estes estão diretamente conectados a todos os outros nós do sistema P2P. Em tal sistema para a requisição de informações, a pesquisa é direcionada a todos os nós. E todos estes que contiverem a informação em questão irão responder ao par requisitante com seu determinado endereço. 2.2.4 Grid A utilização de forma cooperativa e transparente de recursos distribuídos geograficamente considerando-os como um único e poderoso computador é algo desejado há bastante tempo [7]. Grid é uma proposta promissora para resolver as crescentes demandas da computação paralela e distribuída por transparência, desempenho e capacidade computacional. A infra-estrutura de Grid deve prover de forma global e transparente os recursos para aplicações de grande demanda computacional e/ou de dados [5]. Estes recursos manipulados podem ser de diferentes tipos, havendo grande heterogeneidade dentro de uma mesma classe de recursos [6]. A figura 6 ilustra a arquitetura básica de um Grid. Figura 6: Arquitetura básica de um Grid Características Existem três aspectos que caracterizam Grids computacionais [5]: 26 1. Heterogeneidade: um Grid envolve uma multiplicidade de recursos que são heterogêneos por natureza e que podem estar dispersos geograficamente; 2. Escalabilidade: um Grid pode crescer de poucos recursos para milhões; 3. Dinamicidade ou adaptabilidade: em um Grid a falha de um recurso é a regra, e não a exceção. Os gerenciadores de recursos ou aplicações devem adaptar o seu comportamento dinamicamente a fim de extrair o máximo de desempenho a partir dos recursos e serviços disponíveis [9]. De modo a facilitar a colaboração entre múltiplas organizações, executando diversos recursos heterogêneos autônomos, um número de princípios básicos deve ser seguido no desenvolvimento do ambiente de Grid [8]: 1. Não interferir na autonomia e administração existentes; 2. Não comprometer a segurança existente; 3. Não precisar substituir o sistema operacional, os protocolos de rede ou os serviços existentes; 4. Permitir que computadores remotos se juntem ou saiam do ambiente quando eles decidirem; 5. Não impor paradigma de programação, linguagens, ferramentas ou bibliotecas que o usuário precise usar; 6. Disponibilizar uma infra-estrutura confiável e tolerante a falhas sem um ponto único de falhas; e 7. Fornecer suporte para componentes heterogêneos. Um ambiente de Grid ideal irá prover acesso aos recursos disponíveis de forma homogênea de tal modo que descontinuidades físicas tais como diferenças entre plataformas, protocolos de rede e bordas administrativas se tornem completamente transparentes [8]. Esses ambientes são voltados para aplicações onde existem características como sincronização de processos, transferência e armazenamento de grandes volumes de dados e interoperabilidade entre aplicações heterogêneas. 27 Arquitetura Grid possui uma arquitetura formada por quatro camadas sob a qual uma aplicação será executada. O ponto central consiste dos protocolos de Recursos e Conectividade que facilitam o compartilhamento dos recursos individuais. Protocolos nestes níveis são projetados para que possam ser implementados no topo de vários tipos de recursos definidos na camada de infra-estrutura e podem ser usados para construir um grande conjunto de serviços globais e comportamentos específicos de aplicações na camada Coletiva [6]. Essas camadas são mostradas na figura 7. Figura 7: Arquitetura das camadas de um Grid 1. Infra-estrutura (Grid Fabric layer ) - provê os recursos que permitem o acesso compartilhado. 2. Camada de conectividade (Grid Connectivity layer ) - define os protocolos básicos de comunicação e autenticação exigida para transações de rede específica para Grid. Os protocolos de comunicação permitem a troca de dados entre recursos da camada de infra-estrutura. Os protocolos de autenticação providenciam mecanismos de segurança com criptografia para verificar a identidade dos usuários e recursos. 3. Camada de recursos (Grid Resource layer ) - define protocolos bem como APIs (Application Program Interface) e SDKs (Software Developer’s Kit). Estes protocolos são para negociações seguras, inicializações, monitoramento, controle, contabilidade e pagamento de operações compartilhadas sobre recursos individuais. A camada de recursos está preocupada inteiramente com recursos indivi- 28 duais e, deste modo, ignora aspectos de estado global e ações atômicas através de coleções distribuídas. 4. Camada coletiva (Grid Collective layer ) contém protocolos e serviços (APIs e SDKs) que não estão associados com nenhum recurso específico, mas, ao contrário, são globais em natureza e capturam interações entre coleções de recursos. Compartilhamento de recursos O problema real e específico que está por trás do conceito de grid é o compartilhamento de recursos de forma coordenada e a resolução de problemas em organizações virtuais e dinâmicas. Organização virtual é um dos principais conceitos cuja implementação é fundamental para a computação em grids [8]. Grupos distintos compartilham recursos de uma forma controlada de tal modo que os membros podem colaborar para atingir um objetivo compartilhado. O compartilhamento é mais do que apenas troca de documentos: pode envolver o acesso remoto a programas, computadores, dados, sensores e outros recursos. Ele é condicional: cada dono de um recurso torna-o disponível sujeito às restrições sobre quando, onde e o que pode ser feito. Os relacionamentos de compartilhamento podem variar dinamicamente ao longo do tempo, em termos dos recursos envolvidos, da natureza do acesso permitido e dos participantes para o qual o acesso é permitido. A natureza dinâmica das relações de compartilhamento significa que são exigidos mecanismos de descoberta e caracterização da natureza dos compartilhamentos que existem em um determinado ponto do tempo [5]. 2.2.5 Cluster Cluster pode ser definido como um sistema onde dois ou mais computadores trabalham de maneira conjunta para realizar processamento pesado. Em outras palavras, os computadores dividem as tarefas de processamento e trabalham como se fossem um único computador sob um mesmo domínio administrativo [13]. Com isso, é possível realizar processamentos que até então somente computadores de alta performance seriam capazes de fazer. 29 Características Cada computador de um cluster é denominado nó ou nodo. Todos devem ser interconectados de maneira a formar uma rede. Essa rede precisa ser criada de uma forma que permita o acréscimo ou a retirada de um nó, mas sem interromper o funcionamento do cluster [13]. O sistema operacional usado nos computadores deve ser de um mesmo tipo, isso porque existem particularidades em cada sistema operacional que poderiam impedir o funcionamento do cluster. Independente do sistema operacional usado, é preciso usar um software que permita a montagem do cluster em si. Esse software vai ser responsável, entre outras coisas, pela distribuição do processamento. Esse é um ponto crucial na montagem de um cluster. É preciso que o software trabalhe de forma que erros e defeitos sejam detectados, oferecendo meios de providenciar reparos, mas sem interromper as atividades do cluster [13]. Esse tipo de necessidade pode ser controlado através de um equipamento específico, ou seja, não depende apenas do software. Para que exista, um cluster precisa de pelo menos dois computadores. Evidentemente, quanto mais computadores existirem no cluster, maiores serão os custos de implementação e manutenção. Isso não se deve apenas ao preço dos computadores, mas também pelos equipamentos (switches, cabos, hubs, no-breaks etc.). Mas, ainda assim, os custos costumam ser menores do que a aquisição/manutenção de computadores poderosos e, algumas vezes, o processamento é até mais eficiente (rápido) [6]. A figura 8 traz um exemplo de Cluster usando um servidor para controlar todo ele. Aplicação de clusters Podem ser usados em aplicações onde a demanda de processamento seja grande, como por exemplo, em aplicações de previsão meteorológica, simulações financeiras, simulações geométricas, renderização de efeitos especiais etc. [14]. 30 Figura 8: Exemplo de Cluster controlado por um servidor Tipos de clusters 1. Cluster Beowulf : voltado para a computação paralela, com o objetivo de suprir a elevada capacidade de processamento em diversas áreas científicas, construindo sistemas computacionais poderosos e economicamente viáveis. O sistema operacional é Linux, onde um servidor é responsável pelo controle de todo o cluster, conhecido com Front-End, distribuindo as tarefas e processamento. O cluster Beowulf permite a construção de sistemas de processamento que podem atingir bilhões de instruções de ponto flutuante executadas por segundo [6]. 2. Cluster para Alta Disponibilidade: a alta disponibilidade se refere a sistemas que praticamente não param de funcionar. São usados geralmente em banco de dados, web sites, e-business, dentre outros. 3. Cluster para Balanceamento de Cargas: balanceamento de carga se refere à distribuição equilibrada de processamento, integrando seus nós para que todas as requisições vindas dos clientes sejam distribuídas de maneira equilibrada ou balanceada entre eles [5]. 4. Cluster Combo: combina as características dos cluters de Alta Disponibilidade e de Balanceamento de Cargas, visando a uma solução de alta performance aliada à possibilidade da não existência de falhas críticas. 5. Cluster MOSIX (Multicomputer Operating System for Unix): é um conjunto de ferramentas de cluster para Linux voltado para o tipo Balanceamento de Cargas. Ele se difere do Beowulf por não precisar de aplicações e recursos de softwares voltados ao cluster. É muito utilizado em universidades em seus projetos e pesquisas. 31 2.2.6 CORBA CORBA é uma arquitetura que estabelece e simplifica a troca de dados entre sistemas distribuídos heterogêneos de forma transparente, não importando em qual linguagem de programação foi desenvolvida, nem o local onde está ou em qual plataforma ou sistema operacional esteja sendo executada. O paradigma CORBA é uma combinação de duas metodologias existentes. A primeira delas é a computação cliente-servidor distribuída e a segunda é a programação orientada a objetos, onde um importante conceito deve ser entendido, o conceito de objetos. Para efeito de conhecimento, objetos são instâncias de classes, e essas classes definem o comportamento dos objetos através de métodos e atributos. Um objeto é capaz de armazenar estados através de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e enviar mensagens a outros objetos que serão acessadas pelo cliente [6]. A figura 9 descreve uma visão geral de CORBA. Figura 9: Visão Geral de CORBA Interface Definition Language (IDL) Descreve uma classe chamada interface que contém as implementações dos métodos a serem requisitados. Essa descrição de interface especifica o formato das chamadas das operações e também especifica os parâmetros de entrada e saída necessários para que a operação seja executada. Um exemplo do uso da IDL seria fornecer um método que retornasse o nome de um determinado usuário passando como parâmetro o seu respectivo código. Nessa 32 classe, existiria um método que teria como assinatura, ou seja, os parâmetros, o código a ser localizado. Uma vez localizado o código, o que restaria seria o método retornar o nome do usuário relacionado ao código encontrado. Object Request Broker (ORB) A comunicação entre cliente e servidor é feita pelo ORB. Ele faz o intermédio entre cliente e objeto, permitindo que os objetos requisitados pelos clientes ao servidor façam e recebam requisições de métodos de forma transparente em um ambiente distribuído e heterogêneo. É responsável pela localização do objeto a qual se destina uma determinada requisição, como também, pelo envio dos parâmetros da requisição no formato aceito pelo objeto em questão, e responsável pela entrega da resposta do objeto chamado, ao cliente, como pode ser visto na figura 10. Figura 10: Requisição de um cliente O ORB permite o acesso distribuído às implementações de objetos através do repositório de interfaces, onde ele coloca à disposição as interfaces públicas dos objetos especificados na IDL [6]. Invocação de um objeto Um cliente acessa um objeto através da referência deste objeto e da requisição de operações executadas pelo mesmo. Como o cliente precisa ter contato apenas com a interface do objeto, a estrutura interna deste se mantém transparente. A transferência de controle de dados do cliente para o objeto e, em seguida, o retorno para o cliente, é de responsabilidade do ORB. Se a invocação não for realizada perfeitamente, o 33 ORB informa ao cliente que ocorreu uma exceção. Os clientes de um objeto podem fazer a invocação utilizando a técnica de stub, geradas na compilação da descrição de interface do objeto, ou um conjunto de rotinas para invocação dinâmica de objetos que podem ser utilizado [6]. Interface de invocação estática (Static Interface Invocation - SII) Para acessar uma operação sobre um objeto, o cliente precisa chamar - e estar estaticamente ligado ao stub correspondente. A interface stub conduz o ORB direto para o domínio de programação da aplicação: o cliente interage com objetos servidores chamando suas operações como se houvesse chamado operações de objetos locais. Quando um desenvolvedor escreve seu código, ele determina quais stubs cada cliente contém, fazendo com que essa interface não possa acessar novos tipos de objetos adicionados futuramente ao sistema [6]. Interface de invocação dinâmica (Dynamic Interface Invocation - DII) A interface dinâmica é necessária quando a interface do objeto não pode ser conhecida a tempo de compilação. Em uma invocação dinâmica, o cliente especifica, através da DII, o objeto ao qual se destina a requisição, a operação solicitada e os parâmetros da operação através de uma seqüência de chamadas de rotinas de requisição. Como as implementações de objeto não conseguem detectar se uma determinada invocação chegou ao ORB, via invocação de interface estática ou invocação de interface dinâmica, o cliente fica inteiramente responsável pela escolha. O ORB ainda faz todo o trabalho, fazendo com que a requisição chegue de forma transparente para o objeto [6]. Interface dinâmica de esqueleto (Dynamic Skeketib Interface - DSI) Na DSI, o receptor sabe que a requisição vem de um skeleton dinâmico ou estático, de forma transparente, ao contrário do que acontece na interface de invocação dinâmica. Ao invés de ser acessada através de um skeleton, que é específico para uma operação particular, uma implementação de objetos é alcançada através de uma interface que provê acesso aos nomes das operações e parâmetros de maneira análoga à interface de invocação dinâmica do lado do cliente. Os skeletons podem ser 34 invocados através de clientes stubs e através de interface de invocação dinâmica. Nos dois modos de invocação o resultado obtido será o mesmo [6]. Adaptador de objeto Uma implementação de objetos acessa as funções do ORB através do adaptador de objetos. Cabe a ele fazer a ativação e desativação de implementações de objetos, manter o registro das implementações, promover a requisição de métodos e garantir a segurança da interação entre os elementos envolvidos na requisição da operação. A estrutura interna de um adaptador de objetos depende basicamente dos serviços disponibilizados pelo núcleo ORB e dos outros requisitos das implementações de objeto às quais se destina [6]. Repositório de implementações Local onde ficam armazenadas informações que permitem ao ORB localizar e ativar implementações dos objetos. Através de operações feitas no repositório de implementações é possível a instalação de implementações e políticas de controle relacionadas à ativação e execução de implementações de objetos. Persistência Ao contrário dos objetos tradicionais, os objetos em sistemas distribuídos possuem uma característica de dualidade: um estado dinâmico, tipicamente alocado em memória volátil, e um estado persistente que não pode ser destruído após o encerramento do programa que os criou e que pode ser usado para reconstruir o estado dinâmico, devendo ser armazenado em memória não volátil. A arquitetura CORBA, para prover a persistência, define o Persistent POS como sendo responsável por armazenar o estado persistente dos objetos, utilizando quatro elementos [6]: 1. Objetos Persistentes (Persistent Object); 2. Gerenciador de Objetos Persistentes (Persistent Objects Manager ); 3. Serviços de Persistência de Dados (Persistent Data Services); 4. Base de Dados (Datastores). 35 2.2.7 Serviço web (Web Service) Um serviço web é uma solução utilizada para a integração de sistemas onde softwares ou hardwares podem enviar ou receber mensagens. Um serviço web deve fornecer uma infra-estrutura para se ter uma forma mais rica e mais estruturada de interoperabilidade entre clientes e servidores. A representação de dados externa e o empacotamento das mensagens trocadas entre clientes e serviços web são feitos em XML (Extensible Markup Language), o que resulta em um grupo de tipo de dados bem vasto [6]. A figura 11 ilustra o funcionamento básico de um serviço web. Figura 11: Funcionamento básico de um serviço web. As definições comentadas a seguir são de suma importância para o entendimento de Web Services, de sua arquitetura e troca de dados entre cliente e servidor. Arquitetura São componentes da arquitetura de um serviço web: 1. SOAP (Simple Object Access Protocol): É um protocolo que permite a troca de informações em ambientes distribuídos. Contém as chamadas e retornos dos Web Services encapsuladas em sua estrutura. 2. WSDL (Web Service Description Language): É a linguagem de descrição de Web Services, onde estão descritas as informações necessárias para invocação dos Web Services, como a localização, operações disponíveis e assinaturas de funções do mesmo. 36 A figura 12 mostra um exemplo de wsdl, com um método chamado transferência. Figura 12: Exemplo de um WSDL 3. UDDI (Universal Description, Discovery and Integration): Uma implementação de UDDI equivale a um Web Service Registry, disponibilizando mecanismos para busca e publicação de Web Services. Ele gerencia informação sobre provedores, implementações e metadados de serviços. Além disso, contém informações sobre os serviços e funcionalidades que os serviços web oferecem, permitindo uma associação desses serviços com suas informações técnicas. 37 Fucionamento de serviços web Um serviço web é acessado pelos seus clientes usando mensagens formatadas em XML. O SOAP encapsula essas mensagens e transmite-as por HTTP, ou por outro protocolo, por exemplo, TCP ou SMTP. Os serviços (operações, mensagens, parâmetros etc) são descritos na WSDL. O processo de publicação/pesquisa/descoberta utiliza o UDDI. Os Web Services podem ser ativados por demanda ou podem funcionar continuamente. As interações entre provedor do serviço (service provider ), cliente do serviço (service requestor ) e servidor de registro (service registry ) dão base à arquitetura dos Web Services. Elas são responsáveis pela publicação, busca e execução de operações. A figura 13 ilustra um exemplo dessa interação. Figura 13: Exemplo de interação entre entidades O cliente acessa o serviço, através do provedor de serviço, que representa a plataforma onde o Web Service está hospedado. Já o cliente do serviço, nada mais é do que a aplicação que está fazendo a chamada ou interação com o Web Service. E, finalmente, o servidor de registro é a representação dos servidores de registro e busca de um Web Service. Resumidamente, uma definição para a técnica do funcionamento do Web Sevice seria: um cliente acessa o serviço disponibilizado em algum lugar da web, que foi 38 descrito via WSDL, registrado via UDDI, acessado utilizando SOAP e com os dados transmitidos formatados no padrão XML. 2.3 TABELAS COMPARATIVAS Com base nos estudos realizados, foram construídas tabelas comparativas, onde são feitas algumas comparações entre os modelos estudados, levando em consideração a área de aplicação, tecnologias usadas para sua implementação, vantagens e desvantagens. 2.3.1 CORBA vs serviço web Compara-se CORBA com Web Service, pois ambas são independentes de arquitetura, linguagem de programação e sistema operacional, o que oferece portabilidade para ambas. Características como protocolo, descrição de interfaces, descoberta de serviços, desvantagens e vantagens são apresentadas na tabela 2.3.1. Item Protocolo Descrição das Interfaces Descoberta de Serviço Serviço web SOAP, http, XML SCHEMA WSDL UDDI Desvantagens Dependência de disponibilidade do serviço Vantagens Independência de linguagem, sistemas operacionais, hardware, plataforma; troca de grandes quantidades de informações por XML. CORBA IIOP, GIOP IDL Repositório de Interfaces Alto custo de implementação, velocidade relativamente baixo Independência de linguagem, sistemas operacionais,hardware, plataforma; Acesso a implementações de objetos. Tabela 2.3.1 Comparação entre Web service e CORBA. 2.3.2 RPC vs RMI Compara-se RPC e RMI, pois ambos implementam possuem a arquitetura cliente/servidor como base. A tabela 2.3.2 traz essas comparações. 39 Item Características RPC Execução de procedimentos e funções remotos, com passagem de parâmetros. Vantagens Ligação dinâmica com portas do servidor; Oculta detalhes de soquete ao programador. Não suporta variáveis globais, Implementações diferentes podem oferecer níveis variáveis de confiabilidade. Desvantagens RMI Execução de métodos remotos com passagem de objetos como parâmetros entre métodos remotos. Métodos definidos na interface, Objetos remotos implementam uma ou mais interfaces. Dependente de uma linguagem orientada a objeto para ser possível sua utilização. Tabela 2.3.2 comparação entre RPC e RMI. 2.3.3 Grid vs Cluster vs P2P Compara-se Grid, Cluster e P2P, pois estes estão relacionados com o uso de recursos ociosos geograficamente dispersos. Item Características Administração do modelo Vantagens Desvantagens Grid Heterogeneidade; Escabilidade; Adaptabilidade. Global Cluster Sistema operacional deve ser o mesmo Evolução do Cluster. Maior poder computacional; Distribuição de processamento. Redes com baixas velocidades comprometem o desempenho do grid. Quanto mais computadores maiores os gastos com manutenção; Tabela 2.3.3: comparação entre grid, cluster e peer-to-peer. Local Peer-to-peer Protocolo de compartilhamento de arquivo Global Confiabilidade, caso ocorra erro em algum peer, o sistema não irá parar totalmente. Vulnerabilidade e dependência de uma aplicação intermediária. 40 3 DEFINIÇÃO DO MODELO ESCOLHIDO Com base nas informações analisadas, o modelo de computação distribuída escolhido para o desenvolvimento do trabalho foi o serviço web. Essa escolha teve como base suas características principais como independência de linguagem de desenvolvimento, sistemas operacionais, hardware, plataforma e troca de grandes quantidades de informações por XML. Além disso, o cenário escolhido para o exemplo é mais propício aos serviços web, por se tratar de um ambiente em que são trocadas grandes quantidades de informação e que um servidor é necessário para coordenar toda a parte da regra de negócio da aplicação. Na seção 2.2.7, os conceitos foram apresentados de forma bem sucinta. De agora em diante, estes conceitos serão discutidos de uma forma mais abrangente. 3.1 Serviços web, uma visão mais abrangente Serviços web apresentam um padrão de interface, sendo independentes de plataforma e tecnologia. O cenário onde estão inseridos está expandindo rapidamente devido ao crescimento da necessidade de comunicação e interoperabilidade de aplicações. A organização world wide web Consortium (W3C), a qual estabelece os padrões para serviços web define como: "Um serviço web é um sistema de software identificado por uma URL onde as interfaces públicas e suas vinculações são definidas 41 e descritas usando XML. Sua definição pode ser descoberta por outros sistemas de software. Estes sistemas podem interagir com serviços de um modo prescrito por sua definição, usando mensagens baseadas em XML, tendo como base a comunicação por protocolos da internet"[11]. Outra definição, porém, mais simplificada para serviços web é "Um serviço web é uma aplicação de software acessível pela web (ou intranet, redes corporativas) através de uma URL, que é acessada por clientes usando protocolos baseados em XML, como Simple Object Access Protocol (SOAP), enviado através de protocolos aceitos na internet, como HTTP. Clientes acessam uma aplicação baseada em serviços web através de suas interfaces e vinculações, os quais são definidos usando artefatos XML, como o arquivo web Service Definition Language (WSDL)"[11]. Serviços web se baseiam no conhecimento engajado dos mais maduros ambientes de computação distribuída (como o CORBA e o Java Remote Method Invocation RMI) permitindo a comunicação direta e a interoperabilidade entre aplicações. Estes oferecem uma forma padronizada para aplicações exporem suas funcionalidades ou se comunicar com outras aplicações através da web (ou uma rede interna), independente da implementação da aplicação, linguagem de programação ou plataforma na qual está sendo executada. Além disso, podem fornecer recursos para uma determinada corporação expandir seus negócios, aumentando a eficiência do processamento destes, e melhorando a experiência de seus usuários[11]. Um ponto interessante nas características dos serviços web é que existe a possibilidade de comunicação com serviços externos, ou seja, serviços de terceiros, como exemplo, os serviços do Google, com funcionalidades importantes, sendo a mais conhecida o sistema de busca dentro de sites de terceiros. O motivo mais importante para o aumento do uso de serviços web é o fato de que eles provêem interoperabilidade através de diferentes plataformas, sistemas e linguagens. Além disso, reduzem o custo operacional por permitirem que as organizações a expandam e reutilizem suas funcionalidades de sistemas já existentes. 42 No que diz respeito à arquitetura, um serviço web baseia-se na arquitetura orientada a serviço (SOA), que é um estilo arquitetural que concede a reusabilidade do software e o poder de se criar serviços reutilizáveis. Em um serviço-orientado à arquitetura tem-se: 1. Um serviço implementa uma lógica de negócio e expõe essa lógica através de uma interface bem definida; 2. Um registro onde os serviços publicam suas interfaces a fim de permitirem clientes a descobrir os serviços disponibilizados; 3. clientes (incluindo clientes que podem ser serviços propriamente ditos) que descobrem o serviço usando os registros e acessam os serviços diretamente através de interfaces expostas. Uma importante vantagem de serviços-orientados à arquitetura é que eles permitem o desenvolvimento de aplicações levemente acopladas que podem ser distribuídas através de uma rede acessível. Para prover esta arquitetura, é necessário: 1. Um mecanismo que permita aos clientes acessarem serviços e registros; 2. um mecanismo que permita diferentes serviços a registrarem sua existência em um registro e um modo para diferentes clientes procurarem no registro um determinado serviço disponível; e 3. um mecanismo para serviços apresentarem uma interface bem definida e um modo para clientes acessarem essas interfaces. 3.1.1 Benefícios de serviços web Os serviços web têm ganhado popularidade por causa dos benefícios que os mesmos provêm. Abaixo uma lista de alguns benefícios chave: 1. Interoperabilidade em um ambiente heterogêneo - provavelmente, o benefício chave de um modelo de serviços web é permitir que diferentes serviços distribuídos sejam executados em uma variedade de plataformas e arquiteturas, possibilitando que eles sejam escritos em diferentes linguagens de programação. A 43 maior força do serviço web é sua capacidade de interoperabilidade em um ambiente heterogêneo. À medida que os vários sistemas se permitem usar o serviço web, eles podem usar os serviços facilmente para interoperar entre si; 2. Serviços de negócios através da web - uma corporação pode usar um serviço para ampliar suas vantagens através da world wide web (WWW) utilizando-os em suas aplicações; 3. Integração com sistemas existentes - serviços web permitem que aplicações reutilizem e até economizem informações existentes. Fornecem uma forma padrão para desenvolvedores acessarem a camada de controle e o mais alto nível de um serviço, como o gerenciamento de banco de dados ou simplesmente o monitoramento de transações, e integra-los a outras aplicações; 4. Liberdade de escolha - padrões de serviços web abriram um grande mercado para ferramentas, produtos e tecnologias. Isto dá às corporações uma vasta variedade de escolha, e eles podem escolher as configurações que melhor se encaixem em suas aplicações; 5. Suporte a diferentes tipos de clientes - desde que o principal objetivo de serviços web é prover interoperabilidade, expondo aplicações existentes ou serviços como um serviço web, eles alcançam uma maior leva de diferentes tipos de clientes. Isso acontece independente da plataforma operacional que o cliente trabalha; 6. Produtividade de programação - serviços web, por criarem um padrão comum de desenvolvimento, ajudam a aumentar a produtividade na programação. Priorizando o conceito, desenvolvedores especializados na área de computação distribuída têm encontrado um grande leque de tecnologias nem sempre compatíveis. Eles vêm tentado compactar vários sistemas de alto nível, porém isso os faz lidar com um método de programação nem sempre na mesma camada. 3.1.2 Evolução de tecnologias e produtos Serviços web, por causa de sua ênfase em interoperabilidade e independência de plataforma, sistema operacional e linguagem de programação, encontram-se em uma coleção de tecnologias, vários padrões e especificações, muitos dos quais ainda estão sendo definidos e refinados, como exemplo a interoperabilidade e a ordem: 44 1. Interoperabilidade é um desafio contínuo. Serviços web já têm alcançado um significante degrau de interoperabilidade, mas, futuramente, padrões serão necessários para uma seleção de melhores meio de alcançar tal objetivo. 2. Geralmente, o que acontece para o usuário final que vê um único processamento de negócio é que realmente tudo foi implementado como uma série de estágios em etapas, e cada estágio do processamento pode ser implementado como serviços separados. Todos os serviços devem se coordenar entre si durante os vários estágios do processamento da lógica de negócio a fim de se alcançar o objetivo desejado, por isso padrões são necessários para coordenação de serviços. 3.1.3 Segurança Questões de segurança para serviços web se preocupam com autenticação, autorização e a certificação da existência de confidencialidade. Padrão de segurança é uma área de alta prioridade para a comunidade de serviços web, pois, à medida que os sistemas evoluem, o grau de segurança acompanha essa evolução. De fato, agora que aplicações são disponibilizadas na web, abrindo mais processamento de negócio e informação, a fim de distribuí-las a clientes, segurança se torna um fator fundamental. Uma das dificuldades é lidar com sistemas de realidades separadas em um ambiente de segurança integrado. Segurança necessita de ser compatível com os mecanismos existentes. Em casos onde clientes precisam acessar informações protegidas, o mecanismo precisa manter um alto nível de segurança (e a confidência do usuário) e ainda fazê-lo o máximo desobstruído e transparente possível. 3.1.4 Reusabilidade, disponibilidade e escalabilidade. Serviços web são geralmente citados em distribuições de aplicações de larga escala. Com essas aplicações, a reusabilidade, a disponibilidade e a escalabilidade se tornam fatores importantes a serem considerados. Reusabilidade é o aspecto da representação de quão bem mantido seus serviços e sua segurança estão. Um serviço 45 web é considerado reutilizável quanto mais facilmente e automaticamente se pode lidar com a mudança no uso de padrões e configurações do sistema. Já a disponibilidade se preocupa com o quanto um serviço está disponível para uso imediato; em outras palavras, representa a probabilidade que um serviço está disponível sempre que desejado. Serviços web que escalam efetivamente podem facilmente lidar com uma grande porção de transações por parte de seus clientes. Da mesma forma que o serviço, a plataforma operacional e as tecnologias empregadas devem gerenciar eficientemente os recursos dos sistemas (tais como conexões a banco de dados e suas transações). Para conseguir alcançar reusabilidade, disponibilidade e escalabilidade, serviços web devem ser flexíveis o suficiente para serem executados em qualquer configuração de servidor a fim de se antecipar e suportar determinados volumes de clientes. Eles deveriam, também, serem capazes de mudar essas configurações facilmente, quando necessário. 3.1.5 Típicos cenários de serviços web Aplicações em corporações cobrem um grande espectro de cenários, como interações entre padrões de negócio, suplemento da cadeia de gerenciamento, gerenciamento de inventário e até simples serviços (conversores especializados, calculadoras específicas e assim por diante). Assim, os serviços web, quando usados estrategicamente, podem aumentar significativamente as funcionalidades de uma determinada aplicação, porém não podem ser tomados como soluções apropriadas em todos os pontos de uma aplicação. Enquanto eles fornecem essa riqueza funcional e interoperabilidade, esses serviços podem se tornar de alto custo se levada em conta sua performance. Devem ser levados em conta alguns itens ao escolher uma solução baseada em serviços web, como requerimentos de interoperabilidade para aplicações corporativas 46 em um ambiente heterogêneo, requerimentos de integração para os ambientes que contêm vários sistemas de informação corporativos, tipos de clientes esperados a serem suportados, como tecnologias empregadas e arquitetura da rede comunicação, disponibilidade de ferramentas a fim de implementarem tal solução, nível de sacrifício, em termos de complexidade e performance, que podem ser tolerados a fim de se alcançar as vantagens (interoperabilidade, alcance de diversos clientes e assim por diante) do serviço web. 3.1.6 Interação com padrões de negócio Serviços web podem ser um meio ideal de se integrar à corporação com múltiplos padrões de negócios, por várias razões: são efetivamente mais baratos do que a integração de informações eletrônicas (EDI), atualmente a solução mais comum disponível para padrões de integração de negócio. EDI requer um significativo investimento em infraestrutura, o que limita a grandes corporações. Uma solução baseada em serviços web se torna plausível para negócios pequenos que não podem investir em uma infraestrutura EDI e podem ser mais eficientes em um ambiente com uma infraestrutura EDI existente. Interações baseadas em serviços fornecem aos padrões, especialmente a maior parte dos padrões com significante tecnologia e investimento em infraestrutura, uma boa vantagem: eles podem usar serviços web para integrar suas aplicações corporativas existentes, baixando os custos e aumentando a interoperabilidade, por exemplo. 3.1.7 Integrando com sistemas de informação existentes A maioria das empresas tem feito investimentos no decorrer de muitos anos em tecnologia da informação e recursos de sistema. Geralmente, a maior parte desse investimento é em um sistema de integração de informação corporativo ou sistemas legados. Serviços web podem eficientemente suprir essa necessidade de integrar tecnologias existentes com novas tecnologias. Desde que são baseados no conceito de 47 ’universalmente aceitos’, independentes de plataforma ou de padrões, serviços web criam uma camada de integração natural. Assim, é possível fornecer um software que exponha suas funcionalidades em um serviço web, o que torna mais acessível esse tipo de ferramenta ao usuário que necessita acessar certas funcionalidades pela web. 3.1.8 Alcançando diversos clientes Os serviços web tornam a relação clientes e empresa mais amigável e dinâmica. Isso é possível tornando suas funcionalidades disponíveis, aumentando a experiência de seus clientes, fornecendo serviços como rastreamento de pedido de um cliente ou informações de clima e tempo em pontos do destino do cliente do sistema; e a empresa pode assegurar-se de que estes serviços web serão acessíveis por parte de qualquer tipo de cliente. Clientes podem conseguir essas informações de qualquer lugar e quase sempre usando qualquer aparelho. Alguns clientes podem usar um serviço web em um browser (navegador) a fim de acessar estes serviços, outros podem usar dispositivos móveis, como celulares ou PDA’s. A experiência do usuário é melhorada quando eles possuem um vasto cartel de opções através das quais podem acessar esses serviços, tornando-se, assim, uma opção ideal para abrir a seus clientes essas vastas opções de serviços. 3.2 Padrões e Tecnologias 3.2.1 Overview dos padrões de serviços web Padrões diferem de tecnologia, pois são coleções de especificações, regras e manuais formulados que são aceitos por participantes líderes do mercado. Enquanto estas regras e manuais prescrevem um modo comum de se alcançar um estratificado objetivo padrão, eles não prescrevem detalhes de sua implementação. No entanto, mesmo que os detalhes da implementação se diferenciem, tecnologia pode trabalhar em conjunto desde que seja construída de acordo com as especificações dos padrões. 48 Para que serviços web sejam usados com sucesso, seus padrões devem ser amplamente aceitos. A fim de permitirem sua ampla aceitação, os padrões usados e tecnologias que implementam estes padrões devem seguir os seguintes critérios: 1. Um serviço web deve permitir requisições de qualquer cliente, independente de em qual plataforma foi implementado. 2. Um cliente deve ser capaz de encontrar e usar qualquer serviço web independente da implementação do serviço e da plataforma em que o mesmo é baseado. Os padrões estabelecem uma base comum e permitem serviços web alcançarem uma ampla aceitação e interoperabilidade. Esses padrões cobrem áreas como: 1. Linguagem comum de marcação para comunicação (Commom Markup Language for Communication) - para começar, provedores de serviços, os quais tornam serviços disponíveis, e requisitantes de serviços, os quais usam os serviços, devem ser capazes de se comunicar um com o outro. Uma linguagem comum de marcação facilita a comunicação entre provedores e requisitantes, onde cada parte é capaz de ler e entender a troca de informação baseados em tags definidas. No entanto provedores e requisitantes podem se comunicar usando interpretadores ou tradutores, porém o uso desses não é praticado, pois agentes intermediários são ineficientes e não é efetivamente uma vantagem em relação ao seu custo. Serviços web usam XML (Extensible Markup Language) como linguagem comum de marcação. 2. Formatação de mensagem comum para troca de informação - mesmo que o estabelecimento de uma linguagem comum de marcação seja importante, por si só não é suficiente para uma comunicação ideal entre as duas partes (especialmente, os provedores de serviços e requisitantes de serviço). Para uma comunicação efetiva, as partes devem ser capazes de trocar mensagens de acordo com uma formatação combinada. Desde que tenham um formato, as partes que são desconhecidas podem se comunicar efetivamente. O protocolo simples de acesso a objetos SOAP (Simple Object Access Protocol) fornece uma formatação padrão para serviços web. 3. Formatação comum de especificação de serviços - nos formatos de mensagens comuns e linguagens de marcação deve existir um formato comum que todos 49 os provedores possam usar para especificar detalhes dos serviços, como o seu tipo, como acessa-lo, e assim por diante. Um mecanismo padrão para especificação de detalhes dos serviços permite provedores de serviços a especificá-los de modo que qualquer requisitante pode entendê-los e usá-los. Por exemplo, linguagem de descrição de serviços web (Web Services Description Language WSDL) fornece serviços web com uma especificação de formatos comuns. 4. Resultados comuns para procura de serviços - do mesmo modo que provedores necessitam de um modo comum de especificar os detalhes dos serviços, requisitantes de serviços devem ter um modo comum de procurar e obter detalhes dos serviços. Isto é necessário para terem localizações bem definidas onde provedores podem registrar suas especificações de serviços e onde requisitantes saibam procura-los. Por terem estas localizações bem definidas e um padrão para acessá-las, serviços podem ser universalmente acessados por todos os provedores e requisitantes. Especificações de descrição universal, descobrimento e integração (Universal Description, Discovery and Integration - UDDI) definem um senso comum de procura por serviços web. 3.3 Modelos de desenvolvimento Existem dois tipos de modelos de desenvolvimento de serviços web. São eles: serviços web consumindo outros serviços, e aplicações clientes consumindo um serviço. O primeiro modelo não é o foco do trabalho, portanto será somente apresentado, deixando-o como proposta de trabalhos futuros. Já o segundo modelo será apresentado e discutido em um contexto mais aprofundado, com exemplos de construção e consumo do mesmo, através de uma aplicação exemplo elaborada com fins didáticos para o escopo deste trabalho. 3.3.1 Desenvolvimento de serviços web para usarem outros serviços A figura 14 ilustra a comunicação de um serviço com outro serviço, sendo necessário um intermediário para controlar as requisições e respostas trocadas entre ambos os serviços. 50 Figura 14: Comunicação entre dois serviços web Toda aplicação cliente segue certos passos para usar serviços web. Em resumo, elas devem primeiro localizar o serviço, fazer uma chamada ao serviço e processar qualquer informação retornada. No caso de serviços web consumindo outros serviços web, temos um serviço cliente, que irá requerer algo a um outro serviço já conhecido e temos um ou mais serviços que irão fazer parte do corpo do serviço servidor. Os serviços que estabelecem comunicação entre si necessitam de ter uma camada de interação bem definida, garantindo assim a forma que eles irão trabalhar em conjunto. Tal camada para o cliente, servirá para garantir que sua requisição não estará em segundo plano quando uma nova requisição chegar ao serviço servidor, e servirá para o servidor para que o mesmo detenha um maior controle de todas as requisições que estarão chegando. A comunicação de um cliente para um serviço, na forma de serviço para serviço, dá-se obedecendo aos seguintes passos. Do lado do cliente: 1. O serviço cliente procura pelo serviço servidor; 2. Depois de encontrado, o cliente irá montar sua requisição para o servidor, sendo que esta pode ser por meio de uma chamada passando somente atributos como parâmetro, ou pode ainda passar arquivos xml como parâmetros; 3. Se o parâmetro a ser passado é um arquivo xml, o cliente precisa montar o arquivo xml em conformidade com o schema usado pelo servidor, a fim de garantir 51 a integridade do processamento das informações. Se os parâmetros são atributos, o cliente não necessita de efetuar nenhuma operação antes de enviá-los; 4. Cliente envia a chamada ao serviço e envia os parâmetros para o servidor; 5. Cliente aguarda a resposta. Do lado do servidor: 1. Servidor recebe a requisição e os parâmetros; 2. Se o parâmetro passado é um arquivo xml (ou arquivos xml), estes são validados. Se forem atributos, não passam por nenhum processo de validação; 3. À camada de interação delega os parâmetros ao método específico, que irá processar a requisição do cliente. Tal processamento dar-se-á na camada de processamento; 4. Processa a requisição; 5. Se o tipo do parâmetro de resposta for um arquivo xml, o serviço servidor irá construir o arquivo xml a ser enviado de acordo com o seu schema. Caso não seja, nenhuma atividade é executada, somente os resultados são guardados; 6. Envia a resposta para o cliente, seja ela um arquivo xml ou somente um resultado comum, como um atributo. Um exemplo desse tipo de comunicação pode ser visto na figura 15. Tais passos se deram na comunicação entre um serviço cliente que realizou uma requisição a um outro serviço. Nesse caso, a comunicação entre os dois pode se dar de duas formas. São elas: síncrona e assíncrona. Na forma síncrona, o serviço servidor após efetivamente receber a requisição do serviço cliente, bloqueia-se para não mais processar requisições antes de completar a requisição já recebida. 52 Figura 15: Ilustração da comunicação entre um serviço cliente e um serviço servidor Na forma assíncrona, o oposto acontece. O serviço servidor pode continuar recebendo as requisições, enquanto aguarda um possível processamento, seja ele externo ou interno. Pode iniciar um outro processamento, introduzindo assim o conceito de threads nos serviços web. 3.3.2 Desenvolvimento de aplicações clientes para usarem serviços web A figura 16 ilustra a comunicação de uma aplicação cliente com um serviço. Figura 16: comunicação entre uma aplicação cliente e um serviço web 53 Da mesma forma que serviços clientes consomem serviços servidores, aplicações clientes também seguem certos passos para usarem os serviços web, tendo que primeiro localizar o serviço, fazer uma chamada ao serviço e processar qualquer informação retornada. A escolha do modo de comunicação determina muito dos detalhes para a realização de tais tarefas para este tipo de iteração. Uma aplicação pode se comunicar com um serviço usando stubs, proxies dinâmicos ou interfaces de invocação dinâmica (Dinamic Invocation interface - DII). Com esses modos, um desenvolvedor depende de alguns moldes do lado cliente para representar um serviço web a fim de acessar suas funcionalidades. O desenvolvedor dos serviços decide qual representação usar baseadas na disponibilidade do WSDL, o endereço do ponto final do serviço e os casos de uso para este serviço. A aplicação exemplificada para demonstrar o uso do serviço web usará stubs, pois o mesmo se dá de forma mais simplória, excluindo a necessidade de um software específico de proxy e o uso de interfaces dinâmicas que tornariam o desenvolvimento obsoleto para o exemplo apresentado. Após decidir o modo de comunicação, os desenvolvedores necessitam seguir no projeto e no desenvolvimento de uma aplicação cliente: 1. Avaliar a natureza e a disponibilidade do serviço e a descrição do serviço - geralmente, o primeiro passo é determinar a localização do documento WSDL do serviço web e escolher o modo de comunicação. Usando stubs ou proxies dinâmicos, deve-se primeiro localizar e conseguir acesso total ao documento WSDL representante do serviço web, desde que se desenvolva a aplicação cliente a partir de stubs e suporte de arquivos gerados a partir do WSDL. Se possuir o acesso somente a uma parte do documento WSDL, então usa-se o DII, desde que a DII permita localizar o serviço em tempo de execução. 2. Criar a delegação do lado do cliente: (a) Se aplicável, gerar o stub necessário e o suporte de classes - gerar classes pode não ser portável através da implementação. Portabilidade está diretamente ligada ao uso de limitação do uso de métodos específicos de 54 chamadas nas classes do stub. Quanto menos, mais portável por se desprender da plataforma que o cliente está sendo executado. (b) Localizar o serviço - dependendo do modo de comunicação, existem diferentes modos de se localizar um serviço. (c) Configurar o stub ou objetos de chamada. 3. Invocar o serviço: (a) No uso de stubs e de proxies dinâmicos, invocações são síncronas. Usa-se o DII se desejar ter uma chamada de caminho único. (b) Trabalho com parâmetros, valores de retorno e exceções. 4. Apresentar a interface (view). Geralmente o cliente pode precisar gerar sua interface para usuários finais. Existem diferentes modos com que clientes podem lidar com apresentações das respostas a usuários do serviço web. Em alguns casos, um serviço envia sua resposta, sendo este um documento XML, e este documento poderá vir a ser transformado ou, ainda, mapeado a um formato compatível para apresentação. Modelos de comunicação para acessar um serviço Para melhor determinar o modo de comunicação para a aplicação cliente, é preciso saber as respostas de questões como: o documento WSDL do serviço web é totalmente conhecido? O endereço do ponto final é conhecido pelo serviço web? Como indicado, existem três modo principais para a comunicação de uma aplicação cliente com um serviço web: stub, proxies dinâmicos e interface de invocação dinâmica (Dinamic Invocation interface - DII). Clientes usando tanto stub quanto proxies dinâmicos para acessar um serviço requer, por regra, uma definição de interface de um ponto final do serviço. Quando referenciado à interface de ponto final do serviço, esta é a interface entre o stub e o proxy dinâmico do cliente. 55 O stub, o qual está entre o cliente e a representação do cliente à interface do serviço do ponto final, é responsável por converter uma requisição de um cliente em uma mensagem SOAP e enviá-la ao serviço. O stub também converte respostas de serviços de ponto final, as quais são recebidas como mensagem SOAP em um formato que será compreendido pelo cliente. Por outro lado, os proxies dinâmicos fornecem a mesma funcionalidade como os stubs, mas isso é feito de uma forma mais dinâmica. O modelo de proxy dinâmico difere do modelo de stub principalmente por ele não requerer geração de código durante o desenvolvimento. Já DII é uma interface de chamada que suporta invocação programática e, usandoa, um cliente pode chamar um serviço ou um procedimento remoto sem conhecer em tempo de compilação o exato nome do serviço ou a assinatura do procedimento. Um cliente DII pode descobrir esta informação em tempo de execução e pode dinamicamente procurar pelos serviços e seus procedimentos remotos, diferindo dos stubs, que dependem de uma ferramenta que usam arquivos WSDL para criar a interface do serviço de ponto final, assim gerando o stub e outras classes necessárias. Localizando e acessando serviços Localizar um serviço difere de tecnologia para tecnologia. Assim, um cliente pode acessar um serviço de várias formas. Sua dependência é dada pela geração das classes do stub, que é baseada na tecnologia em que o cliente é desenvolvido. Acessar um serviço independe da utilização de stubs ou de proxies dinâmicos. Um cliente, após procurar pela porta de acesso ao serviço, poderá fazer qualquer chamada desejada pela aplicação. Deve ser assumido que a instância da porta utilizada pelo serviço não será a mesma para as chamadas do serviço, pois portas são independentes de estado. Configuração de stubs e chamadas Desenvolvedores podem querer configurar uma instância do stub ou uma interface de chamada priorizando a invocação do serviço ou podem preferir permitir a configu- 56 ração a tomar lugar dinamicamente em tempo de execução. Geralmente, o desenvolvedor configura o stub ou a interface de chamada priorizando a invocação do serviço quando o serviço requer uma autenticação básica. Stubs podem ser configurados estaticamente ou dinamicamente. A configuração de um stub estático é feita a partir da descrição do documento WSDL na hora em que o stub é gerado; já a configuração de um stub dinâmico é feita através de dados de entrada processados em uma regra programada pelo desenvolvedor em classes específicas para o mesmo. Tratamento de exceções Há dois tipos de exceções em aplicações clientes que acessam serviços web: exceções de sistema e exceções específicas do serviço, as quais são lançadas pelo ponto final do serviço. Exceções de sistema são lançadas por condições como uma passagem incorreta de parâmetro na invocação de um método de um serviço, por um serviço estar inacessível, por erro de rede, ou por algum outro erro além do controle da aplicação. Exceções de serviços, as quais são mapeadas a partir de falhas, são lançadas quando um erro específico do serviço é encontrado. A aplicação cliente deve lidar com os dois tipos de exceção. 3.3.3 Design de serviço de ponto final Serviços web interagem com clientes a fim de receberem suas requisições e retornarlhes uma resposta. Entre a requisição e a resposta, um serviço aplica uma lógica de negócio apropriada e responde a requisição do cliente. A efetiva elaboração de um serviço web começa no entendimento da natureza do serviço a fim de ser fornecido - que é como o serviço irá interagir com o cliente e como irá responder a suas requisições - acompanhado de como os usuários do serviço encontram e realizam suas requisições. A maior parte das decisões que devem ser feitas no desenvolvimento e implementação de serviços web será abordada, incluindo a identificação de diferentes possibilidades que oferecem uma gama de diferentes soluções. Além disso, serão apresentados os conceitos de como receber requisições, delegar requisições de lógica 57 de negócio, formular respostas, publicar um serviço e como lidar com uma interação baseada em documentos. Serão abordados três tipos diferentes de serviços web: 1. Um serviço web provedor de informação que oferece informação que é mais lida do que atualizada - clientes leem a informação mais do que eles podem atualizála. 2. Um serviço web que atualmente completa as requisições de clientes enquanto lida com uma alta proporção de informações compartilhadas que frequentemente é atualizada e que sofre pesadas requisições que utilizam sistemas de integração (EIS) ou transações de banco de dados. 3. Serviços web de processamento de negócio, o quais processam requisições de clientes incluindo uma serie de longos processamentos de dados das regras de negócio, mas, sendo o último caso, usado no desenvolvimento da aplicação exemplo. Decisões chaves no design de serviços web Tecnologias voltadas para serviços web basicamente ajudam a expor uma interface a fim de se obter interoperabilidade para aplicações existentes ou novas, ou seja, você pode adicionar uma interface de um serviço web a uma aplicação existente a fim de torná-la interoperável com outras aplicações, ou você pode desenvolver uma aplicação completamente nova que será interoperável a partir da interceptação do novo serviço. É importante citar que a capacidade de design de serviços web é separada do design da lógica de negócio da aplicação, ou seja, quando se planeja o design de uma interface de um determinado serviço, devem-se considerar tais problemas que podem ser provenientes especialmente da interoperabilidade, e não problemas provenientes da lógica de negócio, e assim, toma-se decisões de design do serviço baseadas nestes problemas. 58 No design de serviços web deve ser considerado o fluxo para um típico serviço e os problemas que os mesmos levam. Em geral, um serviço web: 1. Expõe uma interface que clientes usam para criarem requisições a um serviço. 2. Torna um serviço disponível a parceiros e clientes interessados em publicarem os detalhes do serviço. 3. Recebe requisições de clientes. 4. Delega requisições feitas a uma apropriada lógica de negócio e processa essas requisições. 5. Formula e envia resposta ao requisitante. Dado o fluxo lógico, segue passos típicos no projeto de serviços web. 1. Decisão da interface para os clientes. Decidir quando e como publicar esta interface - o desenvolvimento de um serviço web começa decidindo qual interface o serviço tornará pública a clientes. A interface deve refletir o tipo e a natureza das chamadas que clientes irão realizar a fim de usar o serviço. Deve ser considerado o tipo de ponto final que se deseja usar. Deve ser decidido onde trabalhar o arquivo SOAP e deve-se, ainda, certificar-se de que estas decisões não afetarão a interoperabilidade do serviço como um todo. 2. Determinar como receber e processar requisições - será necessário que o projeto do serviço web permita não somente receber chamada de um determinado cliente, mas também realizar qualquer processamento necessário a tal requisição, como traduzir o conteúdo da mesma para um formato interno antes da aplicação da lógica de negócio. 3. Determinar como delegar requisições à lógica de negócio - uma vez que a requisição tenha sido recebida e processada, então o serviço se encontra pronto para delegá-la à lógica de negócio. 4. Decidir como processar a requisição - se o serviço oferece uma interface de um serviço web a uma lógica de negócio existente, então o trabalho para este passo pode ser simplesmente determinar como interfaces de lógicas de negócio existentes podem ser usadas para tratar a requisição do serviço. 59 5. Determinar como formular e enviar respostas - como os serviços web formularão e enviarão respostas de volta para o cliente. É melhor manter estas operações logicamente juntas. Existem ainda outras considerações a serem feitas neste contexto antes de enviar respostas para os clientes. 6. Determinar como reportar problemas - serviços web não serão imunes a erros; deve ser decidido como tratar esses erros que podem ocorrer. Será necessário endereçar tais problemas como quando lançar específicas exceções de sistema ou quando permitir que um sistema base lance uma exceção específica de sistema. Deve ser formulado também um plano de recuperação de exceção em tais situações que exigirem uma recuperação. Após considerar tais passos, as seguintes questões devem ser feitas a fim de se determinar diretivas para o projeto do serviço web desejado. 1. Como clientes fazem uso dos serviços? Considerar quais tipos de chamadas clientes irão fazer e quais podem ser os parâmetros destas chamadas. 2. Como o serviço web irá receber as requisições dos clientes? Considerar qual tipo de ponto final irá usar o serviço. 3. Processamentos comuns como transformações, traduções e logins precisarão ser realizados? 4. Como a requisição será delegada para a lógica de negócio? 5. Como será formulada a resposta e enviada para o cliente? 6. Quais tipos de exceções o serviço irá tratar e quando podem ocorrer? 7. Como clientes saberão do serviço web? Será publicado em registros públicos, em registros privados ou em outro tipo de registro? Essencialmente, a implementação de um serviço web pode ser vista como duas camadas: uma camada de interação e outra de processamento. A camada de interação consiste na interface do ponto final que o serviço web expõe aos clientes através da qual o mesmo recebe suas requisições. 60 Quando o mesmo recebe requisições dos clientes, a camada de interação define qualquer processamento necessário antes de delegar requisições à lógica de negócio. Quando o processamento da lógica de negócio se completa, a camada interação envia de volta a resposta para o cliente. A camada de processamento envolve toda a lógica de negócio usada para processar as requisições de clientes. É também responsável por integrar-se a sistemas de integração existentes e a outros serviços web. No caso de aplicações existentes adicionando a interface do serviço, a aplicação tipicamente formula a camada de processamento por si só. Visualizar a implementação do serviço web em termos de camadas, ajuda a: 1. Facilmente dividir responsabilidades. 2. Prover uma localização comum ou única para processamento lógico de requisições (ambas, pré e pós processamento) na camada de interação. 3. Expor toda lógica de negócio como um serviço web. No entanto existem vantagens, como se nota na descrição anterior, em visualizar um serviço em termos de camadas de interação e processamento. Um serviço pode optar por juntar estas duas camadas em uma única. Há vezes em que múltiplas camadas tornam um serviço desnecessariamente complicado e, nestes casos, o serviço poderia ser mais simples se o seu projeto fosse feito em uma camada. Tipicamente, isto acontece em cenários onde a lógica nas duas camadas é muito pequena para necessitar de camadas separadas. Projeto da camada de interação A camada de interação de um serviço possui muitas responsabilidades. Clientes acessam o serviço web através de serviços específicos, e a interface é o ponto de partida da interação de um cliente com o serviço web. A camada de interação também lida com outras responsabilidades, tais como receber requisições de clientes, delegar requisições a apropriadas lógicas de negócio e a criação e o envio de respostas. 61 Desenvolvendo a interface - existem algumas considerações que devem ser levadas em conta, como problemas de sobrecarga de métodos, escolha do tipo de ponto final, e assim por diante. Escolha do tipo de interface do ponto final - quando você desenvolve um novo serviço web que não usa uma lógica de negócio existente, a escolha de tipo de ponto final para usar a interface de um determinado serviço web é de extrema cautela. Quando se adiciona uma interface de um serviço web a uma aplicação existente ou a um serviço, deve-se considerar onde a aplicação existente ou serviço processa requisições antes de delegá-las à lógica de negócio. Além disso, deve-se escolher o tipo de ponto final que se adapte à camada onde a lógica de processamento ocorre na aplicação existente. Se a aplicação ou serviço existente não requer processamento de requisições, escolhe-se o ponto final apropriado que está presente na mesma camada que a lógica de negócio. Na escolha de um ponto final ideal seria necessário levar em conta alguns tópicos: 1. Considerações de acesso multi-thread - sincronizações no código fonte podem ser necessárias dependendo da tecnologia empregada no desenvolvimento do serviço web. 2. Considerações de transação - o contexto de transação de implementação do serviço determina o contexto transacional no qual a implementação é executada. Se a lógica do serviço requer o uso de transações, será necessária a implementação do gerenciamento lógico das transações. 3. Considerações para as permissões de acesso de métodos - um método de um serviço web pode ser acessado por uma gama de clientes diferentes, e será necessário adicionar determinadas restrições aos métodos para diferentes clientes. 4. Considerações a acesso de sessões HTTP - suporte a sessões HTTP é apropriado para interações de curta duração, onde um serviço web geralmente re- 62 presenta o processamento de negócio com durações maiores sem precisar de mecanismos adicionais. Granularidade de serviços A granularidade está relacionada ao nível de detalhamento do comportamento de um objeto que é exposto. O detalhamento do comportamento do objeto determina se a mesma será granularidade grossa ou fina. Quanto mais detalhado, mais fina é a granularidade. Muito do projeto da interface de serviços web envolve o projeto de operações de serviços ou seus métodos. Primeiro determinam-se as operações do serviço, para depois definir a assinatura do método para cada operação, ou seja, define-se cada parâmetro de cada operação e o mesmo retorna valores ou qualquer erro que poderá ser gerado. Para aqueles serviços que implementam processamento de negócio, a natureza do mesmo geralmente está sujeita à granularidade. Processos de negócio que trocam documentos por natureza resultam em uma interface de serviço web que é de granularidade grossa. Com mais serviços web interativos, será necessário um cuidado na granularidade das operações existentes. Deve ser mantida a mesma consideração no projeto de métodos para serviços web como quando desenvolvendo métodos para conteúdos remotos. É particularmente verdadeiro não somente para evitar o impacto de acesso remoto na performance, mas também nos serviços web. É altamente importante em serviços web, pois existe uma representação XML requerendo banda para seu envio. Assim, uma boa regra é definir a interface do serviço web para otimizar a granularidade de suas operações, ou seja, encontrar o balanceamento certo entre granularidade grossa e granularidade fina. Geralmente, devem-se consolidar operações de granularidade fina dentro de operações de granularidade grossa para minimizar chamada de métodos remotos custosos. 63 Operações de granularidade grossa mantêm o consumo da rede baixo e melhora a performance, no entanto, algumas vezes são menos flexíveis do ponto de vista do lado cliente; enquanto operações de granularidade fina resultam em um maior consumo da rede e em uma redução de performance. É importante citar que muita consolidação leva à ineficiência. Por exemplo, consolidar logicamente diferentes operações é ineficiente; é melhor consolidar operações similares ou operações que os cliente mais usam, como operações de consulta. Quando um serviço web é exposto, deve-se assegurar que as operações do serviço estão suficientemente com granularidade grossa. Tipos de parâmetros para operações de serviços web Na invocação de um método de uma interface de um serviço, um cliente pode ter um grupo de valores para associá-lo como parâmetros à chamada. Devem ser escolhidos cuidadosamente os tipos de parâmetros quando se desenvolve métodos em uma interface de um serviço. Uma chamada a um método e seus parâmetros é enviada como mensagens SOAP entre o cliente e o serviço. Para ser parte de uma mensagem SOAP, os parâmetros devem ter mapeamento XML. Quando recebida pelo cliente ou pelo serviço final, os mesmos parâmetros devem ser mapeados a partir do mapeamento XML para seus tipos apropriados ou objetos específicos. No projeto dos parâmetros para chamada a métodos na interface do serviço web, escolhe-se parâmetros que tenham tipos de mapeamento padrão, pois a portabilidade e a interoperabilidade do serviço web é reduzida quando se usa tipos de parâmetros que não são suportados. Documentos XML como parâmetros Existem casos quando se deseja passar um documento XML como parâmetro. Tipicamente, esses casos ocorrem em interações de negócio-para-negócio onde existe a necessidade de troca de documentos legalmente conectados, rastreamento do que é trocado, e assim por diante. Troca de documentos XML como parte de um serviço web é endereçado em uma sessão separada. 64 Interfaces com métodos sobrecarregados Na interface de um serviço web, pode-se sobrecarregar métodos e apresentá-los a clientes desses serviços. Métodos sobrecarregados compartilham o mesmo nome do método, mas têm diferentes parâmetros e valores de retorno. Tratamento de exceções Uma aplicação web pode encontrar um erro de condição na requisição de processamento de um determinado cliente. Ela necessita tratar qualquer exceção lançada por alguma condição de erro e propagar essa exceção. Lançar exceções em aplicações de serviço web tem restrições adicionais que impactam no projeto do serviço de ponto final. Para considerar como o serviço de ponto final lida com condições de erro e notifica os clientes de erros, devem-se considerar os seguintes pontos: 1. Similar a respostas e requisições, exceções também são enviadas de volta para clientes como parte das mensagens SOAP. 2. O serviço web deve suportar cliente que não trabalha com a mesma tecnologia em que o serviço web foi desenvolvido, o que impacta na possibilidade de incompatibilidade de tratamento desses erros. Uma aplicação de serviço web pode encontrar dois tipos de condições de erro. O primeiro é o tipo de erro de sistema irrecuperável, como erro devido a problemas na conexão da rede. O segundo tipo é o tipo de erro de aplicação recuperável. Este tipo de erro é chamado de exceção de serviço específico, pois o erro é particular a um serviço específico. Mesmo prometendo interoperabilidade através de plataformas heterogêneas, padrões de serviços web não podem endereçar todo tipo de exceções lançadas por diferentes plataformas. 65 É importante para serviços web - do ponto de vista de interoperabiidade do serviço - não expor exceções específicas de uma determinada tecnologia em uma interface de um serviço, ao invés disso, lançar uma exceção específica do serviço. É importante ainda citar os seguintes pontos: 1. Não se podem lançar exceções não serializáveis a clientes através do ponto final do serviço web. 2. Quando um serviço lança uma exceção que não pertence à tecnologia que o cliente usa, o tipo de exceção e seu contexto são perdidos pelo cliente que recebe a exceção lançada. 3. Exceções herdadas são perdidas quando se lança uma exceção específica de serviço. 4. Deve-se evitar a definição de exceções específicas de serviços que herdam ou estendem a outras exceções. 5. A pilha de rastreamento de erro não é passada ao cliente. A pilha de erro para uma exceção é relevante somente para o ambiente atual de execução e é insignificante em um sistema diferente. Quando um serviço lança uma exceção a um cliente, este não tem a pilha de rastreamento explicando as condições de acontecimento da exceção. Assim, deve-se considerar a passagem de informação adicional na mensagem para a exceção. Padrões de serviço web tornam isso mais fácil para um serviço passar condições de erro a um cliente em uma diferente plataforma. A especificação SOAP define um tipo de mensagem que os serviços retornam aos clientes. Define também um tipo de mensagem chamado fault, que permite condições de erro a serem passadas como parte da mensagem SOAP, indiferenciável da porção de requisições ou resposta. O termo fault de uma especificação SOAP define exceções de nível de sistema, como exceções de erros irrecuperáveis. 66 Interoperabilidade O grande benefício do serviço web é interoperabilidade entre plataformas heterogêneas. A fim de conseguir o máximo benefício, deseja-se desenvolver o serviço a fim de ser interoperável com clientes e qualquer plataforma, e a organização de interoperabilidade do serviço web (Web Service Interoperability organization - WS-I) ajuda neste quesito. WS-I promove uma grade de protocolos genéricos para a troca interoperável de mensagens entre serviços web. O perfil básico da WS-I promove interoperabilidade por definir e recomendar como a grade central especificada e padrões para serviços web (incluindo SOAP, WSDL, UDDI e XML) podem ser usados para o desenvolvimento de serviços interoperáveis. Para máxima interoperabilidade, devem-se considerar os seguintes pontos: 1. Dois estilos e ligações suportados pelo WSDL. 2. A WS-I suporta anexos. A WSDL suporta dois tipos de estilo de mensagem: rpc e document. O atributo WSDL style indica o estilo da mensagem. O atributo style configurado como rpc indica operações orientadas a chamadas a procedimentos remotos (Remote Procedure Call - RPC), onde mensagens contêm parâmetros e valores de retorno ou assinatura de funções. Quando o atributo style é configurado como document, indica operações orientadas a documentos. Uma em cada mensagem contém documentos. Cada estilo de operação tem um efeito diferente no formato do corpo da mensagem SOAP. Além de estilos de operações, WSDL suporta dois tipos de mecanismos de serialização e desserialização: mecanismo literal e encoded. O atributo WSDL use indica qual mecanismo é suportado. O valor literal para o atributo use indica que a informação é formatada de acordo com as definições abstratas no documento WSDL. O atributo encoded significa que a informação é formatada de acordo com a codificação definida na URI, especificada pelo atributo encodingStyle. Assim, pode-se escolher entre o estilo rpc ou encoded 67 na passagem de mensagem e cada mensagem pode usar tanto a formatação de informação literal ou encoded. Recebendo requisições A camada de interação, através do ponto final, recebe requisições de clientes. A plataforma mapeia as requisições recebidas de clientes, as quais estão na forma de mensagens SOAP, a uma chamada de método presente na interface do serviço web. Antes de delegar estas requisições recebidas à lógica de negócio do serviço web, deve se realizar qualquer validação de segurança necessária, transformação de parâmetros ou qualquer pré processamento de parâmetros necessário. Devem-se levar em conta passos adicionais para lidar com documentos XML que são passados como parâmetros. Estes passos, os quais são mais bem realizados na camada de interação do serviço, são como segue: 1. O ponto final do serviço deve validar documentos XML recebidos em relação a seu schema. 2. Quando a camada de processamento e a lógica de negócio do serviço web são desenvolvidas para lidar com documentos XML, deve-se transformar o documento XML a um schema internamente suportado se o schema para o documento XML diferenciar do schema interno, antes da passagem de documento à camada de processamento. 3. Quando a camada de processamento lida com objetos, mas a interface do serviço recebe documentos XML, então, como parte da camada de interação, mapeiase o documento XML recebido para o objeto de domínio antes de delegar a requisição à camada de processamento. É importante que estes três passos - validação de parâmetros ou documentos XML recebidos, tradução de documentos XML a um schema interno suportado, e o mapeamento de documentos a objetos de domínio - realizem o mais perto possível do serviço de ponto final e, certamente, na camada de interação. 68 Um projeto como este ajuda a capturar erros mais cedo e, assim, evitam-se chamadas desnecessárias e meias voltas à camada de processamento. A camada de interação do serviço web lida com todas as requisições recebidas e delega-as à camada de lógica de negócio na camada de processamento. Quando implementada dessa maneira, a camada de interação do serviço web possui muitas vantagens, desde que se dê uma localização comum para as seguintes atividades: 1. Gerenciamento e manuseamento de requisições que o serviço de ponto final serve como contato de ponto inicial. 2. Serviços de invocação de segurança, incluindo autenticação e autorização. 3. Validação e transformação de documentos XML recebidos e mapeamento de documentos XML a objetos de domínio. 4. Delegação à lógica de negócio existente. 5. Tratamento de erros. É recomendável realizar todo processamento comum como checagem de segurança, login, auditoria, validações de entrada - para requisições na camada de interação assim que recebida e antes da passá-la para a camada de processamento. Delegando requisições do serviço web à camada de processamento O próximo passo é projetar como delegar requisições à camada de processamento. Considerar o tipo de processamento que a requisição necessita, ajudará a decidir como delegar a requisição à camada de processamento. Todas as requisições podem ser categorizadas em duas grandes categorias baseadas no tempo que o processamento demora, nomeadas: 1. Requisições que são processadas em um curto espaço de tempo, onde o cliente pode esperar pela resposta antes de seguir adiante com processamentos futuros. Em outras palavras, o cliente e o serviço interagem de forma síncrona, onde o cliente fica bloqueado até que a requisição é processada completamente e a resposta recebida. 69 2. Requisições que demoram muito tempo. O cliente e o serviço interagem de forma assíncrona onde o cliente não precisa se bloquear para esperar o processamento ser completado totalmente. Quando o serviço recebe a requisição do cliente, o mesmo deve procurar pela informação requisitada e enviar de volta a resposta para o cliente. Esta procura e retorno de informação podem ser alcançados em um curto espaço de tempo, onde o cliente pode ser bloqueado e esperar. O cliente continuará seu processamento somente após obter uma resposta do serviço. Um serviço web pode ser projetado usando um serviço de ponto final que recebe as requisições dos clientes e então as delega diretamente à camada apropriada de processamento do serviço. A camada de processamento do serviço processa a requisição e, assim que completo, o serviço de ponto final retorna a resposta ao cliente. Quando se faz uma requisição a um serviço assíncrono, o cliente não pode esperar pelo processamento. Neste tipo de requisição, o cliente pode esperar e continuar com alguns outros processamentos. Mais tarde, quando receber a resposta, o cliente pausa ou simplesmente interrompe seja lá o que estiver em atividade no momento. Tipicamente, em serviços assíncronos, o conteúdo dos parâmetros de requisição inicia e determina o curso do processamento - o passo para completar a requisição - para o serviço web. Geralmente, completar uma requisição necessita de vários passos. Em uma arquitetura de serviços assíncronos, o cliente envia uma requisição para o serviço de ponto final, então tal requisição é validada na camada de interação e então delegada à camada apropriada de interação do serviço. Isto é feito enviando a requisição a uma camada específica de troca de mensagem, como uma API de envio e recebimento de mensagem, por exemplo, JMS. A validação garante que uma requisição está correta. Delegar uma requisição antes de validá-la pode resultar na passagem de uma requisição inválida à camada de processamento. Após a requisição ser delegada corretamente à camada de processamento, o serviço de ponto final pode retornar uma identificação co-relacionada para 70 o cliente. Essa identificação é para futuras referências do cliente e pode ajudá-lo a associar respostas que correspondam a requisições anteriores. O serviço pode tornar resultados de requisições de clientes disponíveis em uma das duas maneiras seguintes: 1. O cliente que invocou o serviço verifica periodicamente o status de sua requisição usando a identificação co-relacionada que foi fornecida na hora em que a requisição foi realizada. 2. Ou, se o cliente é o próprio nó do serviço web, o serviço chama novamente o serviço do cliente com os resultados. O cliente pode usar a identificação corelacionada para relacionar a resposta com a requisição original. Geralmente, isto é decidido pela natureza do próprio serviço. Formulando respostas Após delegar a requisição à porção de lógica de processamento da aplicação, e a lógica de negócio completar seu processamento, o serviço encontra-se pronto para o próximo passo: formular a resposta para a requisição. Devem-se construir respostas generalizadas o mais perto possível do serviço de ponto final, as quais simplesmente construindo-se a chamada do método de retorno, retornará valores e parâmetros de saída na camada de interação. Isto permite ter uma localização comum para a construção da resposta e transformações de documentos XML, particularmente se o documento que se retorna para quem o requisitou deve ser conforme a um schema diferente do schema interno. Manter esta funcionalidade próxima do ponto final permite implementar armazenamento temporário de informação (caching data) evitando-se voltas extras na camada de processamento. 71 Um serviço bem projetado deveria construir suas respostas em formatos compatíveis com diferentes tipos de clientes. No entanto, não é um bom projeto ter diferentes implementações da lógica de serviços para cada tipo de cliente. Preferivelmente, é melhor projetar lógicas de negócio comuns para todos os tipos de clientes. Então, na camada de interação, transformar os resultados para cada construção de tipo de cliente. Projeto da camada de processamento A camada de processamento está onde a lógica de negócio é aplicada à requisição do serviço web. Deve-se projetar a lógica de negócio considerando tais problemas. Existem alguns problemas no design da camada de processamento que devem ser citados. São eles: 1. "Manter a camada de processamento independente da camada de interação mantendo as camadas independentes e pouco acopladas, a camada de processamento fica genérica e pode suportar diferentes tipos de clientes. Para se conseguir um nível de acoplamento baixo entre as camadas, considere usar a delegação de classes que encapsulam o acesso aos componentes de negócio. 2. "Ligue documentos XML à camada de interação - existem casos em que o serviço web espera receber do cliente um documento XML contendo uma requisição completa, mas a lógica de serviço não tem necessidade de operar no documento em si. Nesses casos, é recomendado que a camada de interação ligue o conteúdo do documento XML a objetos antes de passar a requisição para a camada de processamento. Lembrando que a lógica de processamento pode operar nos conteúdos de um documento XML recebidos do cliente. Dependendo do cenário da aplicação, a camada de processamento pode ser requisitada para trabalhar com outros fornecedores de serviços web a fim de completar uma requisição web. Caso isso aconteça, a camada de processamento efetivamente se torna um cliente de outro serviço. 72 Publicando um serviço web O serviço web precisa ser acessível a clientes, relembrando que alguns serviços são de interesse público, e outros serviços de interesse entre parceiros confiáveis e, ainda, outros são de interesse somente de uma única empresa. Independente da localização do serviço, para acesso público ou privado, primeiro deve-se criar os detalhes sobre os serviços web - sua interface, parâmetros, onde o serviço está localizado, e assim por diante. Esta atividade é possível tornando disponível a descrição dos serviços web às partes interessadas. Como dito anteriormente, a linguagem de descrição de um serviço web (Web service Description Language WSDL) é a linguagem padrão para descrição de serviços. Criando essa descrição WSDL disponível a clientes, permiti-se o uso dos serviços. Publicando um serviço em um registro Publicar um serviço web em um registro é um método de tornar o serviço disponível a clientes. Pode-se querer registrar um serviço web para uma consumação pública generalizada em um registro bem definido. Quando um serviço é disponibilizado através de registros públicos, qualquer cliente, até um sem conhecimento prioritário do serviço, pode procurar e usar o serviço. Registros públicos mantêm a descrição do serviço web, o qual consiste em não somente no WSDL do serviço, mas também em qualquer schema XML referenciado pela descrição do serviço. Em outras palavras, o serviço web deve publicar seus schemas XML públicos e qualquer schema definido no contexto do serviço. Deve ainda publicar no mesmo registro público schemas XML referenciados pela descrição do serviço. Quando um serviço web é estritamente para uso propietário, deve-se publicar a sua descrição em um registro da corporação na própria empresa. Não é necessário o uso de um registro se todos os clientes do serviço web são parceiros dedicados e existir um acordo entre as parte no uso do serviço. Neste caso, 73 pode-se publicar a descrição do serviço web - WSDL e os schemas XML - em uma localização bem conhecida com acessos e proteções apropriados. Entendendo conceitos do registro Registros públicos não são repositórios. Ao invés de conterem detalhes completos nos serviços, registros públicos contêm somente detalhes sobre o que os serviços são capazes e como acessar esses serviços. Um registro pode somente armazenar o tipo do serviço, sua localização e informações necessárias para acessá-lo. Um cliente interessado em um serviço deve primeiro descobri-lo a partir do registro e então ligar-se com a ele para obter um completo catálogo do serviço em questão. Uma vez obtido o catálogo do serviço, o cliente pode certamente acessar um determinado serviço a fim de sanar sua necessidade. Caso contrário, o cliente deve procurar novamente no registro e repetir o processo de descoberta e ligação - o cliente procura no registro por algum outro serviço que potencialmente oferece o que deseja, liga-se a ele, obtém acesso ao seu catálogo, e assim por diante. Usar padrões de taxonomia (identificação) existentes oferece aos clientes dos serviços web uma base padrão a partir da qual o serviço web será procurado, tornando a tarefa de encontrar um determinado serviço mais fácil. Pode-se publicar o serviço web em mais de um registro, para futuramente ajudar clientes a encontrarem os serviços. É também uma boa idéia publicar em quantas categorias forem possíveis. Por exemplo, se múltiplas instâncias de um serviço existem para um produto particular, o cliente pode futuramente refinar sua pesquisa considerando diferentes fatores de busca. Trabalhando com documentos XML em um serviço web Existem considerações adicionais quando uma implementação de um serviço web espera receber um documento XML contendo toda informação de um cliente, e qual 74 serviço usado para iniciar um processamento de negócio para manusear a requisição. Existem muitas razões para justificar a troca de documentos: 1. Documentos, especialmente documentos relacionados ao negócio, podem ser muito grandes, e eles são geralmente enviados como base das informações relacionadas. Eles podem ser compressados independente da mensagem SOAP. 2. Documentos podem ser legalmente ligados a documentos de negócio. No mínimo, sua forma original deve ser conservada através da troca e, ainda, eles podem precisar de serem arquivados e mantidos como evidências no caso de um descumprimento de acordo. Para estes documentos, uma documentação completa deveria ser guardada, incluindo comentários e referências a entidades externas. 3. Algum processamento da aplicação requer o completo descritivo do documento, incluindo comentários e referência à entidade externa. Com a legalidade de ligação dos documentos, é necessário preservar a completa descrição do mesmo, incluindo comentários e referências de entidades externas do documento original. 4. Quando enviado como anexo, é possível manusear o documento que pode estar expresso em uma linguagem não suportada expressa no schema do serviço web, sem estar no descritivo SOAP (como o Documento Type Declaration - DTD). Em essência, o serviço o qual recebe a requisição com o documento XML inicia um processamento de negócio a fim de realizar uma série de passos para completar a requisição. O conteúdo do documento XML é usado no processamento do negócio. Lidar com esse tipo de cenário efetivamente requer algumas considerações adicionais para serviços web. 1. É um bom projeto realizar a validação de qualquer informação requerida do documento XML o mais próximo possível do ponto final. Validações e transformações devem ser realizadas antes de se aplicar toda lógica de processamento no conteúdo do documento. 75 2. É importante considerar o tempo de processamento para uma requisição e o quanto o cliente pode esperar pela resposta. Quando um serviço espera por um documento XML como dado de entrada, incia-se o processamento de negócio baseado no conteúdo do documento, então clientes tipicamente não querem esperar por uma resposta. Um bom projeto quando o tempo de processamento pode ser alto é delegar uma requisição a um middleware a fim de retornar um identificador correlacionado para futuras referências do cliente. Tendo esses conceitos fundamentais de um serviço web bem definidos, o próximo capítulo mostra uma aplicação exemplo, bem como exemplos práticos desses conceitos. 76 4 ESTUDO DE CASO Antes de começar o capítulo, devemos definir o conceito de aplicação cliente web e aplicacão cliente desktop, onde o primeiro é uma aplicação que é usada via browser, mais especificamente, uma página web. Já o segundo, é uma aplicação instalada e executada em várias máquinas, onde cada máquina tem o seu executável. 4.1 DESCRIÇÃO DA APLICAÇÃO EXEMPLO Um cenário característico de computação distribuída bastante interessante é o bancário, onde os bancos possuem muitas agências espalhadas geograficamente, necessitando assim de uma forma de comunicação entre elas. Usando esse cenário, a aplicação exemplo deste trabalho visa simular uma transferência entre contas da mesma agência, usando um serviço web, para possibilitar a transferência por meio de uma aplicação cliente desktop e uma aplicação cliente web (Internet Banking). A figura 17 ilustra esse conceito. Figura 17: Demonstração da aplicção 77 4.2 DIAGRAMA DE CASO DE USO "O Diagrama de Caso de Uso descreve a funcionalidade proposta para o novo sistema. Segundo Ivar Jacobson, podemos dizer que um Caso de Uso é um documento narrativo que descreve a sequência de eventos de um ator que usa um sistema para completar um processo"[16]. Nesta seção, temos o diagrama de caso de uso da aplicação exemplo, onde o cliente solicita uma transferência ao serviço que, por sua vez, valida o usuário e verifica o saldo, para depois realizar a transferência de uma conta para outra. A figura 18 ilustra o caso de uso: Figura 18: Caso de uso Esse é o funcionamento da aplicação como um todo. As partes onde são tratadas as questões características do projeto serão detalhadas nos próximos tópicos. 4.3 ESPECIFICAÇÃO DO PROJETO 4.3.1 Tecnologias Para que a aplicação apresentada pudesse ser concreta e para que o objetivo deste trabalho fosse alcançado, foi necessária a utilização de uma base de dados 78 simples, pois o foco do trabalho não condiz com os interesses de pesquisa relacionados a banco de dados. Mas para tal, foi usado o banco de dados JavaDB, um banco próprio do Java de fácil manuseio, pois não possui grandes implementações de um banco de dados Robusto. A linguagem de programação Java foi utilizada para o desenvolvimento do serviço web e uma das aplicações cliente que consumirá o serviço em questão. Tal aplicação se dá pela crescente demanda de provimento de serviços portáveis, e Java oferece essa portabilidade acompanhada de segurança e estabilidade, tanto para o serviço web quanto para a aplicação cliente [1]. Para o mapeamento das tabelas, pertinentes ao JavaDB citado acima, no que tange ao serviço web, foi utilizado o framework Hibernate, que acompanha a portabilidade do Java. Ele oferece para o serviço todas as ferramentas para que o serviço web esteja em plena comunicação com a base de dados [3]. Em relação à aplicação cliente web, desenvolvida em Java, foi utilizada uma tecnologia bem difundida no ambiente de desenvolvimento web, o JavaServer faces, que facilita de forma significante o desenvolvimento e aumenta a produtividade do desenvolvimento de qualquer tipo de aplicação web baseada em Java [4]. Para ser apresentado o verdadeiro potencial que um serviço web oferece, foi necessário o desenvolvimento de uma aplicação que mostrasse sua característica marcante, a interoperabilidade. Aplicação esta, construída utilizando a linguagem de programação C Sharp. Essa aplicação cliente, diferentemente da primeira, não é uma aplicação web, e sim uma aplicação desktop, apresentando, assim, uma outra característica dos serviços web, a independência de linguagem de programação. Hibernate Para iniciar o desenvolvimento da aplicação web servidor, primeiramente definiuse que a mesma utilizará os padrões de projeto Singleton e o desenvolvimento em camadas. O Singleton se justifica no argumento que, vários clientes terão acesso à aplicação, mas não necessariamente a aplicação necessita de ter vários acessos à 79 base de dados. Abrir uma conexão com uma base de dados, do ponto de vista do desempenho, é muito custoso. Assim, utilizando o padrão Singleton, que diz que uma determinada classe terá somente uma instância durante toda a aplicação, tal instância é criada pelo método construtor da classe, entào teremos a classe que efetivamente gerencia toda a conexão com a base de dados somente instanciada uma única vez [3]. Isso pode ser visto na figura 19, que corresponde ao método construtor da classe HibernateUtil. Figura 19: Método construtor da classe HibernateUtil A aplicação web a ser apresentada será desenvolvida utilizando a linguagem de programação Java, por ser uma linguagem portável e segura. Utilizando a linguagem Java para o desenvolvimento, será necessário criar uma forma da aplicação se comunicar com a base de dados. Mas, como visto anteriormente, a aplicação possui uma única conexão com o servidor de aplicação. Teremos vários usuários fazendo requisições a todo tempo e precisaremos de alguém para gerenciar essas requisições e respostas e, ainda, será necessário que quem gerencie as requisições e respostas seja também portável, já que a linguagem de desenvolvimento é portável. Para tal feito, foi utilizado o framework Hibernate. O Hibernate trabalha da seguinte forma: Mapeia os dados relacionais da base de dados da aplicação em classes Java, tendo essas classes regras específicas da base de dados, criando uma base estrutural para a aplicação de forma consistente, sem ferir as regras especificadas na criação da base de dados. O Hibernate, além de mapear, gerenciará a conexão da aplicação com a base de dados, pois o mesmo é que fará a comunicação dos dados de entrada e saída da aplicação com o repositório da aplicação web (banco de dados). 80 Foi criada uma classe chamada HibernateUtil que possui várias diretivas; diretivas estas que norteiam o hibernate sobre a forma de trabalhar, de se comunicar e de como gerenciar todas as conexões que são a ele requisitadas. Para maiores informações sobre a classe HibernateUtil, vide anexo 5. 4.3.2 Arquitetura "O Diagrama de pacotes, ou diagrama de módulos, definido pela UML descreve os pacotes ou pedaços do sistema divididos em agrupamentos lógicos mostrando as dependências entre estes, ou seja, pacotes podem depender de outros pacotes"[17]. A arquitetura do serviço web é representada através do diagrama de pacotes. Tal diagrama contém os pacotes usados no exemplo, bem como acontece a comunicação entre eles. A figura 20 representa este diagrama: Figura 20: Diagrama de pacotes 4.3.3 Diagramas de classes "O diagrama de classe está no núcleo do processo de modelagem de objetos. Ele modela as definições de recursos essenciais à operação correta do sistema. Todos os 81 outros diagramas de modelagem descobrem informações sobre esses recursos (como valores de atributo, estado e restrições no comportamento) que por fim precisam ser encaminhados ao diagrama de classes. O diagrama de classes é a origem para a geração de código (converter do modelo para o código) e o destino para a engenharia reversa (converter do código para o modelo)"[2]. Os diagramas a seguir, descrevem as classes que foram utilizadas no projeto do serviço web. Diagrama de classes Entity Essas classes representadas no diagrama da figura 21 são classes mapeadas pelo hibernate, baseadas no banco relacional da aplicação, pertinentes à camada de modelo entre a aplicação e o banco de dados. Figura 21: Diagrama de classes Entity Diagrama de Classes DAO As classes descritas na figura 22 são responsáveis pelo acesso à base de dados. 82 Figura 22: diagrama de classe DAO Diagrama de classes Faces Na figura 23, estão representadas as classes que são interfaces entre a camada de regra de negócio e a camada de interface web. Para uma melhor visualização, veja a figura 20 (4.3.2 Arquitetura). Figura 23: Diagrama de classes faces 83 4.3.4 Diagrama de sequência "Diagrama de sequência (ou Diagrama de Sequência de Mensagens) é um diagrama usado em UML (Unified Modeling Language), representando a sequência de processos (mais especificamente, de mensagens passadas entre objetos) num programa de computador. Como um projeto pode ter uma grande quantidade de métodos em classes diferentes, pode ser difícil determinar a seqüência global do comportamento. O diagrama de sequência representa essa informação de uma forma simples e lógica"[18]. A figura 24 ilustra o diagrama de sequência da aplicação. Figura 24: Diagrama de sequência 4.3.5 Classes Entity As classes de entidade (classes entity ) são classes mapeadas do banco de dados pelo framework usado na aplicação apresentada. Essas classes possuem métodos e atributos que estão em conformidade com o banco de dados relacional usado. Cada atributo em uma entidade está diretamente relacionado a uma coluna em uma determinada tabela (a qual essa entidade faz referência). 84 Toda classe de entidade deve ser declarada na classe HibernateUtil, para que esta tenha conhecimento de sua existência podendo gerenciá-la. Caso ela não seja declarada, a mesma não será reconhecida internamente no projeto e acarretará em um erro. Na aplicação apresentada, foram criadas quatro classes de entidade que estão descritas nos anexos 2, 3, 4 e 5. 4.3.6 Classes DAO Agora que temos a base estrutural da aplicação, que é a base de dados e a classe que gerenciará a aplicação, inicia-se a fase de desenvolvimento das classes que irão manipular as informações que serão passadas ou recebidas das classes mapeadas pelo hibernate, e são chamadas classes DAO, que fazem parte do padrão de projeto DAO, chamado de acesso direto a objetos. Essas classes irão fazer toda a manipulação dos dados na base de dados utilizada pela aplicação. As classes mapeadas pelo hibernate chamam-se entidades, e as entidades são utilizadas exclusivamente pelas DAO, quando se utiliza esse padrão de desenvolvimento. Na aplicação apresentada, foi criada uma classe genérica abstrata. A classe abstrata é sempre uma superclasse que não possui instâncias. Ela define um modelo para uma funcionalidade e fornece uma implementação incompleta - a parte genérica dessa funcionalidade - que é compartilhada por um grupo de classes derivadas. Cada uma das classes derivadas completa a funcionalidade da classe abstrata adicionando um comportamento específico. Essa classe foi chamada de GenericDAO e está representada no anexo 6. 4.3.7 Classes faces As classes faces fazem parte de uma camada da aplicação que pode conter várias subdivisões, a camada da regra de negócio. A camada da regra de negócio de uma aplicação web pode conter divisões como controle, interação, processamento e, ainda, 85 conter uma divisão só pra servir de meio entre a camada de controle e a camada de interface da aplicação web. Na aplicação apresentada, as camadas de controle, interação e processamento não foram divididas, pois o exemplo apresentado é muito pequeno para que haja efetivamente a necessidade de tais divisões. Muitas camadas em aplicações robustas são necessárias para que se detenha um maior controle sob o fluxo de informação por que cada camada é responsável, mas em aplicações pequenas, como o exemplo apresentado, essas divisões só tornariam a aplicação mais complexa para o desenvolvimento, sem incremento no desempenho e tampouco uma melhora no resultado obtido. A aplicação apresentada possui uma única camada de regra de negócio, chamando suas classes de classes faces. Estas classes, além de controlarem o fluxo das informações são responsáveis pela interação entre a camada de interface para o usuário e a camada DAO, gerenciando as informações de entrada e saída da aplicação. Entende-se entrada de informação as informações que o usuário fornece na interface gráfica, e, saída de informação, tudo aquilo que é apresentado para o usuário após realizar determinada tarefa e o resultado que é obtido com a realização dessa determinada tarefa. A aplicação apresentada possui somente duas classes faces. Nas camadas DAO, para cada classe de entidade existe uma classe DAO, mas na camada de regra de negócio isso não é necessário. Tal necessidade só se justifica quando a aplicação possui meio de interação de negócio com a classe implementada. No caso da aplicação apresentada, teremos uma classe faces ClienteContaFaces que é referente a ClienteConta (pojo, que é a classe de entidades gerada pelo hibernate) e uma outra classe faces que não fará menção a nenhum pojo específico, TransferenciaFaces. ClienteContaFaces tem por finalidade controlar toda informação pertinente a uma determinada conta de um cliente específico, atrelado a uma única senha. As classes faces podem ser conferidas nos anexos 7 e 8. 86 4.3.8 Páginas web As páginas de uma aplicação web representam a camada de interação entre o usuário e a aplicação. Estas podem ser desenvolvidas de várias formas, usando vários tipos de padrões e vários tipos de frameworks e bibliotecas especificas que melhoram o desempenho e ajudam na melhora dos componentes, proporcionando uma melhor experiência para o usuário. As páginas podem ser desenvolvidas de vários modos, porém todos estes usando HTML como linguagem de desenvolvimento. A aplicação apresentada utilizou o framework JavaServer faces que fará parte do container da aplicação (arquivo xml onde estão descritas diretivas de execução da aplicação), que será quem fará a ligação dos atributos de uma página com os atributos de uma determinada classe. Na utilização do framework JavaServer faces, toda informação a ser manipulada, seja ela de entrada ou de saída, deve estar entre as tags <h:form></h:form>, e todas as páginas da aplicação apresentada utilizam-se dessa tag. Não serão abordados e explicados os códigos HTML das páginas, por não ser o foco do trabalho. 4.3.9 Diagrama de implantação "O diagrama de implantação modela o hardware do ambiente de implantação. Cada nó em um diagrama de implantação normalmente representa um tipo de hardware. Um nó também pode representar um ser humano ou uma unidade organizacional, ou, mais precisamente, a função que uma pessoa pode realizar"[2]. O ambiente físico teórico da aplicação exemplo está descrito na figura 25: 87 Figura 25: Diagrama de implantação 4.4 CONSTRUINDO E CONSUMINDO O SERVIÇO WEB Nesta seção será apresentada a maneira como o serviço web foi construído, publicado e consumido, com exemplos práticos e demonstrações de fragmentos de códigos Java e C Sharp, usados no desenvolvimento da aplicação. 4.4.1 Implementando um serviço web A primeira coisa a fazer para se implementar um serviço web é criar uma classe que detenha todo seu escopo, e nessa aplicação exemplo foi criada uma classe chamada TransferenciaService. Esta classe fará uso de toda a estrutura da aplicação já desenvolvida, porém provê a funcionalidade de transferir um determinado valor de uma conta para outra de forma mais simplória. O código-fonte da classe TransferenciaService é mostrado a seguir, na figura 26: 88 Figura 26: Classe TransfereciaService O trecho entre a linha 1 e a linha 6, mostra a qual pacote pertence a classe e as devidas importações necessárias para a classe, sendo esta a parte básica do serviço. A anotação na linha 8 informa que esta classe em questão será um serviço web. Esse é o motivo da anotação @WebService() aparecer antes da declaração da classe. Após a classe ser informada que ela será um serviço, devemos desenvolver o método (função que realizará a transferência) que será provido, feitos assim como na linha 15. Esta anotação informa que o método descrito ali será disponibilizado pelo serviço web. Uma vez que a classe e os métodos foram declarados, os atributos do método seguem o mesmo princípio assim como mostrado no código entre as linhas 16 e 20. Esta classe faz uso de outra classe, que já está definida e declarada na aplicação, tendo como objetivo somente fornecer uma de suas funcionalidades, ou seja, TransferenciaFaces compõe o acervo de funcionalidades que o serviço irá prover, podendo ser conferido no anexo 8. Logo após testar o seu status, o método realizarTransferencia() que foi criado na classe TransferenciaFaces para realizar uma transferência é chamado, passando os devidos argumentos e assim realizando a transferência. O atributo mensagem que 89 está no escopo da classe é para retornar uma mensagem ao usuário quando o serviço completar sua tarefa, e o método de transferência utilizado retorna uma mensagem. Sendo assim, seu valor será certamente atribuído ao atributo mensagem. Depois de concluído o método, o serviço encerra sua execução enviando para a interface web do cliente o resultado obtido. Agora, falta apenas registrar o serviço e descrevê-lo no arquivo que fará referência ao serviço disponibilizado, o WSDL. Segue abaixo, na figura 27, o arquivo WSDL da aplicação apresentada. Figura 27: WSDL Na linha 1 encontra-se a versão do arquivo e a formatação empregada no uso dos caracteres que irão compor o serviço. A linha 4 possui a tag <definition>. Esta tag 90 inicia a definição do schema a ser usado pelo serviço web. No schema estão descritas informações como os tipos dos atributos esperados pelo(s) métodos(s) oferecidos pelo(s) serviço(s). A tag também define a localização do serviço, definindo para o mesmo um namespace e define o envelope SOAP do serviço web. Na linha 10, é associado ao namespace o seu devido schema. A partir da linha 16 até a linha 21 são definidos os nomes das mensagens que serão trocadas entre o provedor do serviço e a aplicação que o consome. "Transferencia" diz respeito à mensagem do lado cliente e "TransferenciaResponse" diz respeito à mensagem que virá do servidor. A partir da linha 22, inicia-se a identificação do porto dos serviços, que no caso da aplicação apresentada será somente um único serviço. O porto será responsável por interpretar a mensagem que vem do cliente e a mensagem que é enviada do servidor. Note que os nomes que foram definidos entre a linha 16 e a linha 21 está sendo referido na tag pertinente ao porto. A partir da linha 28 é explicitado ao arquivo wsdl quais serão as características do envelope SOAP a serem trocadas entre provedor de serviço e consumidor deste. A linha que inicia essas explicitações diz qual porto será usado para qual serviço e, logo abaixo, na linha 29, é dito qual será o tipo de informação que será trocada e sob qual protocolo este irá ser transportado e, no caso da aplicação apresentada, o tipo será de documento (document) e o protocolo será o HTTP. A próxima etapa do arquivo, que está na linha 30, diz para o arquivo qual será o nome do operação que ele irá se referenciar quando uma requisição chegar a ele. E até a linha 38 é descrito que o transporte dos atributos passados como parâmetro à operação esperada dar-se-á na forma literal que é a forma que os atributos não sofrerão nenhum tipo de criptografia antes e nem depois de serem enviados. Finalmente, a linha 40 irá explicitar o nome do serviço a ser procurado no provedor do mesmo, e a linha 41 mostra qual o seu porto e quem será responsável por sua ligação com o serviço que está no endereço fornecido na linha 42. E, assim, foi definido o arquivo wsdl para o serviço apresentado neste trabalho. 91 4.4.2 Consumindo um serviço web Cliente web Java Agora que o serviço web já está disponível e pronto para aceitar requisições, iremos criar uma simples aplicação web que faça o consumo do serviço web. Essa aplicação cliente não fará uso de nenhuma biblioteca. Sendo a aplicação cliente portável, seria injustificável ter que obrigar uma determinada aplicação que deseje fazer uso de um serviço, ter que fazer uso de alguma biblioteca para tal. Primeiro a se fazer será construir o schema que será usado pelo arquivo wsdl do cliente. O schema da aplicação apresentada está descrito abaixo, na figura 28: Figura 28: Schema da aplicação O arquivo começa descrevendo o elemento que irá usar e logo após, define a aplicação que irá usar (o mesmo atributo foi descrito no wsdl do servidor do serviço, e estes devem ser iguais para que se comuniquem). Após, é definido o nome dos atributos que o serviço web está esperando e o tipo dos mesmos. Tais tipos foram descritos na classe onde o serviço web foi implementado e precisam estar conformes. 92 A última parte do arquivo define o nome da mensagem resposta que será enviada ao cliente. A mesma foi descrita no wsdl da aplicação servidora. Agora que tem-se o schema que o arquivo wsdl do cliente irá usar, a figura 29 ilustra o arquivo wsdl do cliente: Figura 29: WSDL do cliente A mesma estrutura usada para descrever o wsdl do serviço servidor é usada para descrever o arquivo wsdl do serviço cliente. Agora, será construída a classe que efetivamente fará uso do serviço web. Chamamos o arquivo de ClienteFaces, e este tem por finalidade receber os atributos descritos na página que lhe é apresentada e, a partir do método descrito nessa classe, fazer uso do serviço web. 93 A figura 30 apresenta o código-fonte da classe: Figura 30: Classe ClienteFaces Além de todos os métodos getters e setters dos atributos da classe, esta possui o método que efetivamente irá chamar o serviço web. Este método recupera o seu porto a partir do serviço encontrado no wsdl e, a partir daí, faz uso do método transferencia() como se estivesse trabalhando localmente, independente da linguagem ou plataforma em que o método foi desenvolvido, alcançando, assim, o objetivo da aplicação apresentada. Após a conclusão do método, o mesmo retorna para o usuário uma mensagem, informando se a transferência foi efetuada ou não. 94 Cliente web C Sharp Visando a mostrar a interoperabilidade de um serviço web, o próximo passo é uma aplicação cliente desktop desenvolvida na linguagem C Sharp. Este cliente tem o mesmo objetivo do cliente Java, que é realizar uma transferência de uma conta para outra. Mas para que esse cliente consiga ter acesso ao serviço web, primeiramente, ele deve saber onde esse serviço está, ou seja, sua localização. Isto é feito, informando a ele o WSDL do serviço, que tem em seu conteúdo a localização do mesmo, bem como seus métodos e parâmetros, como pode ser visto na figura 31. Figura 31: Arquivo WSDL importado pelo C Sharp 95 Depois que o wsdl é conhecido, todos os métodos e parâmetros do serviço são conhecidos. São criadas referências dentro do projeto C Sharp, dentro do arquivo reference.cs, como segue no fragmento de código a seguir: Figura 32: Método criado dentro do arquivo reference.cs Depois que o serviço e seus métodos foram localizados, basta ser acessado de dentro do arquivo onde ele será chamado. Normalmente, como se fosse um método local, como exemplificado na figura 33: Figura 33: Chamada do método transferencia dentro do cliente C Sharp 4.4.3 Visualização da aplicação em funcionamento Ao iniciar a aplicação o seu estado inicial é mostrado na figura 34, onde há o netBeans ao fundo, contendo os resultados de uma consulta ao banco e a saída do servidor de aplicação, antes de executar qualquer requisição. Já em primeiro plano, há a aplicação cliente web, rodando no firefox em seu estado inicial. 96 Figura 34: Estado inicial do serviço web e aplicação cliente web Ao efetuar uma transferência da conta de origem 1 para a conta de destino 2, a aplicação cliente obteve uma resposta do serviço web, dizendo que a transferência foi realizada com sucesso. Já em segundo plano, há o netBeans com o resultado de uma consulta ao banco e a saída do servidor de aplicação após a excução da transferência, como pode ser visto na figura 35. De maneira análoga ao cliente web Java, o cliente desktop C Sharp envia a requisição para o servidor e recebe uma resposta dizendo que a transferência foi realizada, como pode ser visto na figura 36. Desta maneira, ocorre toda a transação entre cliente e servidor. Além de mostrar essa transação, pode-se perceber a interoperabilidade entre aplicações desenvolvidas em linguagens diferentes, deixando todo o processamento para o serviço web, e ficando o cliente responsável apenas por enviar uma requisição, receber uma resposta do servidor e mostrar um resultado ao usuário. 97 Figura 35: Estado do servidor e aplicação cliente após a execução da transferência Figura 36: Estado do servidor e aplicação cliente C Sharp depois de realizada uma transferência 98 5 CONCLUSÃO Vários modelos de computação distribuída foram estudados, em todos os casos foram levantadas vantagens, desvantagens e características marcantes de cada um. Dessa forma, foi possível constatar que cada modelo possui peculiaridades que fazem com que se adequem a determinado tipo de cenário de aplicação. Com base no estudo feito e no cenário do estudo de caso, foi escolhido um modelo específico (web service) para o desenvolvimento de uma aplicação. Além disso, o volume de pesquisas realizadas na área de serviços web evidencia a sua importância e o grande interesse ainda remanescente por parte de organizações e instituições acadêmicas, por essas razões, tal modelo foi escolhido para ser utilizado. No estudo de caso desenvolvido, foi exemplificado de modo prático um serviço web, desde a sua fase inicial, passando pela implementação até sua publicação para consumo de terceiros. Mostrando também a interoperabilidade entre linguagens de desenvolvimento diferentes, justificando assim um dos objetivos do trabalho. Para auxiliar no desenvolvimento da aplicação, frameworks como Hibernate, JavaServerFaces e a IDE NetBeans foram utilizados, trazendo desta forma facilidades que antes não existiam, tornando mais fácil o aprendizado e desenvolvimento do serviço web e das aplicações clientes. Em um contexto geral, com a existência de sistemas legados, possibilidades de consumo de serviços de terceiros e levando em consideração as características apresentadas ao longo do trabalho, o conceito mais importante foi o de interoperabilidade, pois, permitiu-se que uma aplicação construída em uma linguagem diferente consumisse o serviço sem problemas. 99 Caracterizando assim, a integração entre sistemas de plataformas e linguagens diferentes. Por fim, ao longo desse trabalho foram observados alguns tópicos que não faziam parte do escopo da pesquisa, mas foram entendidos como interessantes fontes de trabalhos futuros: propõe-se a pesquisa mais detalhada em soluções para o gerenciamento de serviços por meio de outros serviços web, mostrando quais são os pontos fracos e fortes desse modelo de desenvolvimento de serviços web; Além disso, evoluir o estudo de caso de forma a agregar aspectos de segurança, confiabilidade, tolerância a falhas e disponibilidade é outro ponto interessante, visto como trabalho futuro. 100 REFERÊNCIAS [1] Edson Gonçalves. Desenvolvendo Aplicações web com JSP, Servlets, JavaServer Faces, Hibernate, EJB 3 Persistence e Ajax. Ed. Ciência Moderna. 2007 [2] Tom Pender. UML a Bíblia. Ed. Campus. 2004. [3] Cristian Bauer, Gavin King. Java Persistence com Hibernate. Editora Ciência Moderna. 2005. [4] David Geary, Cay Horstmann. JavaServer Faces, Fundamentos 2a Edição. Editora AltaBooks. 2007. [5] George Couluris, Jean Dollimore, Tim Kindberg. Sistema Distribuído: Conceito e Projeto. Ed. Bookman. 2007. [6] Deitel, Choffnes. Sistemas Operacionais. Prenticel-Hall. 2007. [7] Sudkamp T.. Languages and machines in an introduction to the theory of computer science. Addisson Wesley. 1988. [8] Ian Foster, Carl Kesselman. The Grid: Blueprint for a New Computing Infrastructure. Morgan Kaufmann. 1998. [9] Rajkumar Buyya, David Abramson, Jonathan Giddy, Nimrod/G. An Architecture for a Resource Management and Scheduling System in a Global Computational Grid. Beijing, China. 2000. [10] M. P. Papazoglou, B. J. Kramer, and J. Yang. Leveraging Web-services and peerto-peer Networks. 15th Int. Conf. on Advanced Information Systems Engineering. 2003. [11] Gregory R. Andrews. Foundation of multithreaded, parallel, and Distributed Pogramming 1st Edition. Ed. Addison-Wesley. 2000. [12] Wikkipedia. Wikkipedia Distributed Programming. http://www.wikipedia.org. Acessado em 21/03/2007. 2007. URL: [13] InfoWester. Cluster. 2007. URL: http://www.infowester.com/cluster.php. Acessado em 10/11/2007. [14] Clube do Hardware. Clube do Hardware - Clusters. 2007. http://www.clubedohardware.com.br/artigos/153. Acessado em 10/11/2007. URL: [15] Web Service Consortium - W3C. WSDL. 2009. URL: http://www.w3.org/TR/wsdl. Acessado em 10/05/2009. 101 [16] Wikkipedia. Diagrama de Cado de Uso. 2009. URL: http://pt.wikipedia.org/wiki/DiagramadeCasodeUso. Acessado em 20/05/2009. [17] Wikkipedia. Diagrama de Pacotes. 2009. http://pt.wikipedia.org/wiki/Diagramadepacotes. Acessado em 20/05/2009. URL: [18] Wikkipedia. Diagrama de Sequência. 2009. URL: http://pt.wikipedia.org/wiki/Diagramadesequência. Acessado em 20/05/2009. [19] Sun MicroSystem. Java BluePrints, Designing Web Services with the J2EE com JAX-RPC. 2009. URL: http://java.sun.com/blueprints/guidelines/designingwebservices/. Acessado em 16/03/2009. 102 Anexo 1 - Classe HibernateUtil 103 Anexo 2 - Classe Cliente - Entity 104 Anexo 3 - Classe Conta - Entity 105 Anexo 4 - Classe ClienteConta - Entity 106 Anexo 5 - Classe ClienteContaPK Entity 107 Anexo 6 - Classe GenericDAO 108 Anexo 7 - Classe ClienteContaFaces 109 Anexo 8 - Classe TransferenciaFaces 110