Desenvolvimento

12 nov, 2012

Apresentando Spring Roo – Parte 04: Desenvolvimento rápido de aplicativo na nuvem com Spring Roo e Cloud Foundry

Publicidade

Na parte 1 e na parte 2 desta série sobre o Spring Roo, desenvolvemos um aplicativo corporativo completo usando o Spring Roo. Na ocasião, eu planejava escrever um artigo sobre a integração do Spring Roo à plataforma como serviço (PaaS) do Google App Engine. O Spring Roo fornece suporte para o desenvolvimento de aplicativos da web que podem ser implementados no Google App Engine, mas havia problemas e limitações que dificultavam a implementação do aplicativo que desenvolvemos antes. Decidi adiar este artigo até que o suporte à integração Spring Roo/Google App melhorasse. Este artigo apresenta o Cloud Foundry (plataforma como serviço aberta) e como usá-lo para implementar um aplicativo de amostra. Antes de falar do Cloud Foundry, vamos tirar um momento para falar sobre plataforma como serviço.

O que é plataforma como serviço?

Plataforma como serviço (PaaS) é uma das camadas da computação em nuvem. Outras camadas incluem software como serviço (SaaS) e infraestrutura como serviço (IaaS). PaaS fica entre SaaS e IaaS no sentido de que fornece abstração na infraestrutura e uma plataforma de computação juntamente com uma pilha de solução.

A PaaS é adequada para desenvolvedores de negócios e profissionais. Os desenvolvedores de negócios que não escrevem código podem usar plataformas como WaveMaker para desenvolver seus aplicativos com componentes de arrastar e soltar, e os desenvolvedores profissionais podem usar plataformas como o Google App Engine para desenvolver e implementar aplicativos da web. A PaaS fornece as facilidades de suporte ao ciclo de vida de ponta a ponta para criação e entrega de aplicativos e serviços da web. Alguns dos principais provedores de PaaS são Google App Engine for Java™ e Python, Microsoft® Azure for .Net and Java e Force.com.

Até 2010, a PaaS não havia crescido na mesma proporção que SaaS e IaaS, possivelmente devido às limitações impostas pelas soluções de PaaS existentes. Vamos dar uma olhada nos problemas com as PaaS existentes, que plataformas de PaaS da nova geração, como o Cloud Foundry, devem resolver.

Problemas com soluções PaaS existentes

  • Limitação a um único fornecedor (falta de portabilidade na nuvem): Os desenvolvedores ou organizações não tinham a opção de ir de uma nuvem para outra. Por exemplo, se um desenvolvedor escolhesse o Google App Engine, teria de permanecer no Google App Engine a menos que o aplicativo fosse excluído usando o console do Google App Engine e o aplicativo existente fosse modificado de acordo com o novo provedor da nuvem. O aplicativo tinha então de ser implementado lá;
  • Implementação apenas na nuvem pública: A maioria das soluções existentes de PaaS visava apenas a nuvem pública, o que resulta em muitas empresas não passarem para PaaS. Existem inúmeras empresas que nunca passarão para a nuvem pública, e elas não tinham opção de configurar a nuvem privada em sua infraestrutura nem usar uma combinação de nuvens privadas e públicas;
  • Mentalidade estagnada: Os desenvolvedores precisam mudar sua mentalidade quanto ao desenvolvimento de aplicativos na nuvem pública. Antes, o Google App Engine não dava a opção de bancos de dados relacionais. O aplicativo precisava ser codificado em BigTable, que requer uma mudança de mentalidade antes do desenvolvimento começar, e há uma curva de aprendizado associada a ele. O desenvolvedor pode pegar um arquivo WAR de aplicativo e implementar na nuvem sem nenhuma modificação;
  • Suporte a estruturas diluídas: Atualmente, os programadores Java utilizam estruturas, e menos de 100 por cento do suporte a estruturas apresenta dificuldade na escrita de aplicativos. Usar o Google App Engine para desenvolver um aplicativo simples com qualquer estrutura comum, como Spring ou Struts, exigia alguns ajustes antes de usá-la;
  • Vinculado a determinado ambiente: As ofertas de PaaS existentes estão vinculadas a determinado ambiente, como Java e Python no uso de BigTable como backend para Google App Engine, .Net e Java no uso de banco de dados SQL Azure para Microsoft Azure ou Java para Amazon Beanstalk. Usar qualquer dessas PaaS exige a sobrevivência apenas naquele ambiente;
  • Não de software livre: Nenhuma solução existente de PaaS é de software livre, o que torna difícil para os desenvolvedores bifurcar o código e incluir suporte a novos recursos para compartilhar com a comunidade. Um elemento convincente do Cloud Foundry é sua natureza de software livre, permitindo que desenvolvedores fora da organização-mãe tenham um papel importante no seu sucesso.

