playframework-intro

59
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 na prática

description

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.

Transcript of playframework-intro

Page 1: playframework-intro

O MÍNIMO SOBRE MIM

ALBERTO SOUZAInstrutor e desenvolvedor pela .Caelum

Escritor do , usuário forte doPlay :) e commiter do VRaptor4.

Livro PlayFramework na prática

Page 2: playframework-intro

SAINDO DO ZERO COM O PLAYFRAMEWORKNÃO VOU GARANTIR QUE É FÁCIL COMO DIZEM POR AÍ

/ alots.wordpress.com @alberto_souza

Page 3: playframework-intro

MÍNIMO PARA RODAR O PRIMEIRO EXEMPLO

Page 5: playframework-intro

CRIANDO UM NOVO PROJETOplay new agendatech

Page 6: playframework-intro

ENTRANDO NO CONSOLE DO PLAYplay

Page 7: playframework-intro

IMPORTAR PARA O ECLIPSEeclipse

Page 8: playframework-intro

SUBIR O SERVIDOR~run

Page 9: playframework-intro

EXEMPLO DE ACESSOhttp://localhost:9000/eventos

Page 10: playframework-intro

QUEM TRATA?

Page 11: playframework-intro

ARQUIVO DE ROTAS!

Page 12: playframework-intro

GET /eventos controllers.EventosController.lista()

# Map static resources from the /public folder to the /assets URL pathGET /assets/*file controllers.Assets.at(path="/public", file)

Page 13: playframework-intro

package controllers;

import play.mvc.*;

public class EventosController extends Controller {

public static Result lista() { List<Evento> instrutores = Eventos.paraAcontecer(); return //tem que ir para a view }

}

Page 14: playframework-intro

public class EventosController extends Controller {

public static Result lista() { List<Evento> instrutores = Eventos.paraAcontecer(); return ok(views.html.eventos.lista.render(aprovados)); }

}

Page 15: playframework-intro

ISSO MESMO, INVOCAMOS UM MÉTODO QUENOS RETORNA A VIEW!

Page 16: playframework-intro

@(lista: List[Evento])

@for(evento <- lista){ @evento.getNome() }

Page 17: playframework-intro

ROTAS E VIEWS VIRAM CLASSES!

Page 18: playframework-intro

E QUANDO TIVER UMA ALTERAÇÃO?

Page 19: playframework-intro

MEXA LIVREMENTE QUE O PLAY FICAATUALIZANDO :)

Page 20: playframework-intro

DECISÃO SOBRE TECNOLOGIASJá decidiram algumas, vamos só olhar rapidamente

Page 21: playframework-intro

PERSISTÊNCIAEbeanJPA

Page 22: playframework-intro

public class EventosController extends Controller {

public static Result index() { List<Evento> eventos = Ebean.find(Evento.class).findList(); List<Evento> eventos = JPA.em().ah...UmaFormaFacil() return ok(view.instrutores.html.index.render(eventos)); }

}

Page 23: playframework-intro

REFLEXÃO SOBRE MÉTODOS ESTÁTICOS

Page 24: playframework-intro

MANTER ESTADO NO CONTROLLER? QUAL OMOTIVO?

Page 25: playframework-intro

VOLTANDO PARA AS TECNOLOGIAS

Page 26: playframework-intro

PRECISAVAM DE UMA VIEW QUE FOSSE EMSCALA

Page 27: playframework-intro

PARA A VIEW, TWIRL

Page 28: playframework-intro

@(eventos:List[Evento])

@if(flash().get("sucesso")!=null){ <span class="msg_sucesso">@flash().get("sucesso")</span>}<ul> @for(evento <- eventos) { @detalhe_lista(evento) }</ul>

Page 29: playframework-intro

O AGENDATECH PRECISA TUITAR SOBRE OSEVENTOS

Page 30: playframework-intro

AKKA PARA TAREFAS ASSÍNCRONAS

ActorRef actor = SystemActor.apply(SendTwitterActor.class); actor.tell(evento,null);

Page 31: playframework-intro

NECESSÁRIO PEGAR FOTOS LEGAIS SOBRE OEVENTO

Page 32: playframework-intro

API PRONTA PARA REQUESTS EXTERNOS

