Desenvolvimento de aplicações para o Google App Engine

11,039 views
10,797 views

Published on

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.

Published in: Technology
0 Comments
24 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
11,039
On SlideShare
0
From Embeds
0
Number of Embeds
863
Actions
Shares
0
Downloads
0
Comments
0
Likes
24
Embeds 0
No embeds

No notes for slide

Desenvolvimento de aplicações para o Google App Engine

  1. 1. desenvolvimento de aplicações para oGoogle App Engine http://slideshare.net/chesterbr
  2. 2. 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
  3. 3. Palestrante @chesterbr http://chester.me
  4. 4. não-especialista(ou seja: se esse mané pode, eu também posso!)
  5. 5. Como surgem os bons aplicativos web?
  6. 6. existem muitas lendas...
  7. 7. A mais popular
  8. 8. 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?
  9. 9. 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
  10. 10. Google App Engine
  11. 11. 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.
  12. 12. 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
  13. 13. Escolhendo a Linguagem
  14. 14. ?
  15. 15. 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...)
  16. 16. JavaX
  17. 17. 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/
  18. 18. Go
  19. 19. Python Fácil de aprender, poderosa (dinâmica, funcional, interativa),estimula a escrita de código legível e tem uma comunidade muito ativa* *
  20. 20. Python
  21. 21. Hello, App Engine
  22. 22. 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
  23. 23. SDK (Launcher) no Windows http://code.google.com/appengine/downloads.html
  24. 24. SDK (Launcher) no Mac http://code.google.com/appengine/downloads.html
  25. 25. Um app é uma pasta
  26. 26. Um app é uma pasta
  27. 27. app.yaml Descreve o seu aplicativo para osservidores do Google (nome, versão,linguagem), associando os endereços (ex.: “/”, “/noticias”) com o código
  28. 28. app.yamlapplication: meusiteversion: 1runtime: pythonapi_version: 1handlers:- url: /.* script: meusite.py
  29. 29. meusite.pyprint "Oi, Campus Party!"
  30. 30. Tá pronto, vamos rodar!
  31. 31. acrescentando no Launcher
  32. 32. diga onde ele está...
  33. 33. ...e solta o play!
  34. 34. era só isso?
  35. 35. Era!☺
  36. 36. Falando sério agora...
  37. 37. Criando via Launcher
  38. 38. Criando via Launcher
  39. 39. app.yamlapplication: siteserioversion: 1runtime: pythonapi_version: 1Handlers:- url: /favicon.ico static_files: favicon.ico upload: favicon.ico- url: .* script: main.py
  40. 40. 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()
  41. 41. webapp É a biblioteca (framework) que mapeia(através de um objeto WSGIApplication) cada caminho (ou grupo deles) para a classe RequestHandler apropriada
  42. 42. Exemplo: site de notícias...def main(): application = webapp.WSGIApplication([ (/, HomeHandler), (/noticias, ListaNoticiasHandler), (/noticia/(w+), NoticiaHandler), ... ], debug=True) util.run_wsgi_app(application)...
  43. 43. 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)...
  44. 44. Template (noticia.html)<html> <body> <h1>{{titulo}}</h1> <h2>{{autor.nickname}}</h2> {{texto}} </body></html>
  45. 45. 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): ......
  46. 46. AlternativasO webapp é minimalista, mas se isso não agradar, o App Engine suporta outros frameworks populares http://www.franciscosouza.com.br/tag/frameworks/
  47. 47. Armazenando Dados
  48. 48. Jeito clássico (relacional)
  49. 49. 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...
  50. 50. Bancos Relacionais ...é difícil paralelizar sem afetar oaplicativo e/ou abrir mão de algumasdessas vantagens, o que tem levado à busca de novas alternativas
  51. 51. App Engine Datastore
  52. 52. 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
  53. 53. 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
  54. 54. 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)
  55. 55. 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()...
  56. 56. Cadastrando (put)... noticia = Noticia( id = 123, titulo = SOPA foi pro vinagre!, texto = bla bla bla bla, editoria = politica) noticia.put()...
  57. 57. 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...
  58. 58. 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...
  59. 59. Í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)
  60. 60. 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)
  61. 61. 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)
  62. 62. MemcacheAlguns dados são muito mais acessadosque outros (working set), e o AppEngine disponbiliza o Memcache para manter esses dados em RAM
  63. 63. 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)
  64. 64. Colocando no ar
  65. 65. appengine.google.com
  66. 66. Cadastrando o aplicativo
  67. 67. oh, oh...
  68. 68. cadastre com outro nome...
  69. 69. ...e altere no app.yamlapplication: appdojoselitoversion: 1runtime: pythonapi_version: 1Handlers:- url: /favicon.ico static_files: favicon.ico upload: favicon.ico- url: .* script: main.py
  70. 70. Launcher
  71. 71. login do Google
  72. 72. ele trabalha, e...
  73. 73. Conclusão
  74. 74. 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/
  75. 75. Dúvidas?Obrigado! @chesterbr http://chester.me http://slideshare.net/chesterbr
  76. 76. 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

×