2011 – O ano de PaaS

Gartner disse que 2011 será o ano da plataforma como serviço. Isso se deve ao grande número de novas ofertas de PaaS que estão sendo apresentadas pelos principais fornecedores de software corporativo. Algumas das ofertas de PaaS lançadas este ano incluem o Cloud Foundry da VMWare, OpenShift da RedHat, CloudBees e DotCloud – consulte “Recursos” para obter mais informações sobre todos esses. As novas ofertas de PaaS não se restringem a uma única linguagem ou estrutura. Agora, a PaaS está realmente se tornando uma plataforma de suporte ao desenvolvimento de aplicativos usando diversas linguagens e estruturas. As ofertas de PaaS, como o Cloud Foundry, evoluíram de modo a também suportar diversas nuvens, e falaremos sobre isso mais adiante neste artigo. Essas mudanças também obrigarão as soluções existentes de PaaS a se tornar multiestrutura. A seguir, nos concentramos no Cloud Foundry, visto que as demais ofertas de PaaS estão fora do escopo deste artigo.

O que é o Cloud Foundry?

Em abril de 2011, a VMWare revelou uma plataforma aberta como serviço chamada Cloud Foundry. O Cloud Foundry é um serviço multilinguagem, multiestrutura e multiaplicativo, e uma plataforma de software livre multinuvem. Ele tenta resolver todos os problemas listados anteriormente que encontramos nas soluções existentes de PaaS. Os desenvolvedores ou as organizações podem usar o Cloud Foundry como destino de implementação, ou seja, para implementar em uma nuvem pública oferecida pelo Cloud Foundry, ou ele pode ser usado como uma camada que permite a implementação em várias nuvens, públicas ou privadas. As três características principais do Cloud Foundry são:

  • Opções em todas as camadas: Em uma única linha, o Cloud Foundry é uma opção que fornece PaaS. As opções de que os desenvolvedores dispõem não se limitam a linguagens de programação, mas existem em todas as camadas (serviços e nuvem). A melhor representação do Cloud Foundry se encontra no diagrama da Figura 2:

 

Na Figura 2 vemos opções nos três vértices do triângulo. O primeiro vértice é para linguagens/tempo de execução e estruturas. Atualmente, o Cloud Foundry suporta as linguagens Java, Groovy, Scala, Ruby e Node.js. As estruturas suportadas para essas linguagens são Rails3, Grails, Node, Sinatra, Lift e Spring. O segundo vértice corresponde a serviços de aplicativos com serviços prontos disponíveis, como MySQL (banco de dados relacional), Redis (armazenamento de dados de valor de chave) e MongoDB (armazenamento de dados de documentos). Logo haverá suporte para RabbitMQ e outros serviços. O Cloud Foundry dá aos desenvolvedores opções de trabalho com bancos de dados SQL ou NoSQL. Aqueles limitados ao MySQL e Java não precisam aprender nada de novo, e podem utilizar o conhecimento existente para desenvolver um aplicativo ou implementar um aplicativo existente. O terceiro vértice mostra opções de nuvens. O Cloud Foundry pode ser implementado em uma nuvem pública, como a disponível atualmente em cloudfoundry.com, ou em IaaS, como Amazon EC2. Também é possível fazer o download e implementar o Cloud Foundry na nuvem privada da sua organização, ou um desenvolvedor pode instalá-lo em um laptop para usar como micronuvem ou como nuvem de desenvolvedor.

  • Software livre: O Cloud Foundry é um projeto de software livre disponível em Github (consulte “Recursos”). Os desenvolvedores podem bifurcar o projeto do Cloud Foundry, incluir suporte para novos recursos ou corrigir problemas existentes e contribuir de volta com o projeto. Uma empresa chamada ActiveState desenvolveu sua própria plataforma na nuvem para Python e Perl no Cloud Foundry (consulte ” Recursos”). Isso só é possível porque o Cloud Foundry é um projeto de software livre e os desenvolvedores podem incluir mais serviços ou suporte a idioma nele;
  • Portabilidade na nuvem: Visto que o Cloud Foundry é um projeto de software livre, os desenvolvedores e organizações têm liberdade para executá-lo onde desejarem. A RightScale mostrou que o Cloud Foundry pode ser executado no Amazon EC2 (consulte “Recursos”). Quem não quiser usar a nuvem pública padrão do Cloud Foundry pode usar uma nuvem diferente oferecida pelo Cloud Foundry.

 Introdução ao Cloud Foundry