WSRequestHolder requester = WS.url("https://api.instagram.com/v1/tags/qcon2014/..."); requester.get();

Page 33: playframework-intro

E QUAL SERVIDOR VAMOS USAR PARADEPLOYAR?

Page 34: playframework-intro

NETTY COMO SERVIDOR HTTPE A ESPECIFICAÇÃO DE SERVLETS?

Page 35: playframework-intro

RAZÕES PARA NÃO SEGUIR A SPECNão precisar ficar criando adapter para as implementaçõesComo lidar com as respostas assíncronas?

Page 36: playframework-intro

MEGA VANTAGENS(REATIVO)PELO MENOS NA MINHA OPINIÃO

Page 37: playframework-intro

TUDO ASSÍNCRONO

Page 38: playframework-intro

VOLTANDO AO ASSUNTO SOBRE REQUISIÇÕESPARA SERVIÇOS EXTERNOS

public static Result ultimasFotos(String hashtag){ WSRequestHolder requester = WS.url("https://api.instagram.com/v1/tags/"+hashtag+"/...");

return ok(requester.get().get().getBody());}

Page 39: playframework-intro

E SE O INSTAGRAM ESTIVER LERDO?

Page 40: playframework-intro

NÃO QUEREMOS SEGURAR A THREAD!

public static Promise<Result> ultimasFotos(String hashtag){ WSRequestHolder requester = WS.url("https://api.instagram.com/v1/tags/"+hashtag+"/...");

Promise<Response> esperandoAResposta = requester.get(); esperandoAResposta.map(response -> ok(response.getBody())); }

Page 41: playframework-intro

ESSA É UMA DAS CHAVES DO SUCESSOPARA SUA FELICIDADE, PODE NÃO SER SUFICIENTE

Page 42: playframework-intro

COLOCANDO MAIS SERVIDORESESCALONAMENTO HORIZONTAL

Page 43: playframework-intro

E O USUÁRIO LOGADO FICA ONDE?

Page 44: playframework-intro

NO CLIENTESTATELESS PARA A VITÓRIA

Page 45: playframework-intro

SEM OBJETOS COMPLEXOS NA SESSION

//não compila! session().put("infoDoUsuario",objetoUsuario);

//agora sim session().put("infoDoUsuario",algumaChaveDoUsuario);

Page 46: playframework-intro

COLOCAR VÁRIOS SERVIDORES FICOU FÁCILEXEMPLO HAPROXY

backend servers balance roundrobin

option httpclose option redispatch

server play1 127.0.0.1:8081 maxconn 32 server play2 127.0.0.1:8082 maxconn 32

Page 47: playframework-intro

SEMPRE QUE UM EVENTO É APROVADO,ATUALIZA A HOME

COMO FAZER?

Page 48: playframework-intro

MODO ANTIGOPINGS DE TEMPOS EM TEMPOS NO SERVIDOR

Page 49: playframework-intro

JEITO MAIS MODERNO

Page 50: playframework-intro

SERVER-SENT EVENTSREATIVO MAIS UMA VEZ!

Page 51: playframework-intro

AGORA BASTA FAZER O REGISTRO

var feed = new EventSource('@routes.AtualizaHomeController.registra())');

feed.addEventListener('message',handlerDoEvento, false);

Page 52: playframework-intro

PUSH NOTIFICATIONS

object AtualizaHomeController extends Controller {

val (chatOut, chatChannel) = Concurrent.broadcast[JsonNode] def registra() = Action { Ok.feed(chatOut &> EventSource()) .as("text/event-stream") }}

Page 53: playframework-intro

E COMO PUSHAR INFORMAÇÕES?

AtualizaHomeController.chatChannel().push(Json.toJson(eventoAprovado));

Page 54: playframework-intro

FECHANDO!

Page 55: playframework-intro

GERANDO UMA DISTRIBUIÇÃOplay dist

Page 56: playframework-intro

DEPLOYunzip agendatech.zip

deploy/bin/agendatech

Page 57: playframework-intro

ALGUMAS EMPRESAS QUE JÁ USAMCourseraLinkedinKlout

Page 58: playframework-intro

LIVRO:

BLOG:

bit.ly/1hV0NMm

alots.wordpress.com

Page 59: playframework-intro

OBRIGADO! / Alberto Souza @alberto_souza