Trilha Java EE

Aplicações Web Modernas com JHipster

Josenaldo de Oliveira Matos Filho

github.com/josenaldo

@josenaldomatos

Quem somos?

Grupo de usuários Java do Triângulo Mineiro

Java pra Web na Arca de Noé

EJB ou Spring

Templates (JSP, JSF, XDoclet, Velocity, Tiles, Thymeleaf)

HTML + CSS + JS + JQuery

Aplicações web modernas

Usuários estão mais exigentes. Não querem sites lentos e estáticos. Eles querem:

  • Sites bonitos
  • Não precisar carregar páginas a cada ação
  • Carregar pedaços da página dinamicamente
Precisamos usar as últimas tecnologias HTML, CSS e JS

Produtividade para desenvolvedores

Websites devem ser desenvolvidos rapidamente

Esperar 1 minuto para fazer um simples deploy não é mais aceitável

Precisamos das ferramentas certas para o trabalho

Sistemas pronto para produção

Sites que devem aguentar milhares de usuários

Diversos clientes acessando o backend através de REST

Precisamos de servidores robustos, escaláveis e de alta performance

Como resolver esses problemas

  • Fronteend com HTML/CSS/Javascript
  • Backend robusto com últimas tecnologias de Java, caching e acesso a dados
  • Tudo configurado automaticamente, com performance em mente
  • Ferramentas adequadas para otimizar o desenvolvimento

Client-side technologies

YEOMAN, GULP, BOWER, ANGULARJS, BOOTSTRAP

Yeoman

Geração de esqueleto de aplicação

  • Centenas de geradores disponíveis
  • A maioria é orientado a aplicaçoes frontend javascript
  • Os melhor avaliados são de ótima qualidade
yo jhipster

Gulp

Automação de tarefas com JavaScript

  • No desenvolvimento, ele permite o "live reloading", roda tests em background...
  • Para produção, comprime e otimiza recursos, compila sass, atualiza referências...
gulp test

Bower

Gerenciador de dependências javascript

  • Permite buscar, instalar e atualizar bibliotecas javascript
  • Milhares de bibliotecas
bower install angular

Karma

Execução de testes unitários no javascript

  • Funciona com Phantom.js, um navegador sem UI
  • É muito rápido, e pode rodar continuamente em background
karma start src/test/javascript/karma.conf.js

AngularJS

O framework MVVM mais popular no frontend

  • Poderoso & fácil de aprender
  • Data binding, form validation, i18n... tudo out of the box

<input type="text" ng-model="yourName" placeholder="Enter a name here">
<h1>Hello {{yourName}}!</h1>
                    

Twitter Bootstrap

Framework CSS/JavaScript para Web apps responsivas

  • CSS e elementos HTML para os casos mais comuns
  • Um montão de componentes: menus, navbars, drop-down, alertas, formulários...
  • Qualquer programador faz algo bonito com o Bootstrap

<div class="alert alert-success">
	<strong>Hello, world!</strong>
</div>
                    

Server-side technologies

MAVEN, SPRING, SPRING MVC REST, SPRING DATA JPA, NETFLIX OSS

Maven | Gradle

Build e gestão de dependência

  • Estrutura de diretórios e tarefas padronizados
  • Integração com as maiores IDEs
  • Ecossistema de plugins rico e maduro
./mvnw spring-boot:run
./gradlew bootRun

Spring Boot

Padrão de-facto para criação de Java apps

  • IoC, AOP e diversas abstrações pra facilitar o desenvolvimento
  • Rápidi, leve e extremamente poderoso
  • Configuração por convenção com Spring Boot

@Service
@Transactional
public class UserService {

	@Inject
	private UserRepository userRepository;

}
                    

Liquibase

Evolução do banco de dados

  • Evolução do banco scriptada e reprodutível
  • Funciona bem com Spring e JPA
  • Exige bom entendimento de banco de dados e ORM

JPA

Mapeamento Objeto Relacional padrão para Java

  • Hibernate é a implementação escolhida
  • Framework completo de acesso a dados
  • Complexo para noobs

@Entity
public class User implements Serializable {

	@Id
	private String login;

}
                	

Spring Data JPA

Adds extra syntaxic sugar on top of JPA

  • Generates your JPA repositories automatically
  • Removes a lot of boilerplate code

public interface PersistenceAuditEventRepository extends JpaRepository<PersistentAuditEvent, String> {

List<PersistentAuditEvent>
    findByPrincipalAndAuditEventDateGreaterThan(String principal, LocalDateTime after);

}
                    

MongoDB

Escalabilidade com NOSQL

  • Alternativa aos bancos relacionais e ao JPA
  • Similaridade: Spring Data MongoDB parecido com Spring Data JPA
  • Escalável e fácil de usar

Cassandra