A nuvem pública do Cloud Foundry é oferecida como serviço gratuito em http://www.cloudfoundry.com/. O serviço encontra-se atualmente na fase beta. Quem não tem credenciais do Cloud Foundry precisará se registrar em uma conta antes de começar a usar a nuvem pública do Cloud Foundry. Em geral leva alguns dias para receber as credenciais do Cloud Foundry. A nuvem pública atualmente é executada no sistema operacional da nuvem VMWare vSphere . Para começar antes de receber as credenciais, configure uma nuvem em uma máquina individual fazendo o download e instalando o Cloud Foundry.

Depois que as credenciais do Cloud Foundry são recebidas, há três maneiras de interagir com ele. Todos os clientes interagem com a API REST exposta pelo Cloud Foundry. Esses serviços da web REST são uma simples carga útil json por HTTP.

  1. Cliente de linha de comando VMC: VMC é um ruby gem que fornece acesso ao Cloud Foundry por meio da linha de comando. Ele é usado para implementar aplicativos criados usando todas as linguagens. Faça o download dele em http://rubygems.org/gems/vmc;
  2. Spring Source Tool Suite (IDE ou STS Spring Eclipse): O STTS é o segundo modo de se conectar ao Cloud Foundry. O STS é um IDE baseado em Eclipse que vem empacotado com muitos itens do Spring. Para saber mais sobre STS, consulte um excelente cartão de referência publicado em dzone. É necessário instalar um plug-in para acessar o Cloud Foundry. De dentro do IDE, é possível fazer o desenvolvimento, testes e implementação na nuvem. Isso é muito legal! Leia mais sobre isso no blog da equipe SpringSource;
  3. Complemento Spring Roo Cloud Foundry: O aplicativo pode ser implementado de dentro do shell do Roo usando o complemento Spring Roo Cloud Foundry. Para fãs do shell do Roo, isso significa que é possível desenvolver e implementar de dentro dele. Outra vantagem oferecida pelo shell do Roo é o preenchimento com tab. Inclua algumas letras no comando, aperte tab e o shell Roo preenche o comando.

Agora vejamos como os desenvolvedores Java podem acessar o Cloud Foundry por meio do Spring Roo. Vamos implementar o aplicativo criado durante os primeiros dois artigos no Cloud Foundry.

Integração do Spring Roo Cloud Foundry

O Spring Roo fornece suporte ao Cloud Foundry na forma de complemento. Os complementos são um mecanismo pelo qual o Spring Roo fornece suporte para novos recursos.

Pré-requisitos

Para implementar seu primeiro aplicativo com Spring Roo no Cloud Foundry execute as seguintes etapas:

  1. Se o Spring Roo não estiver instalado na sua máquina, consulte o artigo da parte 1 para uma introdução ao Spring Roo. Estou usando a versão mais recente do Spring Roo, o release 1.1.5;
  2. Faça o download do código de origem do aplicativo de conferência, consulte “Download”. Esse é o mesmo aplicativo desenvolvido nos primeiros dois artigos. Atualmente, ele usa HSQLDB como banco de dados. Mais tarde, transferiremos esse aplicativo para o banco de dados MySQL.

Implementar um aplicativo HSQLDB simples no Cloud Foundry

Quando o ambiente de desenvolvimento estiver pronto, implemente o aplicativo de conferências. O aplicativo de conferência transferido por download usa HSQLDB como seu banco de dados. Para implementar esse aplicativo no Cloud Foundry, execute estas etapas:

  • Desempacote o arquivo conference.zip em um local adequado.
  • Na linha de comando, vá até o local onde o conference.zip foi desempacotado.
  • Desenvolva o projeto digitando mvn clean install na linha de comando.
  • No diretório conference, dispare o comando Roo para carregar o shell.
  • Antes de implementar o aplicativo no Cloud Foundry, instale o complemento do Cloud Foundry, que fornecerá os comandos para executar as operações no Cloud Foundry. Para instalar o complemento do Cloud Foundry, digite os seguintes comandos no shell do Roo:
roo> pgp automatic trust

roo> addon install bundle --bundleSymbolicName
org.springframework.roo.addon.cloud.foundry;1.1.5.RELEASE

