Novas arquiteturas Para aplicações corporativas (baseadas em software livre) www.obomprogramador.com: 1 / 54 Cleuton Sampaio Cleuton Sampaio $ whoami ● [email protected] ● http://www.obomprogramador.com www.obomprogramador.com: 2 / 54 Cleuton Sampaio A realidade mudou... ● Ubiquidade da informação... ● Variedade de plataformas... ● Velocidade da evolução tecnológica... ● E continuamos a desenvolver aplicações, usando tecnologias da década passada... Estamos acorrentados a uma árvore de frameworks, que funcionam como “âncoras”, limitando nossa agilidade em produzir novas aplicações, e gerando constantemente mais legado! www.obomprogramador.com: 3 / 54 Cleuton Sampaio Tudo aqui é Open Source ● Java e Java EE: OpenJDK, Jetty e Tomcat; ● Derby; ● MongoDB; ● Express.js; ● Angular.js; ● Node.js. www.obomprogramador.com: 4 / 54 Cleuton Sampaio Um desafio ● ● ● Pegue uma aplicação Java EE típica, feita há dois anos; Tente atualizá-la para a nova versão dos componentes... Agora, pegue uma aplicação Struts, feita há 5 anos, e tente fazer o mesmo... Aplicações Java EE envelhecem rapidamente! www.obomprogramador.com: 5 / 54 Cleuton Sampaio Por que? ● ● ● ● O ecossistema é feito para que você se concentre em Java; Os frameworks absorvem e abstraem as tecnologias de base; Os frameworks e suas APIs evoluem constantemente; O upgrade tecnológico implica em retrabalho. www.obomprogramador.com: 6 / 54 Cleuton Sampaio Exemplos... ● ● ● JSF 1.x para 2.x: Facelets e XHTML ao invés de JSP; Hibernate: Anotações JPA ao invés de arquivos de configuração; Novas interfaces, novos métodos, mudanças de assinaturas conhecidas etc; www.obomprogramador.com: 7 / 54 Cleuton Sampaio Acoplamento de plataforma ● ● ● Nosso código fica acoplado à plataforma Java EE na qual foi desenvolvido; Padrões são “assimilados”; Interoperabilidade, só com a mesma plataforma; www.obomprogramador.com: 8 / 54 Cleuton Sampaio Problemas? ● ● ● Tente usar HTML 5 com componentes JSF... Tente integrar uma aplicação móvel com um WebService SOAP/XML; Isso, sem falar em EJB... www.obomprogramador.com: 9 / 54 Cleuton Sampaio O que os outros pensam... ● Technology Radar, de Janeiro de 2014, editado pela ThoughtWorks "Nós continuamos a ver as equipes enfrentarem problemas usando JSF - JavaServer Faces - e estamos recomendando evitar esta tecnologia. As equipes parecem escolher JSF, porque é um padrão J2EE, sem realmente avaliar se o modelo de programação lhes convém. Achamos que JSF é falho porque tenta abstrair HTML, CSS e HTTP, exatamente o inverso do que os frameworks web modernos fazem. JSF (assim como os webforms, do ASP.NET) tenta criar manutenção de estado em cima do protocolo HTTP, que é inerentemente "stateless", e acaba causando uma série de problemas envolvendo estado do lado do servidor compartilhado. Estamos conscientes das melhorias no JSF 2.0, mas acho que o modelo é fundamentalmente quebrado. Recomendamos às equipes usarem frameworks simples e abraçarem e compreenderem as tecnologias web, incluindo HTTP, HTML e CSS." www.obomprogramador.com: 10 / 54 Cleuton Sampaio O que os outros usam... ● HotFrameworks, Fevereiro de 2014 1)ASP.NET; 2)Ruby on Rails; 3)ASP.NET MVC; 4)Django; 5)AngularJS; E o JSF vem em décimo quinto lugar. www.obomprogramador.com: 11 / 54 Cleuton Sampaio SOAP/XML vs REST/JSON ● ProgrammableWeb www.obomprogramador.com: 12 / 54 Cleuton Sampaio Bancos de dados NoSQL ● Martin fowler "The rise of NoSQL databases marks the end of the era of relational database dominance. But NoSQL databases will not become the new dominators. Relational will still be popular, and used in the majority of situations. They, however, will no longer be the automatic choice. The era of Polyglot Persistence has begun" www.obomprogramador.com: 13 / 54 Cleuton Sampaio MongoDB ● Technology Radar Janeiro 2014 Ao invés de mapear seus documentos artificialmente, usando modelagem O/R em Java, use um banco de dados NoSQL como o MongoDB. www.obomprogramador.com: 14 / 54 Cleuton Sampaio O peso do ecossistema Java ● Container: Soluções que você não precisa, para problemas que você não tem! – – – – As aplicações modernas são simples, com interface Web, e acesso via Ajax; Não precisamos de EJB, JSF e JPA; Não precisamos trafegar uma “árvore de componentes”; Não precisamos de uma camada de apresentação no Servidor! www.obomprogramador.com: 15 / 54 Cleuton Sampaio frameworksareevil.com ● Frameworks monolíticos, como o Java EE, servem para criar castelos – – – – São complexos São monolíticos São pesados São desnecessários www.obomprogramador.com: 16 / 54 Cleuton Sampaio A arquitetura moderna ● O que vamos usar deve ser: – – – – Simples; Distribuído; Leve; Só o indispensável; Arquitetura diluída, risco diluído JSON Redis Express Node.js REST MongoDB Angular www.obomprogramador.com: 17 / 54 Cleuton Sampaio Por que? ● Simplicidade é menor custo; ● Distribuir a responsabilidade reduz o risco; ● Leveza aumenta a performance; ● Racionalizar aumenta o ROI! www.obomprogramador.com: 18 / 54 Cleuton Sampaio Métodos ágeis e arquitetura lerda? Pode um ecossistema de alta complexidade acidental ser utilizado com: Scrum, Kanban e Poker Planning? www.obomprogramador.com: 19 / 54 Cleuton Sampaio Não acredita? www.obomprogramador.com: 20 / 54 Cleuton Sampaio Vamos provar! ● Microblog www.obomprogramador.com: 21 / 54 Cleuton Sampaio Descrição do exemplo ● Aplicação Java EE Microblog – – – – Feita há uns 2 anos; Java EE com JSF 1.2 – Facelets; Templates em XHTML; JPA com Hibernate, usando Derby; Vamos dar uma olhada na workspace eclipse www.obomprogramador.com: 22 / 54 Cleuton Sampaio Arquitetura XHTML XHTML Apresentação Apresentação Javaserver Faces Faces Javaserver Servidor Servidor Facelets Facelets Expr. Language Language Expr. Manag. Bean Bean Manag. Lógica de de negócios negócios (Servidor) (Servidor) Lógica Business Object Object Business Modelo (Cross layer) Cliente Cliente Componentes JSF JSF Templates Facelets Facelets Componentes Templates Persistência (Servidor) (Servidor) Persistência JPA /Hibernate /Hibernate JPA Derby Derby www.obomprogramador.com: 23 / 54 DAO DAO Cleuton Sampaio Problemas? ● Só para começar, temos que conhecer 7 “idiomas” – – – – Javaserver Faces; Facelets; Expression language; XHTML; – Componentes JSF; Java/JavaEE – JPA/Hibernate – www.obomprogramador.com: 24 / 54 Tudo concentrado em um só “stack” de frameworks: O ecossistema Java EE! Cleuton Sampaio Problemas? ● ● Ficam desatualizados rapidamente; “Encapsulam” as teconogias de base; ● Diminuem a flexibilidade; ● Aumentam a curva de aprendizado; ● Implicam em acoplamento de plataforma; www.obomprogramador.com: 25 / 54 Cleuton Sampaio Rápida desatualização ● Javaserver Faces está na versão 2.2; ● Facelets foram incorporados ao JSF; ● JPA já está na versão 2.1; ● Bibliotecas de componentes foram atualizadas; Atualização da aplicação é sempre complexa... www.obomprogramador.com: 26 / 54 Cleuton Sampaio Encapsulamento malígno ● A ideia de “tudo em Java” cria problemas de interoperabilidade; ● SQL encapsulado; ● HTML, Javascript e CSS encapsulados; www.obomprogramador.com: 27 / 54 Cleuton Sampaio Solução inflexível ● ● Não se integra facilmente com outros stacks; Não admite facilmente inovações, como: HTML 5, NoSQL etc; www.obomprogramador.com: 28 / 54 Cleuton Sampaio Grande curva de aprendizado ● ● ● ● Web designers não conseguem produzir diretamente; Web developers (PHP, RoR etc) não conseguem colaborar; Formar um desenvolvedor Java EE pode demorar muito tempo; É necessário adquirir a “cultura” Java e Java EE. www.obomprogramador.com: 29 / 54 Cleuton Sampaio Acoplamento de plataforma ● ● Evolução? Só se for em Java e Java EE; O custo de upgrade é alto, mesmo se insistirmos no Java EE; O principal argumento em favor do Java EE é que, com o passar do tempo, a produtividade dos desenvolvedores aumenta, pois se concentram em uma única tecnologia. www.obomprogramador.com: 30 / 54 Cleuton Sampaio Admirável mundo novo... ● Rápida evolução tecnológica; ● Alta competitividade; ● Ubiquidade da informação! www.obomprogramador.com: 31 / 54 Cleuton Sampaio Precisamos de aplicações ● Simples; ● Modulares; ● Interoperáveis; ● Desacopladas; ● De menor risco, custo e prazo; ● De rápida construção; ● De baixo investimento; ● De baixo comprometimento. www.obomprogramador.com: 32 / 54 Cleuton Sampaio Solução 1 ● Diminuir a concentração no Java EE e no Container – – – – – Vamos “diluir” a aplicação, mantendo Java EE; Vamos usar HTML 5, REST e JSON; Vamos usar um banco NoSQL; Vamos usar um RESTful web service com Jersey, em um container embutido; Vamos mover a sessão para o Banco de Dados. www.obomprogramador.com: 33 / 54 Cleuton Sampaio Vantagens ● ● ● ● ● Preservamos nosso investimento em Java e Java EE; Criamos uma aplicação mais modular; Menor concentração no Java EE e no Container; Mas interoperável; Mais simples, aproveitando o conhecimento dos outros; www.obomprogramador.com: 34 / 54 Cleuton Sampaio Arquitetura HTML 55 HTML Javascript Javascript CSS CSS Apresentação Apresentação HTML 55 HTML REST REST Lógica de de negócios negócios (Servidor) (Servidor) Lógica Jetty RESTful WS WS stateless stateless RESTful JSON Cliente Cliente jQuery jQuery Persistência (Servidor) (Servidor) Persistência MongoDB MongoDB O estado fica no banco! www.obomprogramador.com: 35 / 54 Cleuton Sampaio Olha, mãe, sem container! A página HTML fala diretamente com o RESTful Webservice www.obomprogramador.com: 36 / 54 Cleuton Sampaio Solução 2: Limar o Java EE! ● ● ● Será que essa solução é mesmo desacoplada? Queria tirar o Java EE, mas manter o nosso DAO em Java, pois está funcionando bem; Vamos substituir o RESTful Web Service e o Java EE! www.obomprogramador.com: 37 / 54 Cleuton Sampaio Vamos substituir partes! HTML 55 HTML Javascript Javascript CSS CSS Apresentação Apresentação REST REST Lógica de de negócios negócios (Servidor) (Servidor) Lógica Jetty RESTful WS WS RESTful JSON HTML 55 HTML Cliente Cliente jQuery jQuery Persistência (Servidor) (Servidor) Persistência MongoDB MongoDB Olha, mamãe, sem Java EE! www.obomprogramador.com: 38 / 54 Java Cleuton Sampaio Node.js ● Uma aplicação C++ que usa o engine V8; ● Uma camada de componentes servidores; ● Cria apps servidoras só com Javascript! var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/'); No container, no cry! www.obomprogramador.com: 39 / 54 Cleuton Sampaio Arquitetura do Node.js ● ● ● ● Um loop de eventos monothread; Menor “footprint”; Performance absurda; 1 Servidor = milhares de requests! www.obomprogramador.com: 40 / 54 Cleuton Sampaio É javascript, caramba! ● Todo mundo conhece Javascript! ● Uma ou outra API a mais... ● ● Tem plugin para IDEs, com depuração gráfica! Baixíssima curva de aprendizado; www.obomprogramador.com: 41 / 54 Cleuton Sampaio Limando o Java EE! HTML 55 HTML Javascript Javascript CSS CSS Apresentação Apresentação HTML 55 HTML REST REST Lógica de de negócios negócios (Node.js) (Node.js) Lógica Javascript! Java! RESTful WS WS stateless stateless RESTful JSON Cliente Cliente jQuery jQuery Persistência (Java) (Java) Persistência MongoDB MongoDB O estado fica no banco! www.obomprogramador.com: 42 / 54 Cleuton Sampaio Agora, sem Java EE! A página HTML 5 fala diretamente com a aplicação Node.js, usando REST e JSON, mas usamos o mesmo DAO feito em Java www.obomprogramador.com: 43 / 54 Cleuton Sampaio Mas, o que conseguimos? ● Uma aplicação desacoplada; ● Interoperável; ● Simples; ● Baixo custo; ● Baixo comprometimento; www.obomprogramador.com: 44 / 54 Cleuton Sampaio Qual é a direção dos ventos? ● M.E.A.N. stack – – – – MongoDB; Express.js; Angular.js; Node.js. www.obomprogramador.com: 45 / 54 Cleuton Sampaio De que se trata? ● ● ● ● M: MongoDB - Banco "no-SQL", que trabalha diretamente com objetos BSON / JSON, alta performance com grande volume de dados; E: Express.js - Um framework para criação de aplicações cliente-servidor, baseadas em Javascript e Node.js, que usem REST como API; A: Angular.js - É um framework MVC para uso em páginas HTML, feito pela Google. Cria páginas HTML 5 dinâmicas, usando “Two-way data binding”; N: Node.js – Usa o Javascript V8, do Chrome, para criar aplicações servidoras, baseadas em "no blocking I/O", que respondem muito bem ao alto tráfego e grande volume de dados. www.obomprogramador.com: 46 / 54 Cleuton Sampaio Express.js ● Organiza sua aplicação: /projeto ......../node_modules ......../public .............../images .............../javascripts .............../stylesheets ......./routes ......./views .......app.js Rota 1 Template Request Rota 2 Rota n Template engine MongoDB Response www.obomprogramador.com: 47 / 54 Cleuton Sampaio Angular.js ● ● Manipulação da página sem lidar com DOM; Two-way data binding – atualização dinâmica; View Controller Model Web www.obomprogramador.com: 48 / 54 Cleuton Sampaio Uma demonstração www.obomprogramador.com: 49 / 54 Cleuton Sampaio Inserimos um novo link www.obomprogramador.com: 50 / 54 Cleuton Sampaio Isso responde às críticas! ● Pra quê criar servidores: Não precisamos, pois temos o Express.js, o Restify.js etc; ● Node.js é desorganizado: Express.js; ● MongoDB não tem esquema: Mongoose; ● Lidar com DOM é complicado: Angular.js e Jade; www.obomprogramador.com: 51 / 54 Cleuton Sampaio Por que mudar? ● Tudo está mudando, até mesmo o Java EE; ● Temos que evitar o Golden Hammer; ● Vamos parar de construir castelos; ● Precisamos baixar: custo, risco e prazo... ● …investindo esse capital em coisas mais úteis! Com ferramentas e padrões abertos! www.obomprogramador.com: 52 / 54 Cleuton Sampaio “Always in motion is the future.” YODA, Star Wars Episode V: The Empire Strikes Back www.obomprogramador.com: 53 / 54 Cleuton Sampaio Onde obter informações ● http://www.obomprogramador.com – ● “/search/label/arquitetura%20diluída” http://www.obomprogramador.com – “/search/label/mean%20development” www.obomprogramador.com: 54 / 54 Cleuton Sampaio