Escalabilidade com NOSQL

  • 2a. Alternativa aos bancos relacionais e ao JPA
  • Escalabilidade Linear e alta disponibilidade
  • Performance extrema e baixa latência para aplicações de missão crítica

Caching

Caching é sinônimo de performance

  • Ehcache é a soliução mais usada
  • HazelCast é a alternativa para cache clusterizado
  • Hibernate 2nd level cache ou Spring Caching

@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class User implements Serializable {

}
                    

Spring Security

Segurança à prova de balas

  • Framework líder de mercado, usado em todo tipo de aplicação
  • Segurança aplicada a URLs e a código Java (Spring Beans)
  • Trabalha com arquiteturas stateful (cookies) e stateless (OAuth2/JWT)

Spring MVC REST

O melhor framework REST em Java

  • Solução completa de alta performance para REST
  • Fácil de usar com Spring, fácil de testar

@RestController
public class AccountResource {
	@RequestMapping(value = "/app/rest/account",
		method = RequestMethod.POST)
	public void saveAccount(@RequestBody UserDTO userDTO) {
	    userService.updateUserInformation(userDTO);
	}
}
                    

Thymeleaf

Server-side templates

  • Used quando uma Single Web Page Application não é suficiente
  • Substitui JSPs e JSTLs,os quais estão datados e depreciados
  • Template engine poderosa e fácil de usar por Web designers
<h1 th:text="#{title}">Hello, world</h1>

Monitoramento

Pronto pra produção com Metrics

  • Monitore a JVM, o servidor de aplicação, Spring beans, cache e muito mais!
  • Relatórios com JMX ou Graphite

@Timed
public void saveAccount(@RequestBody UserDTO userDTO) {
	userService.updateUserInformation(userDTO);
}
                    

Implantação nas nuvens

Para o alto e além

  • A implantação da aplicação na nuvem é bastante facilitada
  • Ferramentas pra deploy na AWS, Heroku e Cloud Foundry

Porque usar JHipster

SERÁ QUE É APENAS HYPE?

Você disse hype?

Estatísticas de maio de 2016

  • 223 contribuintes, incluindo 13 core members
  • 4,210 GitHub stars e 928 forks
  • 220,000 instalações
  • E crescendo rapidamente!

Porque?

Um monte de tecnologias legais, mas...

  • Gulp e Maven podem ser amigos?
  • AngularJS e Spring MVC REST podem ser amigos?
  • Netflix OSS e Spring podem ser amigos?
  • Colocar tudo funcionando junto, suavemente, com segurança, cache, monitoramento, não é moleza...

JHipster põe tudo pra funcionar junto

  • JHipster cria uma aplicação completa com todas essas tecnologias e ferramentas
  • As coisas simplesmente funcionam out-of-the-box
  • Temos o workflow do Gulp totalmente integrado nas goals do Maven
  • Temos o Docker configurado pra rodar tudo na boa

E ainda tem mais!

  • "entity": subgerador que gera uma entidade JPA completa, do banco de dados até o Angular
  • "import-jdl": subgerador que gera u modelo de entidades complexo usando JDL Studio
  • "service" subgerador que gera um Spring business service
  • "languages" subgerador que adiciona um novo idioma para o i18n

E ainda tem mais!

  • Ótimo suporte para criar microservices e gateways
  • JHipster Registry (Netflix Eureka + Spring cloud config server) fornecido out-of-the-box
  • JHipster Console com ELK (Elasticsearch + Logstash + Kibana) fornecido out-of-the-box
  • Suporte ao Docker
  • Módulos adicionais: https://jhipster.github.io/modules/marketplace/

Pronto pra rodar

  • GZipping e HTTP caching headers
  • Otimização e minificação do JavaScript e CSS com o Gulp
  • Executável standalone ou arquivo WAR padrão, com monitoramento habilitado
  • Subgeradores para deploy automático no Cloud Foundry, Heroku e AWS
  • "docker-compose": subgerador que gera a configuração do Docker para fazer deploy de microservices

Hello World

TUTORIAL 10 MINUTOS

Instalação


npm install -g yo
npm install -g generator-jhipster
                    

Crie uma aplicação

E use o maven pra executar
(hot reload automático)


yo jhipster
./mvnw
                    

Client-side live reload

Live reload co código do frontend (HTML, CSS, JavaScript) graças ao Gulp e Browsersync.

Edita > Salva > Navegador atualiza automaticamente

gulp

Adicionaruma entidade

yo jhipster:entity Foo

Rodar em modo de produção

(Rodando o banco no docker)


./mvnw -Pprod package
docker-compose -f src/main/docker/mysql.yml up -d
java -jar target/*.war --spring.profiles.active=prod
                    

Perguntas?

github.com/josenaldo

josenaldo@gmail.com

@josenaldomatos