O primeiro comando diz ao Spring Roo para confiar automaticamente em todas as chaves pgp de modo que todos os componentes necessários sejam instalados sem precisar confiar em chaves de confiança individuais. O segundo comando instala o complemento do Cloud Foundry versão de liberação 1.1.5. Esse comando levará alguns minutos para ser concluído, por isso, seja paciente.

  • Após o complemento ser instalado, é preciso efetuar login no Cloud Foundry antes de poder executar as operações. Para efetuar login no Cloud Foundry, digite o seguinte comando no shell do Roo:
roo> cloud foundry login --email shekhargulati84@gmail.com --password ******
--cloudControllerUrl http://api.cloudfoundry.com

O comando de login do Cloud Foundry tem três opções – email, senha e cloudControllerUrl. Dessas, email e senha são obrigatórios. O valor padrão de cloudControllerUrl é a nuvem pública do Cloud Foundry em http://api.cloudfoundry.com. Para implementar uma micronuvem ou uma nuvem em outra parte, é necessário apontar para essa URL.

  • Para visualizar todos os comandos disponíveis para acessar o Cloud Foundry, escreva cloud foundry e pressione tab para vê-los.
roo> cloud foundry <Press Tab>

cloud foundry bind       cloud foundry clear      cloud foundry create

cloud foundry delete     cloud foundry deploy     cloud foundry files

cloud foundry info       cloud foundry list       cloud foundry login

cloud foundry map        cloud foundry restart    cloud foundry start

cloud foundry stop       cloud foundry unbind     cloud foundry unmap

cloud foundry update     cloud foundry view
  • Para visualizar as informações associadas à sua instância do Cloud Foundry, digite o comando info como mostrado abaixo. Esse comando mostra as informações sobre uso de memória, número de aplicativos implementados no Cloud Foundry e número de serviços em execução. Ele também mostra os valores máximos, ou seja, que a memória máxima é de 2GB.
roo> cloud foundry info

VMware's Cloud Application Platform
For support visit support@cloudfoundry.com

Target:     http://api.cloudfoundry.com (0.999)

User:     shekhargulati84@gmail.com
Usage:     Memory (0MB of 2048MB total)
Services (0 of 16 total)
Apps (0 of 20 total)
  • A seguir, implemente o aplicativo digitando o comando cloud foundry deploy. Esse comando exige dois atributos obrigatórios: appName e path. O atributo appName representa o nome do aplicativo e o atributo path, o caminho para o arquivo WAR. Não é necessário digitar o caminho. Basta pressionar tab após path e o Spring Roo o localizará. Há três atributos não obrigatórios – instances, memory e urls. Por padrão, apenas uma instância do aplicativo é ativada, mas a implementação de diversas instâncias dele é possível especificando isso no atributo instances. A memória padrão alocada para uma instância é de 256 MB. Para alterar esse atributo, use o atributo memory no momento da implementação. O atributo URLs pode ser usado para especificar a URL a ser mapeada para o aplicativo. Por padrão, a URL será <nome do aplicativo>.cloudfoundry.com, ou seja, conference.cloudfoundry.com no caso do nosso aplicativo. Digite o seguinte comando para implementar o aplicativo conference:
roo> cloud foundry deploy
--appName conference --path /target/conference-0.1.0.BUILD-SNAPSHOT.war

O atributo path pode ter o valor CREATE, dependendo se o projeto foi desenvolvido usando Maven ou não. Se o projeto já tiver sido desenvolvido, como no meu caso, aparecerá o caminho do WAR. Caso contrário, aparecerá CREATE, que primeiro desenvolverá o projeto e depois implementará o aplicativo.

  • O aplicativo implementado ainda não foi iniciado. Inicie o aplicativo usando o comando start, como mostrado abaixo.
cloud foundry start app --appName conference

Alternando para produção: Substituir HSQLDB pelo banco de dados MySQL

É fácil alternar do HSQLDB em um ambiente local para o banco de dados MySQL em produção. Primeiro, mude o armazenamento de persistência de HSQLDB para MySQL usando o shell do Roo e depois crie um serviço MySQL usando o complemento Cloud Foundry e ligue o serviço ao aplicativo. Não é necessário mudar o código; a única mudança que acontecerá será na configuração. Não é nem necessário ter o banco de dados MySQL na máquina, visto que o teste é executado diretamente na nuvem. O Cloud Foundry é tão leve como desenvolver em uma máquina de desenvolvedor local.

  • Abra o shell do Roo e altere o armazenamento de persistência de HSQDB para MySQL digitando o seguinte comando no shell.
