• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Desenvolvimento de aplicações para o Google App Engine
 

Desenvolvimento de aplicações para o Google App Engine

on

  • 8,909 views

Uma palestra para explorar o Google App Engine (GAE), uma plataforma de desenvolvimento e hospedagem de aplicações web na nuvem. Aplicativos fáceis de criar, manter e escalar. ...

Uma palestra para explorar o Google App Engine (GAE), uma plataforma de desenvolvimento e hospedagem de aplicações web na nuvem. Aplicativos fáceis de criar, manter e escalar.

Palestrante: Carlos Duarte do Nascimento

Matemático pelo IME/USP e Gerente de Produto no Apontador, faz "artesanato" de software há 20 anos, defendendo plataformas e conteúdo livres.

Statistics

Views

Total Views
8,909
Views on SlideShare
8,060
Embed Views
849

Actions

Likes
16
Downloads
0
Comments
0

1 Embed 849

http://www.bloglecom.com.br 849

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

Desenvolvimento de aplicações para o Google App Engine Desenvolvimento de aplicações para o Google App Engine Presentation Transcript

  • desenvolvimento de aplicações para oGoogle App Engine http://slideshare.net/chesterbr
  • Proposta Apresentar de forma simples,prática e ao alcance de todos uma alternativa para a criação de aplicativos na web escaláveis. http://slideshare.net/chesterbr
  • Palestrante @chesterbr http://chester.me
  • não-especialista(ou seja: se esse mané pode, eu também posso!)
  • Como surgem os bons aplicativos web?
  • existem muitas lendas...
  • A mais popular
  • Dilema da Hospedagem Enquanto o site não fizer sucesso, vou ter que custear a hospedagemQuando ele crescer e meu provedor nãoaguentar, vou ter que mudar de provedor (e talvez de tecnologia) Quanto isso vai custar?
  • Dilema da Arquitetura Projetar uma arquitetura para escalar exige tempo e skills, que poderiam ser aplicados na aplicação em si (emparticular no início), mas deixar isso pra depois pode gerar um problema difícil
  • Google App Engine
  • EquilíbrioCrie seu aplicativo web rapidamente ea custo zero. Com alguns cuidados, ele vai se adaptar a volumes de tráfegomaiores e o custo de hospedagem será proporcional a este aumento.
  • Obstáculos O App Engine não é completamentediferente de outras arquiteturas, mas é preciso aprender coisas novas Nossa proposta hoje é ver essas coisas novas na prática
  • Escolhendo a Linguagem
  • ?
  • JavaÉ uma opção para quem já conhece ela (ou C#), mas muita coisa vai ter que ser feita do “jeito App Engine”(e não é lá muito popular hoje em dia...)
  • JavaX
  • Go Criada pelo próprio Google, é boa em tarefas que exigem muita CPU (écompilada e com tipos estáticos), mas o suporte ainda é experimental* e você vai ter pouca companhia * eles mesmos alertam: http://code.google.com/appengine/docs/
  • Go
  • Python Fácil de aprender, poderosa (dinâmica, funcional, interativa),estimula a escrita de código legível e tem uma comunidade muito ativa* *
  • Python
  • Hello, App Engine
  • Ingredientes● Google App Engine SDK para Python● Seu editor de textos favorito● Internet (para colocar no ar) (opcional: Eclipse + plugin do App Engine) http://code.google.com/appengine/downloads.html
  • SDK (Launcher) no Windows http://code.google.com/appengine/downloads.html
  • SDK (Launcher) no Mac http://code.google.com/appengine/downloads.html
  • Um app é uma pasta
  • Um app é uma pasta
  • app.yaml Descreve o seu aplicativo para osservidores do Google (nome, versão,linguagem), associando os endereços (ex.: “/”, “/noticias”) com o código
  • app.yamlapplication: meusiteversion: 1runtime: pythonapi_version: 1handlers:- url: /.* script: meusite.py
  • meusite.pyprint "Oi, Campus Party!"
  • Tá pronto, vamos rodar!
  • acrescentando no Launcher
  • diga onde ele está...
  • ...e solta o play!
  • era só isso?
  • Era!☺
  • Falando sério agora...
  • Criando via Launcher
  • Criando via Launcher
  • app.yamlapplication: siteserioversion: 1runtime: pythonapi_version: 1Handlers:- url: /favicon.ico static_files: favicon.ico upload: favicon.ico- url: .* script: main.py
  • main.py “sério”from google.appengine.ext import webappfrom google.appengine.ext.webapp import utilclass MainHandler(webapp.RequestHandler): def get(self): self.response.out.write(Hello world!)def main(): application = webapp.WSGIApplication( [(/, MainHandler)], debug=True) util.run_wsgi_app(application)if __name__ == __main__: main()
  • webapp É a biblioteca (framework) que mapeia(através de um objeto WSGIApplication) cada caminho (ou grupo deles) para a classe RequestHandler apropriada
  • Exemplo: site de notícias...def main(): application = webapp.WSGIApplication([ (/, HomeHandler), (/noticias, ListaNoticiasHandler), (/noticia/(w+), NoticiaHandler), ... ], debug=True) util.run_wsgi_app(application)...
  • Recuperando a notícia...class NoticiaHandler(webapp.RequestHandler): def get(self, id_not): # id_not contém o item entre # parênteses em /noticia/(w+) # ex.: /noticia/123 => id_not=123 noticia = dao.busca_noticia(id_not) # montando o html com os dados: html = template.render(/noticia.html, noticia) self.response.out.write(noticia)...
  • Template (noticia.html)<html> <body> <h1>{{titulo}}</h1> <h2>{{autor.nickname}}</h2> {{texto}} </body></html>
  • Parâmetros e REST...class AlgumHandler(webapp.RequestHandler): def get(self): # parâmetros de formulário (GET, POST): p = self.request.get(nome_parametro) # Outros verbos HTTP (i.e., REST): def post(self): ... def delete(self): ......
  • AlternativasO webapp é minimalista, mas se isso não agradar, o App Engine suporta outros frameworks populares http://www.franciscosouza.com.br/tag/frameworks/
  • Armazenando Dados
  • Jeito clássico (relacional)
  • Bancos RelacionaisTêm implementações maduras, facilitam operações robustas (ACID), mapeiam (mais-ou-menos) com classes/objetos, performam bem em servidor único e (quase) todo mundo sabe usar SQL mas...
  • Bancos Relacionais ...é difícil paralelizar sem afetar oaplicativo e/ou abrir mão de algumasdessas vantagens, o que tem levado à busca de novas alternativas
  • App Engine Datastore
  • Baseada no Bigtable, que é“Um mapa ordenado esparso, distribuído,persistente e multidimensional. O mapa é indexado por chave de linha, chave decoluna e data/hora; cada valor no mapa é um array não-interpretado de bytes” http://research.google.com/archive/bigtable-osdi06.pdf
  • Na práticaVamos usar uma estrutura mais simples, na qual o aplicativo vai cuidar de maiscoisas (ex.: consistência de dados), mas o sistema poderá escalar facilmente usando a estrutura do Google
  • Boa notíciaO App Engine reduz esse trabalho comclasses que encapsulam o Datastore na forma de “entidades” e permitem até consultar em estilo SQL (GQL) (só tome cuidado com as diferenças)
  • Exemplo...class Noticia(db.Model): id = db.IntegerProperty(required=True) titulo = db.StringProperty(required=True) texto = db.StringProperty(required=True) editoria = db.StringProperty(required=True, choices=set([politica, esportes, informatica])) data_criacao = db.DateTimeProperty( auto_now=True) data_publicacao = db.DateTimeProperty() autor = db.UserProperty() avaliacao = db.IntegerProperty() acessos = db.IntegerProperty()...
  • Cadastrando (put)... noticia = Noticia( id = 123, titulo = SOPA foi pro vinagre!, texto = bla bla bla bla, editoria = politica) noticia.put()...
  • Consulta (query)... # Montando a query q = Noticia.all() q.filter("editoria =", "esportes") q.order("-data_publicacao") # Executando a query noticias = q.fetch(10) for noticia in noticias: print noticia.titulo...
  • Consulta (query) com GQL... # Montando a query q = db.GqlQuery("SELECT * FROM Noticia " + "WHERE editoria = :1" + "ORDER BY data_publicacao DESC", "esportes") # Executando a query (não mudou nada!) noticias = q.fetch(10) for noticia in noticias: print noticia.titulo...
  • Índices Todas as consultas são baseadas em índices definidos no index.yaml (mascriados automaticamente à medida que você testa o site no servidor local) (sim, vale dar uma espiada no arquivo)
  • RestriçõesComo as buscas usam índices, existem algumas restrições. Por exemplo,desigualdades (<, <=, >=, >, !=) só podem afetar um campo por consulta. http://bit.ly/y3xtkk (Documentação: Restrições)
  • Restrições... # Query válida q = Noticia.all() q.filter("avaliacao >=", 3) q.filter("avaliacao <=", 8)... # Query INVÁLIDA q = Noticia.all() q.filter("avaliacao >=", 5) q.filter("acessos >=", 12)... http://bit.ly/y3xtkk (Documentação: Restrições)
  • MemcacheAlguns dados são muito mais acessadosque outros (working set), e o AppEngine disponbiliza o Memcache para manter esses dados em RAM
  • Memcache ... def busca_noticia(self, id): cache = memcache.Client() noticia = cache.get(id) if noticia is None: result = Noticia.all().filter("id =", int(id)).fetch(1) if result: noticia = result[0] cache.add(id, noticia) return noticia ...(não esqueça do cache.delete() se os dados mudarem)
  • Colocando no ar
  • appengine.google.com
  • Cadastrando o aplicativo
  • oh, oh...
  • cadastre com outro nome...
  • ...e altere no app.yamlapplication: appdojoselitoversion: 1runtime: pythonapi_version: 1Handlers:- url: /favicon.ico static_files: favicon.ico upload: favicon.ico- url: .* script: main.py
  • Launcher
  • login do Google
  • ele trabalha, e...
  • Conclusão
  • O poder é de vocês! É preciso estudar e experimentar, mas o App Engine está ao alcance de todos. Basta começar!http://code.google.com/intl/pt-BR/appengine/docs/
  • Dúvidas?Obrigado! @chesterbr http://chester.me http://slideshare.net/chesterbr
  • Créditos e Licenciamento Esta apresentação está disponível para uso e reuso sob os termos da licença Creative Commons “by-nc” 3.0, observadas as exceções abaixo Fotos e ilustrações são em sua maioria logomarcas dos produtos eprojetos referenciados (inclusos sob premissa de “fair use”) e ilustrações de uso supostamente livre cuja autoria foi mencionada sempre quepossível (correções são bem-vindas). Tais elementos são de propriedade de seus autores, e não estão cobertos pela licença acima, não havendo qualquer relação deles com o autor