SlideShare uma empresa Scribd logo
1 de 28
Baixar para ler offline
Minha aplicação Java vai
pra Nuvem. E agora?
/dev/FelipeMamud
@ftmamud
github.com/fmamud
friendstechday.com
meetup.com/groovybr
slideshare.net/fmamud
Agradecimentos
friendstechday.com
PaaS
DISCLAIMER
Mas por que migrar?
Para convencer o gerente...
Reduzir o custo? A galera toda está indo pra nuvem, demoro!
+Escalabilidade? +Disponibilidade?
+Elasticidade?
Otimização de recursos?
Serviços prontos para utilização?
Qualquer tipo de nuvem me atende, ta sussa!
Qualquer fornecedor de nuvem me atende, suave!
Limitações e vendor lock-in. Bora!
Não vai influenciar em nada meu trampo, é nois!
PaaS?
Algumas diferenças
● Somente Embeddable Application Servers, sendo possível deploy do .war (Tomcat, Jetty,
JBoss or GlassFish, etc.);
● Bibliotecas como stack de Servlet, JSP, drivers JDBC e outras bibliotecas Java EE são linkadas
na aplicação usando gerenciamento de dependência;
● Configuração de serviço baseado em variável de ambiente (Ex: DATABASE_URL);
● Deploy via Git workflow →
● Gerenciamento de infra e aplicação via ferramenta de CLI [Heroku Toolbelt]. (Ex. start/stop,
clustering, logs).
$ git push heroku master
Particularidades
● Suporte para Java 6, 7 e 8;
● Dynos → Lightweight linux container. (Web, Worker e One-off);
● Arquitetura share-nothing. (Não devem haver sessões stateful);
● Clustering via CLI →
● Load-balance automático;
● Failover com detecção de falha em nó de aplicativo, em seguida, tentativa
de reinício;
$ heroku ps:scale web=2 worker=4 ...
E para começar?
● Java instalado;
● Maven 3.x instalado;
● Criar uma conta free no Heroku;
● Baixar e instalar o Heroku Toolbelt;
Login no Heroku
Lá vamos nós...
Fork de um projeto Java Blank
$ heroku login
Enter your Heroku credentials.
Email: java@example.com
Password:
$ git clone https://github.com/heroku/java-getting-started.git
$ cd java-getting-started
$ cat Procfile
web: java -cp target/classes:target/dependency/* Main
Estrutura do projeto
$ cat system.properties
java.runtime.version=1.8
$ cat pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http:
//maven.apache.org/maven-v4_0_0.xsd">
...
Criando a aplicação no Heroku
$ heroku create
Creating soujava-locaweb-13062015... done, stack is cedar-14
http://soujava-locaweb-13062015.herokuapp.com/ | https://git.heroku.com/soujava-locaweb-13062015.git
Git remote heroku added
Criação
Fazendo o deploy
Deploy
$ git push heroku master
Initializing repository, done.
Counting objects: 68, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (19/19), done.
Writing objects: 100% (68/68), 7.07 KiB | 0 bytes/s, done.
Total 68 (delta 22), reused 65 (delta 22)
-----> Java app detected
-----> Installing OpenJDK 1.8... done
-----> Installing Maven 3.3.1... done
-----> Executing: mvn -B -DskipTests=true clean install
....
O que acontece no deploy?
Slugs são copias comprimidas e pré-empacotadas de sua aplicação otimizada para a distribuição
para o dyno manager. (Limite de 15m na compilação).
1. Cria um novo checkout de HEAD oriundo do branch master;
2. Remove arquivos não utilizados, incluindo diretórios .git, arquivos .gitmodules, qualquer
arquivo no tmp, e qualquer entrada especificada em um arquivo top-level .slugignore.
3. Download, build e install das dependências locais, conforme especificado no arquivo de build
(Ex.: Gemfile, package.json, requirements.txt, pom.xml, etc.) com a ferramenta de
gerenciamento de dependência suportada pela linguagem utilizada (ex.: Bundler, npm, pip,
Maven).
4. Empacotamento final do slug file.
Garantindo pelo menos, uma instância da aplicação em execução:
Finalizando
Para finalizar… abrir a aplicação no browser.
$ heroku ps:scale web=1
$ heroku open
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;
public class StartWebApp {
public static void main(String[] args) throws Exception {
String portStr = System.getenv("PORT");
int port = (portStr == null) ? 8085 : Integer.parseInt(portStr);
Server server = new Server(port);
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
// change the name of the war as needed.
webapp.setWar("target/classes/mywebapp.war");
server.setHandler(webapp);
server.start();
server.join();
}
}
E deploy com WAR?
Fonte: http://ollivander.franzoni.eu/2011/10/20/deploy-any-java-webapp-via-war-to-heroku/
Visualizando logs
Outros comandos úteis 1/3
$ heroku ps
=== web (1X): `java $JAVA_OPTS -cp target/classes:target/dependency/* Main`
web.1: up 2015/06/13 08:45:07 (~ 2m ago)
Verificando quantos dynos estão em execução
$ heroku logs --tail
2015-06-13T08:55:07.254053+00:00 heroku[web.1]: State changed from starting to up
2015-06-13T08:55:05.214125+00:00 heroku[web.1]: Starting process with command `java -Xmx384m -Xss512k
-XX:+UseCompressedOops -cp target/classes:target/dependency/* Main`
...
Visualizar todos os releases
Outros comandos úteis 2/3
$ heroku releases:rollback v102
Rolling back demoapp... done, v102
$ heroku releases
== demoapp Releases
v104 Rollback to v102 jon@heroku.com 2013/01/31 14:11:33 (~15s ago)
v103 Deploy 582fc95 jon@heroku.com 2013/01/31 12:15:35
v102 Deploy 990d916 jon@heroku.com 2013/01/31 12:01:12
Executando um rollback
$ heroku releases
== demoapp Releases
v103 Deploy 582fc95 jon@heroku.com 2013/01/31 12:15:35
v102 Deploy 990d916 jon@heroku.com 2013/01/31 12:01:12
Acessando a aplicação via bash
Outros comandos úteis 3/3
$ heroku addons:create rediscloud:25 // using var REDISCLOUD_URL
Adicionando add-ons na aplicação através do
$ heroku run bash
Running `bash` attached to terminal... up, run.8963
~ $ ls
Utilizando o foreman
E rodar a aplicação local?
$ foreman start web
07:45:16 web.1 | started with pid 2071
07:45:16 web.1 | 2015-06-13 07:45:16.329:INFO:oejs.Server:jetty-7.6.0.v20120127
07:45:16 web.1 | 2015-06-13 07:45:16.378:INFO:oejsh.ContextHandler:started o.e.j.s.
ServletContextHandler{/,null}
07:45:16 web.1 | 2015-06-13 07:45:16.411:INFO:oejs.AbstractConnector:Started
SelectChannelConnector@0.0.0.0:5000
E as variáveis de config?
private void showHome(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// Energy is compatible with mass (E=mc2)
RelativisticModel.select();
String energy = System.getenv().get("ENERGY");
Amount<Mass> m = Amount.valueOf(energy).to(KILOGRAM);
resp.getWriter().print("E=mc^2: " + energy + " = " + m);
}
$ heroku config
GITHUB_USERNAME: joesmith
OTHER_VAR: production
Limite de 16kb para cada aplicação.
E acesso ao DB?
private Connection getConnection() throws URISyntaxException, SQLException {
URI dbUri = new URI(System.getenv("DATABASE_URL"));
String username = dbUri.getUserInfo().split(":")[0];
String password = dbUri.getUserInfo().split(":")[1];
int port = dbUri.getPort();
String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ":" + port + dbUri.getPath();
return DriverManager.getConnection(dbUrl, username, password);
}
$ heroku config
=== soujava-locaweb-13062015 Config Vars
DATABASE_URL: postgres://qplhasewkhqyxp:
YXDPSRus9MrU4HglCPzjhOevee@ec2-54-204-47-58.compute-1.amazonaws.com:
5432/dc9qsdnghia6v1
DB Pool?
import java.sql.*;
import org.apache.commons.dbcp.*;
private BasicDataSource connectionPool;
public configureDBPool() throws URISyntaxException, SQLException {
URI dbUri = new URI(System.getenv("DATABASE_URL"));
String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + dbUri.getPath();
connectionPool = new BasicDataSource();
if (dbUri.getUserInfo() != null) {
connectionPool.setUsername(dbUri.getUserInfo().split(":")[0]);
connectionPool.setPassword(dbUri.getUserInfo().split(":")[1]);
}
connectionPool.setDriverClassName("org.postgresql.Driver");
connectionPool.setUrl(dbUrl);
connectionPool.setInitialSize(1); // to set the initial size of the pool.
}
Referências
● Heroku Java
https://devcenter.heroku.com/categories/java
● PaaS Comparison
http://www.infoq.com/br/articles/paas_comparison
● WAR files vs embedded servers
http://steveperkins.com/war-files-vs-embedded-servers
"For I am persuaded, that neither death, nor life, nor angels, nor principalities,
nor powers, nor things present, nor things to come,
Nor height, nor depth, nor any other creature, shall be able to separate us from
the love of God, which is in Christ Jesus our Lord." (Romanos 8:38-39)
FTD GROUP, JOIN US!

Mais conteúdo relacionado

Mais procurados

TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JSRodrigo Urubatan
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webelliando dias
 
Começando com Vue.js
Começando com Vue.jsComeçando com Vue.js
Começando com Vue.jsmarcusbalbi
 
Django deploy - Como servir aplicações Django em produção
Django deploy - Como servir aplicações Django em produçãoDjango deploy - Como servir aplicações Django em produção
Django deploy - Como servir aplicações Django em produçãoArtur Felipe Sousa
 
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010lucashungaro
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Frameworkelliando dias
 
Iniciando com Yeoman, Grunt e Bower
Iniciando com Yeoman, Grunt e BowerIniciando com Yeoman, Grunt e Bower
Iniciando com Yeoman, Grunt e BowerMateus Padua
 
Usando seu codigo java no mule part 1
Usando seu codigo java no mule part 1Usando seu codigo java no mule part 1
Usando seu codigo java no mule part 1Jeison Barros
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Rodrigo Urubatan
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasRodrigo Branas
 
Gerenciamento de Configurações - Puppet
Gerenciamento de Configurações - PuppetGerenciamento de Configurações - Puppet
Gerenciamento de Configurações - PuppetRoberto Scudeller
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Emerson Macedo
 
Armazenamentos offline-ap is-para-pwa
Armazenamentos offline-ap is-para-pwaArmazenamentos offline-ap is-para-pwa
Armazenamentos offline-ap is-para-pwaEduardo Matos
 
Integração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlIntegração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlDiego Tremper
 
Java Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuraçãoJava Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuraçãoEduardo Mendes
 
Yaf - Um framework que roda sob uma extensão
Yaf - Um framework que roda sob uma extensãoYaf - Um framework que roda sob uma extensão
Yaf - Um framework que roda sob uma extensãoThiago Paes
 

Mais procurados (20)

Mean Stack
Mean StackMean Stack
Mean Stack
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento web
 
Começando com Vue.js
Começando com Vue.jsComeçando com Vue.js
Começando com Vue.js
 
Django deploy - Como servir aplicações Django em produção
Django deploy - Como servir aplicações Django em produçãoDjango deploy - Como servir aplicações Django em produção
Django deploy - Como servir aplicações Django em produção
 
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Framework
 
Quasar framework
Quasar frameworkQuasar framework
Quasar framework
 
Iniciando com Yeoman, Grunt e Bower
Iniciando com Yeoman, Grunt e BowerIniciando com Yeoman, Grunt e Bower
Iniciando com Yeoman, Grunt e Bower
 
Usando seu codigo java no mule part 1
Usando seu codigo java no mule part 1Usando seu codigo java no mule part 1
Usando seu codigo java no mule part 1
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
 
Gerenciamento de Configurações - Puppet
Gerenciamento de Configurações - PuppetGerenciamento de Configurações - Puppet
Gerenciamento de Configurações - Puppet
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
 
Web Offline
Web OfflineWeb Offline
Web Offline
 
Armazenamentos offline-ap is-para-pwa
Armazenamentos offline-ap is-para-pwaArmazenamentos offline-ap is-para-pwa
Armazenamentos offline-ap is-para-pwa
 
Integração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlIntegração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControl
 
Java Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuraçãoJava Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuração
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
 
Yaf - Um framework que roda sob uma extensão
Yaf - Um framework que roda sob uma extensãoYaf - Um framework que roda sob uma extensão
Yaf - Um framework que roda sob uma extensão
 

Destaque

Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...
Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...
Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...joaobmonteiro
 
Desenvolvimento de aplicativos para Android
Desenvolvimento de aplicativos para Android Desenvolvimento de aplicativos para Android
Desenvolvimento de aplicativos para Android joaobmonteiro
 
Escolhendo uma nuvem para sua webapp
Escolhendo uma nuvem para sua webappEscolhendo uma nuvem para sua webapp
Escolhendo uma nuvem para sua webappjoaobmonteiro
 
Desvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor AndroidDesvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor Androidjoaobmonteiro
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerLuminary Labs
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsLinkedIn
 

Destaque (6)

Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...
Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...
Frameworks e ferramentas Android para facilitar o seu dia a dia - Javaneiros ...
 
Desenvolvimento de aplicativos para Android
Desenvolvimento de aplicativos para Android Desenvolvimento de aplicativos para Android
Desenvolvimento de aplicativos para Android
 
Escolhendo uma nuvem para sua webapp
Escolhendo uma nuvem para sua webappEscolhendo uma nuvem para sua webapp
Escolhendo uma nuvem para sua webapp
 
Desvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor AndroidDesvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor Android
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI Explainer
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving Cars
 

Semelhante a Minha aplicação Java vai pra nuvem. E agora?

O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3Flávio Lisboa
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsSuissa
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebElenilson Vieira
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - BrazilStephen Chin
 
Testes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizadosTestes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizadosDiego Santos
 
Curso de Java (Parte 7) Web Application
Curso de Java (Parte 7) Web ApplicationCurso de Java (Parte 7) Web Application
Curso de Java (Parte 7) Web ApplicationMario Sergio
 
Cactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusCactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusDenis L Presciliano
 
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )João Moura
 
Android chat app com Node.js
Android chat app com Node.jsAndroid chat app com Node.js
Android chat app com Node.jsLuiz Duarte
 
Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Anderson Araújo
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?Rafael Benevides
 
Aplicações Realtime em Android | Fisl 15 | GuMobileRS
Aplicações Realtime em Android | Fisl 15 | GuMobileRSAplicações Realtime em Android | Fisl 15 | GuMobileRS
Aplicações Realtime em Android | Fisl 15 | GuMobileRSJackson F. de A. Mafra
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 

Semelhante a Minha aplicação Java vai pra nuvem. E agora? (20)

O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webapps
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias Web
 
Servlets e JSP
Servlets e JSPServlets e JSP
Servlets e JSP
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - Brazil
 
Testes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizadosTestes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizados
 
Plack
PlackPlack
Plack
 
Curso de Java (Parte 7) Web Application
Curso de Java (Parte 7) Web ApplicationCurso de Java (Parte 7) Web Application
Curso de Java (Parte 7) Web Application
 
Cactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusCactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta Cactus
 
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
 
servlet-introducao
servlet-introducaoservlet-introducao
servlet-introducao
 
Artigoajax
ArtigoajaxArtigoajax
Artigoajax
 
Android chat app com Node.js
Android chat app com Node.jsAndroid chat app com Node.js
Android chat app com Node.js
 
Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Como escolher o Framework Java para web?
Como escolher o Framework Java para web?
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?
 
Aplicações Realtime em Android | Fisl 15 | GuMobileRS
Aplicações Realtime em Android | Fisl 15 | GuMobileRSAplicações Realtime em Android | Fisl 15 | GuMobileRS
Aplicações Realtime em Android | Fisl 15 | GuMobileRS
 
Webpack
Webpack Webpack
Webpack
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
Java e Cloud Computing
Java e Cloud ComputingJava e Cloud Computing
Java e Cloud Computing
 
Java 16 Jdbc
Java 16 JdbcJava 16 Jdbc
Java 16 Jdbc
 

Mais de Felipe Mamud

Erlang sem enrolação
Erlang sem enrolaçãoErlang sem enrolação
Erlang sem enrolaçãoFelipe Mamud
 
Desenvolvendo software no mundo atual
Desenvolvendo software no mundo atualDesenvolvendo software no mundo atual
Desenvolvendo software no mundo atualFelipe Mamud
 
Reactive programming no mundo Java
Reactive programming no mundo JavaReactive programming no mundo Java
Reactive programming no mundo JavaFelipe Mamud
 
Reactive programming: Brincando com eficiência, composição e assíncronia
Reactive programming: Brincando com eficiência, composição e assíncroniaReactive programming: Brincando com eficiência, composição e assíncronia
Reactive programming: Brincando com eficiência, composição e assíncroniaFelipe Mamud
 
EBD - Perguntas que não querem calar
EBD - Perguntas que não querem calarEBD - Perguntas que não querem calar
EBD - Perguntas que não querem calarFelipe Mamud
 
EBD - A importância da Escola Bíblica Dominical
EBD - A importância da Escola Bíblica DominicalEBD - A importância da Escola Bíblica Dominical
EBD - A importância da Escola Bíblica DominicalFelipe Mamud
 
EBD - Força de jovem
EBD - Força de jovemEBD - Força de jovem
EBD - Força de jovemFelipe Mamud
 
EBD - O que você quer ser
EBD - O que você quer serEBD - O que você quer ser
EBD - O que você quer serFelipe Mamud
 
EBD - Deixando de ser bebê
EBD - Deixando de ser bebêEBD - Deixando de ser bebê
EBD - Deixando de ser bebêFelipe Mamud
 
EBD - O que você faria se fosse invisível
EBD - O que você faria se fosse invisívelEBD - O que você faria se fosse invisível
EBD - O que você faria se fosse invisívelFelipe Mamud
 
EBD - Coisas que não fazem sentido
EBD - Coisas que não fazem sentidoEBD - Coisas que não fazem sentido
EBD - Coisas que não fazem sentidoFelipe Mamud
 
EBD - Faça mais do que saber o que e um bocejo
EBD - Faça mais do que saber o que e um bocejoEBD - Faça mais do que saber o que e um bocejo
EBD - Faça mais do que saber o que e um bocejoFelipe Mamud
 
EBD - Varias formas de dizer a mesma coisa
EBD - Varias formas de dizer a mesma coisaEBD - Varias formas de dizer a mesma coisa
EBD - Varias formas de dizer a mesma coisaFelipe Mamud
 
EBD - 10 coisas que temos de dar a Deus
EBD - 10 coisas que temos de dar a DeusEBD - 10 coisas que temos de dar a Deus
EBD - 10 coisas que temos de dar a DeusFelipe Mamud
 

Mais de Felipe Mamud (20)

Erlang sem enrolação
Erlang sem enrolaçãoErlang sem enrolação
Erlang sem enrolação
 
Desenvolvendo software no mundo atual
Desenvolvendo software no mundo atualDesenvolvendo software no mundo atual
Desenvolvendo software no mundo atual
 
Reactive programming no mundo Java
Reactive programming no mundo JavaReactive programming no mundo Java
Reactive programming no mundo Java
 
Reactive programming: Brincando com eficiência, composição e assíncronia
Reactive programming: Brincando com eficiência, composição e assíncroniaReactive programming: Brincando com eficiência, composição e assíncronia
Reactive programming: Brincando com eficiência, composição e assíncronia
 
FTD Groovy
FTD GroovyFTD Groovy
FTD Groovy
 
FTD JVM Internals
FTD JVM InternalsFTD JVM Internals
FTD JVM Internals
 
Golang
GolangGolang
Golang
 
Java8
Java8Java8
Java8
 
EBD - Perguntas que não querem calar
EBD - Perguntas que não querem calarEBD - Perguntas que não querem calar
EBD - Perguntas que não querem calar
 
EBD - UFC
EBD - UFCEBD - UFC
EBD - UFC
 
EBD - Escolhas
EBD - EscolhasEBD - Escolhas
EBD - Escolhas
 
EBD - A importância da Escola Bíblica Dominical
EBD - A importância da Escola Bíblica DominicalEBD - A importância da Escola Bíblica Dominical
EBD - A importância da Escola Bíblica Dominical
 
EBD - Força de jovem
EBD - Força de jovemEBD - Força de jovem
EBD - Força de jovem
 
EBD - O que você quer ser
EBD - O que você quer serEBD - O que você quer ser
EBD - O que você quer ser
 
EBD - Deixando de ser bebê
EBD - Deixando de ser bebêEBD - Deixando de ser bebê
EBD - Deixando de ser bebê
 
EBD - O que você faria se fosse invisível
EBD - O que você faria se fosse invisívelEBD - O que você faria se fosse invisível
EBD - O que você faria se fosse invisível
 
EBD - Coisas que não fazem sentido
EBD - Coisas que não fazem sentidoEBD - Coisas que não fazem sentido
EBD - Coisas que não fazem sentido
 
EBD - Faça mais do que saber o que e um bocejo
EBD - Faça mais do que saber o que e um bocejoEBD - Faça mais do que saber o que e um bocejo
EBD - Faça mais do que saber o que e um bocejo
 
EBD - Varias formas de dizer a mesma coisa
EBD - Varias formas de dizer a mesma coisaEBD - Varias formas de dizer a mesma coisa
EBD - Varias formas de dizer a mesma coisa
 
EBD - 10 coisas que temos de dar a Deus
EBD - 10 coisas que temos de dar a DeusEBD - 10 coisas que temos de dar a Deus
EBD - 10 coisas que temos de dar a Deus
 

Minha aplicação Java vai pra nuvem. E agora?

  • 1. Minha aplicação Java vai pra Nuvem. E agora?
  • 5. Mas por que migrar?
  • 6. Para convencer o gerente... Reduzir o custo? A galera toda está indo pra nuvem, demoro! +Escalabilidade? +Disponibilidade? +Elasticidade? Otimização de recursos? Serviços prontos para utilização? Qualquer tipo de nuvem me atende, ta sussa! Qualquer fornecedor de nuvem me atende, suave! Limitações e vendor lock-in. Bora! Não vai influenciar em nada meu trampo, é nois!
  • 8.
  • 9. Algumas diferenças ● Somente Embeddable Application Servers, sendo possível deploy do .war (Tomcat, Jetty, JBoss or GlassFish, etc.); ● Bibliotecas como stack de Servlet, JSP, drivers JDBC e outras bibliotecas Java EE são linkadas na aplicação usando gerenciamento de dependência; ● Configuração de serviço baseado em variável de ambiente (Ex: DATABASE_URL); ● Deploy via Git workflow → ● Gerenciamento de infra e aplicação via ferramenta de CLI [Heroku Toolbelt]. (Ex. start/stop, clustering, logs). $ git push heroku master
  • 10. Particularidades ● Suporte para Java 6, 7 e 8; ● Dynos → Lightweight linux container. (Web, Worker e One-off); ● Arquitetura share-nothing. (Não devem haver sessões stateful); ● Clustering via CLI → ● Load-balance automático; ● Failover com detecção de falha em nó de aplicativo, em seguida, tentativa de reinício; $ heroku ps:scale web=2 worker=4 ...
  • 11. E para começar? ● Java instalado; ● Maven 3.x instalado; ● Criar uma conta free no Heroku; ● Baixar e instalar o Heroku Toolbelt;
  • 12. Login no Heroku Lá vamos nós... Fork de um projeto Java Blank $ heroku login Enter your Heroku credentials. Email: java@example.com Password: $ git clone https://github.com/heroku/java-getting-started.git $ cd java-getting-started
  • 13. $ cat Procfile web: java -cp target/classes:target/dependency/* Main Estrutura do projeto $ cat system.properties java.runtime.version=1.8 $ cat pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http: //maven.apache.org/maven-v4_0_0.xsd"> ...
  • 14. Criando a aplicação no Heroku $ heroku create Creating soujava-locaweb-13062015... done, stack is cedar-14 http://soujava-locaweb-13062015.herokuapp.com/ | https://git.heroku.com/soujava-locaweb-13062015.git Git remote heroku added Criação
  • 15. Fazendo o deploy Deploy $ git push heroku master Initializing repository, done. Counting objects: 68, done. Delta compression using up to 4 threads. Compressing objects: 100% (19/19), done. Writing objects: 100% (68/68), 7.07 KiB | 0 bytes/s, done. Total 68 (delta 22), reused 65 (delta 22) -----> Java app detected -----> Installing OpenJDK 1.8... done -----> Installing Maven 3.3.1... done -----> Executing: mvn -B -DskipTests=true clean install ....
  • 16. O que acontece no deploy? Slugs são copias comprimidas e pré-empacotadas de sua aplicação otimizada para a distribuição para o dyno manager. (Limite de 15m na compilação). 1. Cria um novo checkout de HEAD oriundo do branch master; 2. Remove arquivos não utilizados, incluindo diretórios .git, arquivos .gitmodules, qualquer arquivo no tmp, e qualquer entrada especificada em um arquivo top-level .slugignore. 3. Download, build e install das dependências locais, conforme especificado no arquivo de build (Ex.: Gemfile, package.json, requirements.txt, pom.xml, etc.) com a ferramenta de gerenciamento de dependência suportada pela linguagem utilizada (ex.: Bundler, npm, pip, Maven). 4. Empacotamento final do slug file.
  • 17. Garantindo pelo menos, uma instância da aplicação em execução: Finalizando Para finalizar… abrir a aplicação no browser. $ heroku ps:scale web=1 $ heroku open
  • 18. import org.eclipse.jetty.server.Server; import org.eclipse.jetty.webapp.WebAppContext; public class StartWebApp { public static void main(String[] args) throws Exception { String portStr = System.getenv("PORT"); int port = (portStr == null) ? 8085 : Integer.parseInt(portStr); Server server = new Server(port); WebAppContext webapp = new WebAppContext(); webapp.setContextPath("/"); // change the name of the war as needed. webapp.setWar("target/classes/mywebapp.war"); server.setHandler(webapp); server.start(); server.join(); } } E deploy com WAR? Fonte: http://ollivander.franzoni.eu/2011/10/20/deploy-any-java-webapp-via-war-to-heroku/
  • 19. Visualizando logs Outros comandos úteis 1/3 $ heroku ps === web (1X): `java $JAVA_OPTS -cp target/classes:target/dependency/* Main` web.1: up 2015/06/13 08:45:07 (~ 2m ago) Verificando quantos dynos estão em execução $ heroku logs --tail 2015-06-13T08:55:07.254053+00:00 heroku[web.1]: State changed from starting to up 2015-06-13T08:55:05.214125+00:00 heroku[web.1]: Starting process with command `java -Xmx384m -Xss512k -XX:+UseCompressedOops -cp target/classes:target/dependency/* Main` ...
  • 20. Visualizar todos os releases Outros comandos úteis 2/3 $ heroku releases:rollback v102 Rolling back demoapp... done, v102 $ heroku releases == demoapp Releases v104 Rollback to v102 jon@heroku.com 2013/01/31 14:11:33 (~15s ago) v103 Deploy 582fc95 jon@heroku.com 2013/01/31 12:15:35 v102 Deploy 990d916 jon@heroku.com 2013/01/31 12:01:12 Executando um rollback $ heroku releases == demoapp Releases v103 Deploy 582fc95 jon@heroku.com 2013/01/31 12:15:35 v102 Deploy 990d916 jon@heroku.com 2013/01/31 12:01:12
  • 21. Acessando a aplicação via bash Outros comandos úteis 3/3 $ heroku addons:create rediscloud:25 // using var REDISCLOUD_URL Adicionando add-ons na aplicação através do $ heroku run bash Running `bash` attached to terminal... up, run.8963 ~ $ ls
  • 22. Utilizando o foreman E rodar a aplicação local? $ foreman start web 07:45:16 web.1 | started with pid 2071 07:45:16 web.1 | 2015-06-13 07:45:16.329:INFO:oejs.Server:jetty-7.6.0.v20120127 07:45:16 web.1 | 2015-06-13 07:45:16.378:INFO:oejsh.ContextHandler:started o.e.j.s. ServletContextHandler{/,null} 07:45:16 web.1 | 2015-06-13 07:45:16.411:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:5000
  • 23. E as variáveis de config? private void showHome(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // Energy is compatible with mass (E=mc2) RelativisticModel.select(); String energy = System.getenv().get("ENERGY"); Amount<Mass> m = Amount.valueOf(energy).to(KILOGRAM); resp.getWriter().print("E=mc^2: " + energy + " = " + m); } $ heroku config GITHUB_USERNAME: joesmith OTHER_VAR: production Limite de 16kb para cada aplicação.
  • 24. E acesso ao DB? private Connection getConnection() throws URISyntaxException, SQLException { URI dbUri = new URI(System.getenv("DATABASE_URL")); String username = dbUri.getUserInfo().split(":")[0]; String password = dbUri.getUserInfo().split(":")[1]; int port = dbUri.getPort(); String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ":" + port + dbUri.getPath(); return DriverManager.getConnection(dbUrl, username, password); } $ heroku config === soujava-locaweb-13062015 Config Vars DATABASE_URL: postgres://qplhasewkhqyxp: YXDPSRus9MrU4HglCPzjhOevee@ec2-54-204-47-58.compute-1.amazonaws.com: 5432/dc9qsdnghia6v1
  • 25. DB Pool? import java.sql.*; import org.apache.commons.dbcp.*; private BasicDataSource connectionPool; public configureDBPool() throws URISyntaxException, SQLException { URI dbUri = new URI(System.getenv("DATABASE_URL")); String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + dbUri.getPath(); connectionPool = new BasicDataSource(); if (dbUri.getUserInfo() != null) { connectionPool.setUsername(dbUri.getUserInfo().split(":")[0]); connectionPool.setPassword(dbUri.getUserInfo().split(":")[1]); } connectionPool.setDriverClassName("org.postgresql.Driver"); connectionPool.setUrl(dbUrl); connectionPool.setInitialSize(1); // to set the initial size of the pool. }
  • 26.
  • 27. Referências ● Heroku Java https://devcenter.heroku.com/categories/java ● PaaS Comparison http://www.infoq.com/br/articles/paas_comparison ● WAR files vs embedded servers http://steveperkins.com/war-files-vs-embedded-servers
  • 28. "For I am persuaded, that neither death, nor life, nor angels, nor principalities, nor powers, nor things present, nor things to come, Nor height, nor depth, nor any other creature, shall be able to separate us from the love of God, which is in Christ Jesus our Lord." (Romanos 8:38-39) FTD GROUP, JOIN US!