Apresentação do PowerPoint - CBSoft 2012
Transcrição
Apresentação do PowerPoint - CBSoft 2012
III CBSoft – Congresso Brasileiro de Software: Teoria e Prática Natal-RN, 28 de setembro de 2012 2/121 * Prof. Frederico Lopes (UFRN) * Prof. André Almeida (IFRN) * Profa. Thais Batista (UFRN) * Everton Cavalcante (UFRN) * Renato Gondim (UFRN) * Thomas Diniz (UFRN) * Thiago Cesar (UFRN) * Arthur Cassio (UFRN) 3/121 * Introdução * Estudo de Caso – Health Watcher * Plataformas * Amazon AWS * Google App Engine * OpenStack * Conclusão 4/121 * Introdução * Estudo de Caso – Health Watcher * Plataformas * Amazon AWS * Google App Engine * OpenStack * Conclusão 5/121 Explosão de domínios de aplicações Proliferação de dispositivos Poderosos processadores multicore Poder da virtualização sobre hardware Metodologias de software Maior largura de banda para comunicação Fonte: Ramamurthy and Madurai. Wipro Chennai 2011 * Era atual da Computação 6/121 Computação em Nuvem modelo computacional para acesso conveniente, sob demanda e de qualquer localização, a uma rede compartilhada de recursos computacionais (redes, servidores, armazenamento, aplicativos e serviços) que possam ser prontamente disponibilizados como serviços e acessados com um esforço mínimo de gestão ou de interação com o provedor de serviços. P. Mell and T. Grance (2011) The NIST Definition of Cloud Computing. NIST, EUA. 7/121 Computação em Nuvem A nuvem é um grande reservatório de recursos virtualizados facilmente utilizáveis e acessíveis (como hardware, plataformas de desenvolvimento e/ou serviços). Esses recursos podem ser dinamicamente reconfigurados para ajustar a carga (escala) variável do sistema, permitindo também um uso ótimo dos recursos. Tal reservatório é geralmente explorado por um modelo pay-per-use no qual as garantias são oferecidas por um Provedor de Infraestrutura por meio de SLAs (Service Level Agreement - Acordo de Nível de Serviço) L.M. Vaquero et al., “A break in the clouds: towards a cloud definition”, ACM SIGCOMM Computer Communication Review, 2008 8/121 * Algumas vantagens de se implantar uma aplicação na nuvem * Elasticidade * Balanceamento de cargas * Confiabilidade * Redução de custos * Hardware, software, técnicos, energia 9/121 * Alguns serviços que podem ser usados na implantação * Máquinas virtuais * Armazenamento de arquivos * Armazenamento de dados * * SQL based Non SQL based 10/121 * Apresentar: * Implantação de uma aplicação real * Serviços de diferentes plataformas * Amazon AWS * Google App Engine (GAE) * OpenStack * Relação com o Minicurso 7 * Foco na implantação/uso do AWS e OpenStack 11/121 * Introdução * Estudo de Caso – Health Watcher * Plataformas * Amazon AWS * Google App Engine * OpenStack * Conclusão 12/121 * Desenvolvido por Soares et al., 2006 * Aplicação Web Java * Sistema que registra informações de saúde pública de uma cidade, através do registro de queixas * Aplicação real e não trivial, com uso de servlets, JDBC, RMI, além de possuir um bom design arquitetural * Padrões de projeto 13/121 * Funcionalidades * Usuário é qualquer cidadão que pode efetuar reclamações ou consultar os serviços de saúde disponíveis * Quando uma reclamação é registrada, a mesma é encaminhada a um setor competente, sendo a resposta de domínio público 14/121 * Funcionalidades * Registros de Reclamação * * Intoxicação Alimentar * Reclamações diversas Maus tratos de animais ou doenças transmitidas por animais * Os administradores do sistema podem registrar as informações dos serviços de saúde 15/121 * Camadas * View Layer: responsável pela interface com usuário e pela a solicitação dos serviços aos servlets * Distribution Layer: externalização dos dados, permitindos outras aplicações terem acesso * Business Layer: regras de negócio * Data Layer: responsável pelo controle da persistência do sistema 16/121 17/121 * Introdução * Estudo de Caso – Health Watcher * Plataformas * Amazon AWS * Google App Engine * OpenStack * Conclusão Health Watcher 18 19/121 * Amazon Web Services * Oferece diversos serviços de nuvem através do uso de Web services * Serviços como: Capacidade Computacional, Armazenamento de Dados, Implantação de Aplicações, Armazenamento de Arquivos * Além do acesso através de Web services, disponibiliza console de gerenciamento Web e API para a Java,PHP, Python, Ruby e .Net 20/121 * Cada serviço possui sua própria tabela de custo, que podem variar, de tráfego de acesso, horas de instância, número de implantações * Para novos usuários a AWS criou a Free Tier, que permite o uso gratuito de alguns serviços, com limitações * Detalhes: http://aws.amazon.com/free/ 21/121 * AWS-HW * Amazon EC2: Serviços de computação (máquinas Virtuais) * Elastic Beanstalk: Implantação de aplicações (Java, PHP, Python,.Net) * RDS: Serviço de banco de dados relacional * S3: Serviço de armazenamento * SimpleDB: Armazenamento de log da aplicação 22/121 * Preparando ambiente de desenvolvimento * Eclipse Juno 4.2 – JEE (www.eclipse.org) * AWS Toolkit for Java – Eclipse Plugin * Google Eclipse Plugin e SDK* * Código do Health Watcher * Disponível em: http://code.google.com/p/hw-cbosft2012-cloud/ *Aplicação possui suporte para ser implantada nas duas plataformas 23/121 * AWS Eclipse Plugin * Help -> Install new Software * Add Site: http://aws.amazon.com/eclipse/ 24/121 * Configurando ambiente * Importar o projeto do Health Watcher * Ao importar o projeto o Eclipse ira baixar o SDK da Amazon para ser integrado ao projeto * Passaremos agora a analisar os aspectos relacionados ao uso dos serviços por parte da nossa aplicação 25/121 * SimpleDB * Serviço de armazenamento não relacional * Diferente de banco de dados do tipo NoSQL * Provê flexibilidade e escalabilidade sem o overhead associado a banco de dados * Estruturado em formato de texto para armazenamento * http://aws.amazon.com/simpledb/ 26/121 * SimpleDB - Estrutura de funcionamento Add Itens Region Domain Query Itens Delete Itens Domains equivalem a tabelas de banco de dados, porém não é possível realizar consulta entre domains. Para usar, através da API criamos o domínio e em seguida adicionamos uma entrada no domínio 27/121 * SimpleDB * Para utilizar qualquer API da Amazon é necessário realizar a autenticação com a conta criada * São usados os valores de acessKey e secretKey que são gerados no momento da criação da conta * Para acessar os valores: My Account-> Security Credentials * Colocar os valores em um arquivo na raiz chamado AccessCredentials.properties 28/121 * SimpleDB - Criação do Objeto SimpleDB Classe healthwatcher.Constants 29/121 * SimpleDB – Criação e alteração do domínio Classe lib.logging.LogMechanism 30/121 * S3 * Serviço de armazenamento * Permite arquivos de até 5 terabytes * Define regras de acesso para upload e download dos arquivos armazenados * Acessar o painel de Controle, Storage->S3 31/121 * S3 * Primeiro devemos criar um bucket, que representa uma unidade de armazenamento * Dentro desse bucket podemos criar pastas, adicionar qualquer tipo de arquivo de até 5 terabytes * Em seguida definimos a permissão de acesso ao bucket * Através da API recuperamos a referência ao bucket e adicionamos um arquivo 32/121 * S3 * No Health Watcher, ao cadastrar um sintoma, o administrador pode adicionar um foto ilustrativa do mesmo * Armazenaremos essa foto no bucket * Para acessar o serviço através da API precisamos fornecer credenciais válidas e com permissão de acesso ao referido bucket 33/121 * S3 - Armazenando arquivo no bucket Classe healthwatcher.view.command.InsertSymptom 34/121 * RDS * Serviço para armazenamento de banco de dados relacional * Preço cobrado por hora DB Instance Class (On-Demand) Micro DB Instance Small DB Instance Large DB Instance Extra Large DB Instance High-Memory DB Instance Class Extra Large DB Instance Double Extra Large DB Instance Quadruple Extra Large DB Instance $0.025 $0.105 $0.415 $0.830 $0.585 $1.170 $2.340 35/121 * Amazon RDS * Antes de criar o banco de dados: * criar um grupo de segurança, que define a política de acesso ao banco de dados * As opções disponíveis para permissão é o estabelecimento faixa de IP com acesso ou associar algum grupo de segurança do EC2, liberando as instâncias para acesso 36/121 37/121 * Amazon RDS * Criar uma instância * DB Instances -> Launch DB Instance * Preencher as seguintes informações: * Tipo de instância * escolher micro para evitar cobranças altas * Espaço alocado * Usuário e senha de acesso ao banco de dados 38/121 39/121 40/121 * Ao final do processo é criado uma instância com o banco de dados * Para conectar ao banco usar o endpoint fornecido * Modificaremos a classe Constants no pacote healthwatcher * Devemos alterar a URL para informar o endpoint, usuário e senha de acesso ao banco de dados 41/121 * RDS * Utilizarmos o script sql para criação do banco de dados * Para isso temos basicamente duas opções: * Acessar o banco de dados através de um gerenciador e carregar o script SQL; nesse caso é necessário fornecer permissão de acesso a máquina * Utilizar o cliente MySQL de uma máquina virtual do EC2 que tenha permissão de acesso 42/121 * RDS * Modificando a classe Constants * Alterar as variáveis: * DB_URL = EndPoint * DB_USER=<usuário_BD> * DB_PASS=<Senha_usuario_BD> 43/121 * Elastic BeanStalk * Permite a implantação direta de aplicações, sem a necessidade de configuração de instâncias do EC2 * Suporte atual para implantação de aplicações Java, PHP e Python * Iremos demonstrar agora qual seria o processo para implantar nossa aplicação utilizando o plugin do Eclipse 44/121 * Elastic BeanStalk * Run on Server * Selecionar o tipo de instância EC2 desejada 45/121 * Elastic Beanstalk * Em seguida informar o nome da aplicação e do ambiente * O ambiente refere-se a configuração da instância EC2 que irá rodar a aplicação 46/121 * Elastic BeanStalk * Na última etapa podemos informar se queremos associar uma chave a instância * Permite acesso direto a instância criada * Criando chaves -> Services ->EC2 -> Key Pairs * Seguindo os passos, a aplicação será empacotada e implantada * O arquivo war é armazenado no serviço S3 47/121 * Elastic BeanStalk * Após a implantação, devemos verificar qual group de segurança está associado a instância * Esse mesmo grupo deve ser associado a instância que roda o banco de dados, sob pena da aplicação não funcionar * Para acessar o console do BeanStalk, acesse Services->BeanStalk 48/121 * Provimento de API para acesso através de serviços WEB * Possui grande variedade de serviços integráveis a aplicações existentes * Constante atualização dos serviços, proporcionando melhorias * Curva de aprendizado pequena para utilização dos serviços 48 49/121 * Introdução * Estudo de Caso – Health Watcher * Plataformas * Amazon AWS * Google App Engine * OpenStack * Conclusão Health Watcher 50 51/121 * É um serviço fornecido pela Google, que permite aos desenvolvedores criar aplicações que podem rodar na sua infraestrutura 52/121 53/121 * * * * Configuração simples da aplicação Nenhuma administração de sistemas Nenhum ajuste de desempenho Dimensionamento automático! 54/121 * Preparando ambiente de desenvolvimento * Eclipse Juno 4.2 – JEE (http://www.eclipse.org) * Google Plugin para Eclipse * Código do Health Watcher 55/121 * Google Eclipse Plugin * Help -> Install new Software * Add Site: http://dl.google.com/eclipse/plugin/4.2 56/121 57/121 * Registrar uma conta na Appspot http://appengine.google.com 58/121 * Configurando ambiente * Criar uma nova aplicação GAE * Copiar o código fonte do HW dentro da pasta src * Copiar o conteúdo da pasta WebContent dentro da pasta war 59/121 Para permitir que o GAE distribua solicitações de aplicações em diversos servidores da web e para impedir a interferência de uma aplicação em outra, a mesma é executada em um ambiente “sandbox” restrito 60/121 * * * * Balanceamento de carga Requisições web Hospeda conteúdo estático Separa os arquivos de programação 61/121 * É uma extensão SDK do GAE para executar aplicações do App Engine localmente. * Cada AppServer pode executar somente uma aplicação por vez * É possível adicionar diversos AppServers para hospedar diversas aplicações. 62/121 63/121 * Uma aplicação pode consumir recursos até determinados contingentes. * Com estas cotas, o GAE garante que sua aplicação não ultrapassará o seu orçamento. https://developers.google.com/appengine/docs/quotas 64/121 65/121 * Escalabilidade horizontal – Consiste em adicionar mais máquinas de tal modo que seja possível distribuir as requisições entre estas máquinas. * * * * Replicado e tolerante a falhas Processamento paralelo Desempenho previsível de consulta Sem travamentos 66/121 * Para o mecanismo de persistência do HW, foi usada a API JDO (Java Data Object) para o armazenamento de dados no GAE, que é configurado no arquivo jdoconfig.xml. * Para criar classes JDO, utilizam-se anotações Java para descrever como as instâncias devem ser armazenadas e como devem ser recriadas ao serem recuperadas do armazenamento de dados. 67/121 * Para persistir o objeto de uma classe, é invocado o método makePersistent sendo passado como parâmetro o referido objeto 68/121 * Para a implementação da funcionalidade de logging do HW no GAE, é necessário apenas dois passos: * Copiar o arquivo logging.properties, para o diretório WAR da aplicação; * Definir uma propriedade no arquivo de configuração appengine-web.xml. 69/121 * * Carregar e distribuir arquivos grandes Acesso através de programação ao conteúdo do arquivo A API Blobstore permite que sua aplicação forneça objetos de dados, chamados blobs, que são bem maiores do que o tamanho permitido para objetos no serviço do Armazenamento de dados. 70/121 * O endereço da imagem é recebido a partir de um formulário HTML (“multi part/form-data”) e é envolvido por um objeto chamado blobkey. Este blob é enviado usando a API Blobstore. 71/121 * * * Contas google ou OpenID Gerenciamento de administrador Não há necessidade de criar sistema de gerenciamento de usuários Aplicações do GAE podem autenticar usuários que têm contas do Google. 72/121 * Para realizar esse procedimento, foi utilizada a biblioteca java.net.HttpURLConnection da Sun. E, ao fazer a solicitação HTTP/HTTPS utilizamos o serviço URL Fetch, também disponibilizado pelo GAE; * Conforme disponibilizado na API ClientLogin, a URL utilizada para enviar uma requisição POST seria https://www.google.com/accounts/ClientLogin 73/121 74/121 * Para fazer a implantação (deploy) utilizando o plugin do eclipse, clique com o botão direito do mouse na aplicação e selecione a opção “Deploy to App Engine” 75/121 * Acessar via browser: http://[id_da_aplicação].appspot.com 75 76/121 * Introdução * Estudo de Caso – Health Watcher * Plataformas * Amazon AWS * Google App Engine * OpenStack * Conclusão 76 Health Watcher 77 78/121 * Openstack: Plataforma de software opensource que os provedores podem usar para implantar sua(s) nuvem(ns), de infraestrutura e/ou de armazenamento. * Image: arquivo de imagem de uma máquina virtual. * Instância: máquina virtual sendo executada na nuvem. 79/121 * Nova: responsável pela parte de computação * * * * (máquinas virtuais). Glance: responsável pela registro, busca e recuperação de imagens de máquinas virtuais. Keystone: responsável pela parte de autenticação/políticas de acesso a todos os componentes. Horizon: interface web de gerenciamento. Swift: responsável pela parte de armazenamento de objetos. 80/121 81/121 Serviço AWS Openstack Computação Implantação de Aplicações Banco de dados Relacional Amazon EC2 Elastic Beanstalk Nova RDS - SimpleDB - S3 Swift Armazenamento não relacional Armazenamento - 82/121 * Como desenvolver aplicações para a plataforma Openstack ? * Como utilizar banco de dados relacional ? 83/121 Componente HW Solução Aplicada Aplicação Instância Linux (Ubuntu) configurada com Java e Tomcat. Implantação de Aplicações Adicionar pacote Tomcat-admin. Banco de dados Relacional Armazenamento Instância Linux (Ubuntu) configurada com Mysql. Swift 84/121 Nuvem Dashboard Instância da Aplicação Desenvolvimento Putty Instância do Banco WinScp 85/121 A B Acessar a Openstack F Iniciar uma instância E Acesso Público à Instância C Criar o Banco de Dados Acessar a instância D Instalar Mysql 86/121 A * Pode ser acessada de 3 formas: * Através da linha de comando no server controlador da nuvem; * Utilizando a API HTTP REST; * Utilizando Gerenciamento WEB via DashBoard. B C D E F 87/121 * Linha de comando: * nova comando [opções] [argumentos] * Ex: nova list (lista as intâncias em execução) * glance comando [opções] [argumentos] * Ex: glance add name="<Image name>" is_public=true container_format=ovf disk_format=qcow2 < <filename>.img A B C D E F 88/121 A * A API de gerenciamento Openstack é baseada no modelo HTTP REST. * Os formatos suportados são XML e JSON. * Inicialmente, para executar qualquer chamada a API deve-se obter um token de autenticação. * O id do token deve constar no HEAD de cada nova requisição a API. B C D E F 89/121 * Código Java de acesso, utilizando a biblioteca Apache HttpComponents: capturando o token. HttpPost postRequest = new HttpPost( "http://[IP_SERVER]:5000/tokens"); String acesso = util.lerArquivo("./acesso.xml"); StringEntity parametros = new StringEntity(acesso); postRequest.setEntity(parametros); postRequest.setHeader("Content-Type","application/xml; charset=UTF-8"); postRequest.setHeader("Accept","application/xml"); HttpResponse response = httpClient.execute(postRequest); A B C D E F 90/121 A * Arquivo XML de envio: <?xml version="1.0" encoding="UTF-8"?> <auth xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xmlns="http://docs.openstack.org/identity/api/v2.0" tenantName=“[TENANT_NAME]"> <passwordCredentials username=“[LOGIN]" password=“[SENHA]"/> </auth> B C D E F 91/121 * XML de retorno: <access xmlns="http://docs.openstack.org/identity/api/v2.0"> <token expires="2012-01-31T14:49:30" id="178c03af-e73d-499a-89d62a43c2a35dad"> <tenant name="demo" id="2"/> </token> <user name="admin" id="1"> ... </user> <serviceCatalog> <service type="compute" name="nova"> <endpoint region="nova" internalURL="http://[IP]/v1.1/2" publicURL="http://[IP]:80/v1.1/2" adminURL="http://[IP]:8774/v1.1/2"/> </service> ... </serviceCatalog> </access> A B C D E F 92/121 A * Acessar via browser: http://[IP_SERVER]/ B C D E F 93/121 A * Acessar menu [Access & Secutiry]. * Clicar em [Create Keypair] para iniciar a execução da instância. * Digite o Keypair Name. * Efetue o dowload do arquivo [keypairName].pem. B C D E F 94/121 A * Utilizando o WinScp, copiar o .pem para o server controlador da nuvem. * Utilizando o Putty, acessar o nó controlador da nuvem e modificar as permissões do arquivo com o comando: chmod 0600 [KeypairName].pem. B C D E F 95/121 A * Acessar menu [Images & SnapShots]. * Clicar em [launch] para iniciar a execução da instância. B C D E F 96/121 A * Preencher os campos Server Name e User Data. * Selecionar o Flavor e a Keypair. * Selecionar o Security Groups. * Clicar em Launch Instance. B C D E F 97/121 A * Anotar o [ip da instância]. B C D E F 98/121 A * Executar o comando: ssh -i [Arquivo].pem ubuntu@[IP_INSTANCIA], acessando a instância. B C D * Instalar o Mysql, via comando: sudo apt-get –y install mysql-server. E F 99/121 A * Utilizando o WinScp, copiar o script do banco de dados para o server controlador da nuvem. * Executar o comando: scp [usuario]@[ip_server]:/caminho/script.sql /caminho de destino, copiando o script do banco para a instância. * Executar o comando: mysql -u [usuario] -p [BD_NOME] < [script.sql], para criar o banco de dados. B C D E F 100/121 A * Acessar menu [Access & Secutiry]. * Na seção Security Groups, clicar em [Edit Rules] do grupo ligado a instância. B C * Na seção Add Rule, no campo From Port digitar 3306 e no To Port 3306. * Clicar no link Add Rule. D E F 101/121 A * Quando a instância é iniciada ela recebe um ip da faixa privada da nuvem do OpenStack. * Para que ela seja acessada por um IP da faixa pública faz-se necessário associá-la a um Floating IP. B C D E F 102/121 A * Acessar menu [Access & Secutiry]. * Na seção Floating IPs, clicar em [Associate IP]. B C D E F 103/121 A * Selecionar a instância; * Clicar em Associate IP. B C D E Servidor_DB F 104/121 * Alterar na classe: [Constants.java] do pacote [healtwacther], as variáveis [DB_URL], [DB_LOGIN], [DB_PASS]. // Database Configuration public static final String DB_URL = "jdbc:mysql://[IP_INSTANCIA]/[NOME_BANCO"; public static final String DB_LOGIN = "[Login_Banco]"; public static final String DB_PASS = "[Senha_Banco]"; 105/121 * Swift: fornece de forma distribuída armazenamento virtual de objetos. É similar ao Amazon Web Services - Simple Storage Service (S3). * Swift Container: componente swift que contém os objetos armazenados. É similar ao bucket do AWS S3. 106/121 A B Acessar a Openstack C Criar um Container Acesso Público ao Container 107/121 A * Acessar o Dashboard. * Acessar o menu [Containers]. * Clicar em [Create Container]. B C 108/121 A * * Informar o [Container Name]. Clicar em [Create Container]. B C 109/121 A * Utilizando o Putty, acessar o nó controlador da nuvem. * Executar o comando: swift -V 2 -A http://[ip_server]:5000/v2.0 -U [TenantName]:[UserName] -K [Password] post r.r:* [ContainerName]. B C 110/121 * Para se enviar o arquivo da foto do cadastro de sintomas deve-se efetuar uma requisição HTTP PUT à Swift API. * É necessário capturar o id do token de autenticação para efetuar a requisição. * Ele deve ser adicionado no HEAD da requisição HTTP PUT. 111/121 * Código de envio da imagem: HttpPut putRequest = new HttpPut( "http://[ip_server]:8080/v1/AUTH_[tenantId]/[containerNam e]/"+code); byte[] conteudo = getImage(); ByteArrayEntity parametros = new ByteArrayEntity(conteudo); putRequest.addHeader("X-Auth-Token",token); putRequest.setEntity(parametros); httpClient.execute(putRequest); 112/121 A B Iniciar uma instância F Acessar a instância E Efetuar Upload .war C Gerar .war do HW Configurar Tomcat D Acesso Público à Instância 113/121 A * Executar o comando: sudo apt-get –y install tomcat7 tomcat7-admin. B C D E F 114/121 A * Incluir o conteúdo abaixo, no arquivo: /etc/tomcat7/tomcat-users.xml, dentro da tag tomcat-users. B C <role rolename="manager-gui" /> <user usernanme="[login]" password="[senha]" roles="manager-gui"> * Reiniciar o tomcat com o comando: sudo service tomcat7 restart. D E F 115/121 A * Acessar menu [Access & Secutiry]. * Na seção Security Groups, clicar em [Edit Rules] do grupo ligado a instância. B C * Na seção Add Rule, no campo From Port digitar 8080 e no To Port 8080. * Clicar no link Add Rule. D E F 116/121 A * Utilizando o eclipse, exporte o projeto no formato [War File]. B C D E F 117/121 A * Acessar, via browser, o endereço: http://[ip_instancia]:8080/manager/. * Informar nome de usuário e senha configurados no arquivo tomcat-users.xml. * Na seção Deploy, clicar em selecionar arquivo. * Selecionar o arquivo .war da aplicação. * Aguardar o upload do arquivo. B C D E F 118/121 A B C D E F 119/121 * Acessar via browser: http://[ip_da_instancia]:8080/[path_aplicação] 120/121 121/121 Autor e-mail Prof. Frederico Lopes (UFRN) [email protected] Prof. André Almeida (IFRN) [email protected] Profa. Thais Batista (UFRN) [email protected] Everton Cavalcante (UFRN) [email protected] Renato Gondim (UFRN) [email protected] Thomas Diniz (UFRN) [email protected] Thiago Cesar (UFRN) [email protected] Arthur Cassio (UFRN) [email protected] III CBSoft – Congresso Brasileiro de Software: Teoria e Prática Natal-RN, 28 de setembro de 2012 122