persistence setup --database MYSQL --provider HIBERNATE

Esse comando atualizará pom.xml, database.properties e persistence.xml para apontarem para a configuração relacionada ao MySQL.

  • Abra outra linha de comando e execute mvn clean install -Dmaven.test.skip=true na pasta-raiz. Repare que estou ignorando os testes porque não tenho um banco de dados MySQL para meu aplicativo de conferência.
  • Após o desenvolvimento ser bem-sucedido, o aplicativo está pronto para ser implementado. Antes da implementação, porém, exclua o aplicativo de modo que possamos criar um serviço MySQL para nosso aplicativo e reimplementar um novo aplicativo. Não é necessário excluir o aplicativo cada vez que fizer mudanças visto que também se pode usar o comando update para atualizar a implementação.
cloud foundry delete app --appName conference
  • Agora vamos implementar nosso WAR recém-criado que tem configuração específica para MySQL.
cloud foundry deploy --appName conference --path
/target/conference-0.1.0.BUILD-    SNAPSHOT.war --memory 512MB
  • O comando acima implementou o aplicativo, mas a instância do aplicativo ainda não foi iniciada. Assim, antes de iniciar o aplicativo, precisamos criar um serviço MySQL e ligá-lo ao nosso serviço. Para criar um serviço, usaremos o comando create service do Cloud Foundry e lhe daremos serviceName e serviceType. O serviceType pode ser MySQL, MongoDB ou Redis.
cloud foundry create service --serviceName conference-db --serviceType mysql

Após criar o serviço podemos ligá-lo usando o comando bind service. O comando bind service confirma se a dependência de origem de dados do MySQL foi satisfeita na nuvem. Isso também é chamado de injeção de dependência na nuvem.

cloud foundry bind service --appName conference --serviceName conference-db

Também podemos evitar o comando bind service especificando o atributo appName do comando create service.

cloud foundry create service --serviceName conference-db --serviceType mysql
--appName conference
cloud foundry start app --appName conference

Por fim, visualize a lista de aplicativos e serviços executando os comandos list apps e list services do Cloud Foundry, como mostrado abaixo.

                
roo> cloud foundry list apps                     

================================= Applications ================================= 

Name        Status    Instances   Services        URLs 
----        ------    ---------   --------        ---- 
conference  STARTED   1           conference-db   conference.cloudfoundry.com 

roo> cloud foundry list services 

================== System Services =================== 

Service     Version     Description 
-------     -------     ----------- 
mongodb     1.8         MongoDB NoSQL store 
redis       2.2         Redis key-value store service 
mysql       5.1         MySQL database service 

= Provisioned Services = 

Name              Service 
----              ------- 
conference-db     mysql

Conclusão

Neste artigo, definimos o Cloud Foundry e como ele é diferente de outras ofertas de PaaS. A integração do Cloud Foundry ao Spring Roo fornece um ambiente de desenvolvimento de aplicativo rápido para os desenvolvedores criarem e implementarem aplicativos Spring a partir do shell do Roo. Esse artigo tratou da criação de um serviço MySQL e da ligação dele a um aplicativo.

Em artigos futuros, veremos os outros serviços do Cloud Foundry, como Redis e MongoDB.

Download

Nome Tamanho Método de download
conference.zip HTTP

Informações sobre métodos de download

 

Recursos

Aprender

Obter produtos e tecnologias

  • Cloud Foundry está disponível por meio de Github.
  • Avalie produtos de software IBM, de downloads de avaliação a produtos hospedados na nuvem, é possível inovar seu próximo projeto de desenvolvimento em software livre usando software especialmente voltado para desenvolvedores.

Discutir

***

Sobre o autor: Shekhar Gulati é consultor de Java que trabalha na Xebia Índia. Ele tem seis anos de experiência corporativa em Java. Ele tem extensa experiência em projetos do portfólio Spring, como Spring, Spring-WS, Spring Roo etc. Seus interesses são Spring, bancos de dados NoSQL, Hadoop, estruturas RAD como Spring Roo, computação em nuvem (principalmente serviços PaaS, como Google App Engine, CloudFoundry, OpenShift), Hadoop. Ele escreve constantemente para JavaLobby, Developer.com, IBM developerWorks e seu próprio blog em http://whyjava.wordpress.com/. Você pode segui-lo no Twitter @ http://twitter.com/#!/shekhargulati.

***

Artigo original disponível em: http://www.ibm.com/developerworks/br/library/os-springroo4/index.html