Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

playframework-intro

865 views

Published on

Short talk dada na Qcon SP 2014. Mostra as funcionalidades básicas do Play, assim como algumas características que fazem ele ser o framework mais escalável do mundo Java atualmente.

Published in: Technology
  • Be the first to comment

playframework-intro

  1. 1. O MÍNIMO SOBRE MIM ALBERTO SOUZA Instrutor e desenvolvedor pela .Caelum Escritor do , usuário forte do Play:) e commiter do VRaptor4. Livro PlayFramework naprática
  2. 2. SAINDO DO ZERO COM O PLAYFRAMEWORK NÃO VOU GARANTIR QUE É FÁCIL COMO DIZEM POR AÍ /alots.wordpress.com @alberto_souza
  3. 3. MÍNIMO PARA RODAR O PRIMEIRO EXEMPLO
  4. 4. DOWNLOAD DO SDK
  5. 5. CRIANDO UM NOVO PROJETO play new agendatech
  6. 6. ENTRANDO NO CONSOLE DO PLAY play
  7. 7. IMPORTAR PARA O ECLIPSE eclipse
  8. 8. SUBIR O SERVIDOR ~run
  9. 9. EXEMPLO DE ACESSO http://localhost:9000/eventos
  10. 10. QUEM TRATA?
  11. 11. ARQUIVO DE ROTAS!
  12. 12. GET /eventos controllers.EventosController.lista() #Mapstaticresourcesfromthe/publicfoldertothe/assetsURLpath GET /assets/*file controllers.Assets.at(path="/public",file)
  13. 13. packagecontrollers; importplay.mvc.*; publicclassEventosControllerextendsController{ publicstaticResultlista(){ List<Evento>instrutores=Eventos.paraAcontecer(); return//temqueirparaaview } }
  14. 14. publicclassEventosControllerextendsController{ publicstaticResultlista(){ List<Evento>instrutores=Eventos.paraAcontecer(); returnok(views.html.eventos.lista.render(aprovados)); } }
  15. 15. ISSO MESMO, INVOCAMOS UM MÉTODO QUE NOS RETORNA A VIEW!
  16. 16. @(lista:List[Evento]) @for(evento<-lista){ @evento.getNome() }
  17. 17. ROTAS E VIEWS VIRAM CLASSES!
  18. 18. E QUANDO TIVER UMA ALTERAÇÃO?
  19. 19. MEXA LIVREMENTE QUE O PLAY FICA ATUALIZANDO :)
  20. 20. DECISÃO SOBRE TECNOLOGIAS Jádecidiram algumas, vamos só olhar rapidamente
  21. 21. PERSISTÊNCIA Ebean JPA
  22. 22. publicclassEventosControllerextendsController{ publicstaticResultindex(){ List<Evento>eventos=Ebean.find(Evento.class).findList(); List<Evento>eventos=JPA.em().ah...UmaFormaFacil() returnok(view.instrutores.html.index.render(eventos)); } }
  23. 23. REFLEXÃO SOBRE MÉTODOS ESTÁTICOS
  24. 24. MANTER ESTADO NO CONTROLLER? QUAL O MOTIVO?
  25. 25. VOLTANDO PARA AS TECNOLOGIAS
  26. 26. PRECISAVAM DE UMA VIEW QUE FOSSE EM SCALA
  27. 27. PARA A VIEW, TWIRL
  28. 28. @(eventos:List[Evento]) @if(flash().get("sucesso")!=null){ <span class="msg_sucesso">@flash().get("sucesso")</span> } <ul> @for(evento<-eventos){ @detalhe_lista(evento) } </ul>
  29. 29. O AGENDATECH PRECISA TUITAR SOBRE OS EVENTOS
  30. 30. AKKA PARA TAREFAS ASSÍNCRONAS ActorRefactor=SystemActor.apply(SendTwitterActor.class); actor.tell(evento,null);
  31. 31. NECESSÁRIO PEGAR FOTOS LEGAIS SOBRE O EVENTO
  32. 32. API PRONTA PARA REQUESTS EXTERNOS WSRequestHolderrequester= WS.url("https://api.instagram.com/v1/tags/qcon2014/..."); requester.get();
  33. 33. E QUAL SERVIDOR VAMOS USAR PARA DEPLOYAR?
  34. 34. NETTY COMO SERVIDOR HTTP E A ESPECIFICAÇÃO DE SERVLETS?
  35. 35. RAZÕES PARA NÃO SEGUIR A SPEC Não precisar ficar criando adapter paraas implementações Como lidar com as respostas assíncronas?
  36. 36. MEGA VANTAGENS(REATIVO) PELO MENOS NA MINHA OPINIÃO
  37. 37. TUDO ASSÍNCRONO
  38. 38. VOLTANDO AO ASSUNTO SOBRE REQUISIÇÕES PARA SERVIÇOS EXTERNOS publicstaticResultultimasFotos(Stringhashtag){ WSRequestHolderrequester= WS.url("https://api.instagram.com/v1/tags/"+hashtag+"/..."); returnok(requester.get().get().getBody()); }
  39. 39. E SE O INSTAGRAM ESTIVER LERDO?
  40. 40. NÃO QUEREMOS SEGURAR A THREAD! publicstaticPromise<Result>ultimasFotos(Stringhashtag){ WSRequestHolderrequester= WS.url("https://api.instagram.com/v1/tags/"+hashtag+"/..."); Promise<Response>esperandoAResposta=requester.get(); esperandoAResposta.map(response->ok(response.getBody())); }
  41. 41. ESSA É UMA DAS CHAVES DO SUCESSO PARA SUA FELICIDADE, PODE NÃO SER SUFICIENTE
  42. 42. COLOCANDO MAIS SERVIDORES ESCALONAMENTO HORIZONTAL
  43. 43. E O USUÁRIO LOGADO FICA ONDE?
  44. 44. NO CLIENTE STATELESS PARA A VITÓRIA
  45. 45. SEM OBJETOS COMPLEXOS NA SESSION //nãocompila! session().put("infoDoUsuario",objetoUsuario); //agorasim session().put("infoDoUsuario",algumaChaveDoUsuario);
  46. 46. COLOCAR VÁRIOS SERVIDORES FICOU FÁCIL EXEMPLO HAPROXY backendservers balanceroundrobin optionhttpclose optionredispatch serverplay1127.0.0.1:8081 maxconn32 serverplay2127.0.0.1:8082 maxconn32
  47. 47. SEMPRE QUE UM EVENTO É APROVADO, ATUALIZA A HOME COMO FAZER?
  48. 48. MODO ANTIGO PINGS DE TEMPOS EM TEMPOS NO SERVIDOR
  49. 49. JEITO MAIS MODERNO
  50. 50. SERVER-SENT EVENTS REATIVO MAIS UMA VEZ!
  51. 51. AGORA BASTA FAZER O REGISTRO varfeed=newEventSource('@routes.AtualizaHomeController.registra())'); feed.addEventListener('message',handlerDoEvento,false);
  52. 52. PUSH NOTIFICATIONS objectAtualizaHomeControllerextendsController{ val(chatOut,chatChannel)=Concurrent.broadcast[JsonNode] defregistra()=Action{ Ok.feed(chatOut&>EventSource()) .as("text/event-stream") } }
  53. 53. E COMO PUSHAR INFORMAÇÕES? AtualizaHomeController.chatChannel() .push(Json.toJson(eventoAprovado));
  54. 54. FECHANDO!
  55. 55. GERANDO UMA DISTRIBUIÇÃO play dist
  56. 56. DEPLOY unzip agendatech.zip deploy/bin/agendatech
  57. 57. ALGUMAS EMPRESAS QUE JÁ USAM Coursera Linkedin Klout
  58. 58. LIVRO: BLOG: bit.ly/1hV0NMm alots.wordpress.com
  59. 59. OBRIGADO!/AlbertoSouza @alberto_souza

×