O MÍNIMO SOBRE MIM
ALBERTO SOUZA
Instrutor e desenvolvedor pela .Caelum
Escritor do , usuário forte do
Play:) e commiter d...
SAINDO DO ZERO COM O PLAYFRAMEWORK
NÃO VOU GARANTIR QUE É FÁCIL COMO DIZEM POR AÍ
/alots.wordpress.com @alberto_souza
MÍNIMO PARA RODAR O PRIMEIRO EXEMPLO
DOWNLOAD DO SDK
CRIANDO UM NOVO PROJETO
play new agendatech
ENTRANDO NO CONSOLE DO PLAY
play
IMPORTAR PARA O ECLIPSE
eclipse
SUBIR O SERVIDOR
~run
EXEMPLO DE ACESSO
http://localhost:9000/eventos
QUEM TRATA?
ARQUIVO DE ROTAS!
GET /eventos controllers.EventosController.lista()
#Mapstaticresourcesfromthe/publicfoldertothe/assetsURLpath
GET /assets/...
packagecontrollers;
importplay.mvc.*;
publicclassEventosControllerextendsController{
publicstaticResultlista(){
List<Event...
publicclassEventosControllerextendsController{
publicstaticResultlista(){
List<Evento>instrutores=Eventos.paraAcontecer();...
ISSO MESMO, INVOCAMOS UM MÉTODO QUE
NOS RETORNA A VIEW!
@(lista:List[Evento])
@for(evento<-lista){
@evento.getNome()
}
ROTAS E VIEWS VIRAM CLASSES!
E QUANDO TIVER UMA ALTERAÇÃO?
MEXA LIVREMENTE QUE O PLAY FICA
ATUALIZANDO :)
DECISÃO SOBRE TECNOLOGIAS
Jádecidiram algumas, vamos só olhar rapidamente
PERSISTÊNCIA
Ebean
JPA
publicclassEventosControllerextendsController{
publicstaticResultindex(){
List<Evento>eventos=Ebean.find(Evento.class).fin...
REFLEXÃO SOBRE MÉTODOS ESTÁTICOS
MANTER ESTADO NO CONTROLLER? QUAL O
MOTIVO?
VOLTANDO PARA AS TECNOLOGIAS
PRECISAVAM DE UMA VIEW QUE FOSSE EM
SCALA
PARA A VIEW, TWIRL
@(eventos:List[Evento])
@if(flash().get("sucesso")!=null){
<span class="msg_sucesso">@flash().get("sucesso")</span>
}
<ul>...
O AGENDATECH PRECISA TUITAR SOBRE OS
EVENTOS
AKKA PARA TAREFAS ASSÍNCRONAS
ActorRefactor=SystemActor.apply(SendTwitterActor.class);
actor.tell(evento,null);
NECESSÁRIO PEGAR FOTOS LEGAIS SOBRE O
EVENTO
API PRONTA PARA REQUESTS EXTERNOS
WSRequestHolderrequester=
WS.url("https://api.instagram.com/v1/tags/qcon2014/...");
requ...
E QUAL SERVIDOR VAMOS USAR PARA
DEPLOYAR?
NETTY COMO SERVIDOR HTTP
E A ESPECIFICAÇÃO DE SERVLETS?
RAZÕES PARA NÃO SEGUIR A SPEC
Não precisar ficar criando adapter paraas implementações
Como lidar com as respostas assíncr...
MEGA VANTAGENS(REATIVO)
PELO MENOS NA MINHA OPINIÃO
TUDO ASSÍNCRONO
VOLTANDO AO ASSUNTO SOBRE REQUISIÇÕES
PARA SERVIÇOS EXTERNOS
publicstaticResultultimasFotos(Stringhashtag){
WSRequestHolde...
E SE O INSTAGRAM ESTIVER LERDO?
NÃO QUEREMOS SEGURAR A THREAD!
publicstaticPromise<Result>ultimasFotos(Stringhashtag){
WSRequestHolderrequester=
WS.url("h...
ESSA É UMA DAS CHAVES DO SUCESSO
PARA SUA FELICIDADE, PODE NÃO SER SUFICIENTE
COLOCANDO MAIS SERVIDORES
ESCALONAMENTO HORIZONTAL
E O USUÁRIO LOGADO FICA ONDE?
NO CLIENTE
STATELESS PARA A VITÓRIA
SEM OBJETOS COMPLEXOS NA SESSION
//nãocompila!
session().put("infoDoUsuario",objetoUsuario);
//agorasim
session().put("inf...
COLOCAR VÁRIOS SERVIDORES FICOU FÁCIL
EXEMPLO HAPROXY
backendservers
balanceroundrobin
optionhttpclose
optionredispatch
se...
SEMPRE QUE UM EVENTO É APROVADO,
ATUALIZA A HOME
COMO FAZER?
MODO ANTIGO
PINGS DE TEMPOS EM TEMPOS NO SERVIDOR
JEITO MAIS MODERNO
SERVER-SENT EVENTS
REATIVO MAIS UMA VEZ!
AGORA BASTA FAZER O REGISTRO
varfeed=newEventSource('@routes.AtualizaHomeController.registra())');
feed.addEventListener('...
PUSH NOTIFICATIONS
objectAtualizaHomeControllerextendsController{
val(chatOut,chatChannel)=Concurrent.broadcast[JsonNode]
...
E COMO PUSHAR INFORMAÇÕES?
AtualizaHomeController.chatChannel()
.push(Json.toJson(eventoAprovado));
FECHANDO!
GERANDO UMA DISTRIBUIÇÃO
play dist
DEPLOY
unzip agendatech.zip
deploy/bin/agendatech
ALGUMAS EMPRESAS QUE JÁ USAM
Coursera
Linkedin
Klout
LIVRO:
BLOG:
bit.ly/1hV0NMm
alots.wordpress.com
OBRIGADO!/AlbertoSouza @alberto_souza
Upcoming SlideShare
Loading in …5
×

playframework-intro

763 views
691 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
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
763
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
7
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

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

×