playframework-intro

  • 472 views
Uploaded 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.

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.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
472
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
4
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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. SAINDO DO ZERO COM O PLAYFRAMEWORK NÃO VOU GARANTIR QUE É FÁCIL COMO DIZEM POR AÍ /alots.wordpress.com @alberto_souza
  • 3. MÍNIMO PARA RODAR O PRIMEIRO EXEMPLO
  • 4. DOWNLOAD DO SDK
  • 5. CRIANDO UM NOVO PROJETO play new agendatech
  • 6. ENTRANDO NO CONSOLE DO PLAY play
  • 7. IMPORTAR PARA O ECLIPSE eclipse
  • 8. SUBIR O SERVIDOR ~run
  • 9. EXEMPLO DE ACESSO http://localhost:9000/eventos
  • 10. QUEM TRATA?
  • 11. ARQUIVO DE ROTAS!
  • 12. GET /eventos controllers.EventosController.lista() #Mapstaticresourcesfromthe/publicfoldertothe/assetsURLpath GET /assets/*file controllers.Assets.at(path="/public",file)
  • 13. packagecontrollers; importplay.mvc.*; publicclassEventosControllerextendsController{ publicstaticResultlista(){ List<Evento>instrutores=Eventos.paraAcontecer(); return//temqueirparaaview } }
  • 14. publicclassEventosControllerextendsController{ publicstaticResultlista(){ List<Evento>instrutores=Eventos.paraAcontecer(); returnok(views.html.eventos.lista.render(aprovados)); } }
  • 15. ISSO MESMO, INVOCAMOS UM MÉTODO QUE NOS RETORNA A VIEW!
  • 16. @(lista:List[Evento]) @for(evento<-lista){ @evento.getNome() }
  • 17. ROTAS E VIEWS VIRAM CLASSES!
  • 18. E QUANDO TIVER UMA ALTERAÇÃO?
  • 19. MEXA LIVREMENTE QUE O PLAY FICA ATUALIZANDO :)
  • 20. DECISÃO SOBRE TECNOLOGIAS Jádecidiram algumas, vamos só olhar rapidamente
  • 21. PERSISTÊNCIA Ebean JPA
  • 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. REFLEXÃO SOBRE MÉTODOS ESTÁTICOS
  • 24. MANTER ESTADO NO CONTROLLER? QUAL O MOTIVO?
  • 25. VOLTANDO PARA AS TECNOLOGIAS
  • 26. PRECISAVAM DE UMA VIEW QUE FOSSE EM SCALA
  • 27. PARA A VIEW, TWIRL
  • 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. O AGENDATECH PRECISA TUITAR SOBRE OS EVENTOS
  • 30. AKKA PARA TAREFAS ASSÍNCRONAS ActorRefactor=SystemActor.apply(SendTwitterActor.class); actor.tell(evento,null);
  • 31. NECESSÁRIO PEGAR FOTOS LEGAIS SOBRE O EVENTO
  • 32. API PRONTA PARA REQUESTS EXTERNOS WSRequestHolderrequester= WS.url("https://api.instagram.com/v1/tags/qcon2014/..."); requester.get();
  • 33. E QUAL SERVIDOR VAMOS USAR PARA DEPLOYAR?
  • 34. NETTY COMO SERVIDOR HTTP E A ESPECIFICAÇÃO DE SERVLETS?
  • 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. MEGA VANTAGENS(REATIVO) PELO MENOS NA MINHA OPINIÃO
  • 37. TUDO ASSÍNCRONO
  • 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. E SE O INSTAGRAM ESTIVER LERDO?
  • 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. ESSA É UMA DAS CHAVES DO SUCESSO PARA SUA FELICIDADE, PODE NÃO SER SUFICIENTE
  • 42. COLOCANDO MAIS SERVIDORES ESCALONAMENTO HORIZONTAL
  • 43. E O USUÁRIO LOGADO FICA ONDE?
  • 44. NO CLIENTE STATELESS PARA A VITÓRIA
  • 45. SEM OBJETOS COMPLEXOS NA SESSION //nãocompila! session().put("infoDoUsuario",objetoUsuario); //agorasim session().put("infoDoUsuario",algumaChaveDoUsuario);
  • 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. SEMPRE QUE UM EVENTO É APROVADO, ATUALIZA A HOME COMO FAZER?
  • 48. MODO ANTIGO PINGS DE TEMPOS EM TEMPOS NO SERVIDOR
  • 49. JEITO MAIS MODERNO
  • 50. SERVER-SENT EVENTS REATIVO MAIS UMA VEZ!
  • 51. AGORA BASTA FAZER O REGISTRO varfeed=newEventSource('@routes.AtualizaHomeController.registra())'); feed.addEventListener('message',handlerDoEvento,false);
  • 52. PUSH NOTIFICATIONS objectAtualizaHomeControllerextendsController{ val(chatOut,chatChannel)=Concurrent.broadcast[JsonNode] defregistra()=Action{ Ok.feed(chatOut&>EventSource()) .as("text/event-stream") } }
  • 53. E COMO PUSHAR INFORMAÇÕES? AtualizaHomeController.chatChannel() .push(Json.toJson(eventoAprovado));
  • 54. FECHANDO!
  • 55. GERANDO UMA DISTRIBUIÇÃO play dist
  • 56. DEPLOY unzip agendatech.zip deploy/bin/agendatech
  • 57. ALGUMAS EMPRESAS QUE JÁ USAM Coursera Linkedin Klout
  • 58. LIVRO: BLOG: bit.ly/1hV0NMm alots.wordpress.com
  • 59. OBRIGADO!/AlbertoSouza @alberto_souza