JavaOne 2015: 12 Factor App
-
Upload
joe-kutner -
Category
Internet
-
view
2.028 -
download
0
Transcript of JavaOne 2015: 12 Factor App
![Page 1: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/1.jpg)
12 FactorAppBest Practices for Java Deployment
![Page 2: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/2.jpg)
You might not like what I have to say
![Page 3: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/3.jpg)
Modern Java Deployment
![Page 4: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/4.jpg)
.war
Traditional Java Deployment
![Page 5: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/5.jpg)
.jar
Modern Java Deployment
![Page 6: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/6.jpg)
Make JAR
Not WAR
![Page 7: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/7.jpg)
2005 2015
WAR files JAR files
App Servers Microservices
Hot Deploy Continuous Deploy
Server in a closet Heroku/AWS/etc
![Page 8: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/8.jpg)
Joe Kutner@codefinger
JVM Platform Owner
![Page 9: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/9.jpg)
12 Factor Appa methodology
ScalabilityMaintainability
Portability
![Page 10: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/10.jpg)
Immutable Ephemeral Declarative Automated
![Page 11: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/11.jpg)
• Codebase• Dependencies• Config• Backing services• Build, release, run• Processes
• Port Binding• Concurrency• Disposability• Dev/Prod Parity• Logs• Admin Processes
12 Factor App
![Page 12: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/12.jpg)
• Codebase• Dependencies• Config• Backing services• Build, release, run• Processes
• Port Binding• Concurrency• Disposability• Dev/Prod Parity• Logs• Admin Processes
12 Factor App
![Page 13: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/13.jpg)
Use version control
![Page 14: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/14.jpg)
![Page 15: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/15.jpg)
![Page 16: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/16.jpg)
BAD
![Page 17: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/17.jpg)
BAD
App #1 App #2
![Page 18: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/18.jpg)
pom.xml
<project> ... <modules> <module>my-app</module> <module>my-other-app</module> </modules><project>
![Page 19: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/19.jpg)
Submodules
![Page 20: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/20.jpg)
• Codebase• Dependencies• Config• Backing services• Build, release, run• Processes
• Port Binding• Concurrency• Disposability• Dev/Prod Parity• Logs• Admin Processes
12 Factor App
![Page 21: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/21.jpg)
Never rely on implicit existence of system-wide
packages
Explicitly declare and isolate
dependencies
![Page 22: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/22.jpg)
Don’t check JAR files
into Git
![Page 23: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/23.jpg)
![Page 24: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/24.jpg)
https://bintray.com/
![Page 25: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/25.jpg)
Agent JARs
![Page 26: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/26.jpg)
pom.xml<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>copy-new-relic</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <includeGroupIds>com.newrelic.agent.java</includeGroupIds> <includeArtifactIds>newrelic-agent</includeArtifactIds> <stripVersion>true</stripVersion> </configuration> </execution> </executions></plugin>
![Page 27: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/27.jpg)
build.gradle
task copyToLib(type: Copy) { into "$buildDir/server" from(configurations.compile) { include "jetty-runner*" }}
![Page 28: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/28.jpg)
• Codebase• Dependencies• Config• Backing services• Build, release, run• Processes
• Port Binding• Concurrency• Disposability• Dev/Prod Parity• Logs• Admin Processes
12 Factor App
![Page 29: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/29.jpg)
• Resource handles to the database, memcached, and other backing services
• Credentials to external services such as Amazon S3 or Twitter
• Per-deploy values such as the canonical hostname for the deploy
Anything that changes between deployment environments:
(does not include things like conf/routes)
Configuration is…
![Page 30: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/30.jpg)
Configuration should be strictly separated
from code
![Page 31: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/31.jpg)
Don’t check passwords into Git
![Page 32: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/32.jpg)
![Page 33: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/33.jpg)
Configuration belongs in the environment, not in the application
![Page 34: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/34.jpg)
applicationContext.xml
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id=“dataSource">
<property name="driverClassName" value="org.postgresql.Driver"/> <property name="url" value=“${JDBC_DATABASE_URL}"/>
// ...
![Page 35: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/35.jpg)
application.conf
db.default.url=${DATABASE_URL}
![Page 36: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/36.jpg)
Can you make your app open source at any moment, without compromising
any credentials?
Litmus Test
![Page 37: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/37.jpg)
• Codebase• Dependencies• Config• Backing services• Build, release, run• Processes
• Port Binding• Concurrency• Disposability• Dev/Prod Parity• Logs• Admin Processes
12 Factor App
![Page 38: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/38.jpg)
![Page 39: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/39.jpg)
application.conf
db.default.url=${DATABASE_URL}
![Page 40: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/40.jpg)
• Codebase• Dependencies• Config• Backing services• Build, release, run• Processes
• Port Binding• Concurrency• Disposability• Dev/Prod Parity• Logs• Admin Processes
12 Factor App
![Page 41: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/41.jpg)
build, release, run
![Page 42: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/42.jpg)
$ mvn clean install
$ sbt stage
$ ./gradlew build
build
![Page 43: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/43.jpg)
$ heroku deploy:jar -j myapp.war
$ mvn heroku:deploy
$ docker push ...
release
![Page 44: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/44.jpg)
$ java -jar myapp.war
$ build/install/myapp/bin/myapp.bat
run
$ mvn jetty:run
$ service tomcat start
$ cp myapp.war TOMCAT_HOME/webapps/
![Page 45: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/45.jpg)
$ git push heroku masterbuild,
release,& run
![Page 46: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/46.jpg)
DemoTime
![Page 47: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/47.jpg)
• Codebase• Dependencies• Config• Backing services• Build, release, run• Processes
• Port Binding• Concurrency• Disposability• Dev/Prod Parity• Logs• Admin Processes
12 Factor App
![Page 48: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/48.jpg)
Processes should be stateless
![Page 49: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/49.jpg)
sticky sessions 😞
![Page 50: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/50.jpg)
• Codebase• Dependencies• Config• Backing services• Build, release, run• Processes
• Port Binding• Concurrency• Disposability• Dev/Prod Parity• Logs• Admin Processes
12 Factor App
![Page 51: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/51.jpg)
The twelve-factor app is completely self-contained
The web app exports HTTP as a service by binding to a port
![Page 52: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/52.jpg)
.war
Traditional Deployment
![Page 53: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/53.jpg)
.jar
Modern Deployment
![Page 54: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/54.jpg)
Dropwizard
![Page 55: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/55.jpg)
• Codebase• Dependencies• Config• Backing services• Build, release, run• Processes
• Port Binding• Concurrency• Disposability• Dev/Prod Parity• Logs• Admin Processes
12 Factor App
![Page 56: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/56.jpg)
Relax bro, I got this…
java.util.concurrent
RxJava
java.util.stream
![Page 57: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/57.jpg)
Scale Up
Scale Out
![Page 58: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/58.jpg)
web.1
web.2
worker.1 clock.1
Workload Diversity
Num
ber o
f Pro
cess
es
worker.2
worker.3
![Page 59: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/59.jpg)
• Codebase• Dependencies• Config• Backing services• Build, release, run• Processes
• Port Binding• Concurrency• Disposability• Dev/Prod Parity• Logs• Admin Processes
12 Factor App
![Page 60: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/60.jpg)
Graceful shutdown
Quick startup
Resilience to failure
![Page 61: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/61.jpg)
Servers are not pets
Servers are cattle
![Page 62: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/62.jpg)
Application Servers are pets
![Page 63: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/63.jpg)
Application Servers are not disposable
![Page 64: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/64.jpg)
Microservices are cattle
![Page 65: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/65.jpg)
Microservices are disposable
![Page 66: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/66.jpg)
Easy to replace
Decoupled from external infrastructure
Easy to modify
![Page 67: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/67.jpg)
Microservices
![Page 68: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/68.jpg)
• Codebase• Dependencies• Config• Backing services• Build, release, run• Processes
• Port Binding• Concurrency• Disposability• Dev/Prod Parity• Logs• Admin Processes
12 Factor App
![Page 69: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/69.jpg)
dev stage prod= =
![Page 70: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/70.jpg)
dev
sqlite
stage
mysql
prod
postgres
=
≠
=
≠
![Page 71: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/71.jpg)
dev
sqlite
postgres
stage
mysql
postgres
prod
postgres
postgres
=
≠
=
=
≠
=
![Page 72: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/72.jpg)
dev
tomcat
jetty
stage
tomcat
jetty
prod
jboss
jetty
=
≠
=
=
≠
=
.jar
![Page 73: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/73.jpg)
disposability⇒reproducibility
parity⇒
![Page 74: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/74.jpg)
• Codebase• Dependencies• Config• Backing services• Build, release, run• Processes
• Port Binding• Concurrency• Disposability• Dev/Prod Parity• Logs• Admin Processes
12 Factor App
![Page 75: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/75.jpg)
• Codebase• Dependencies• Config• Backing services• Build, release, run• Processes
• Port Binding• Concurrency• Disposability• Dev/Prod Parity• Logs• Admin Processes
12 Factor App
![Page 76: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/76.jpg)
Admin tasks should be run
in isolated processes
![Page 77: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/77.jpg)
$ heroku run bashRunning `bash` attached to terminal... up, run.1594~ $
![Page 78: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/78.jpg)
web1
web2
web3
admin
![Page 79: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/79.jpg)
• Codebase• Dependencies• Config• Backing services• Build, release, run• Processes
• Port Binding• Concurrency• Disposability• Dev/Prod Parity• Logs• Admin Processes
12 Factor App
![Page 81: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/81.jpg)
Create a bintray.com account1.
set JDBC_DATABASE_URL=jdbc:postgres://…2.
Measure your app’s boot time3.
Click a Heroku button4.
What next?
![Page 82: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/82.jpg)
https://github.com/britter/spring-boot-heroku-demo
![Page 83: JavaOne 2015: 12 Factor App](https://reader034.fdocuments.us/reader034/viewer/2022051404/586fd8ec1a28ab18428b578d/html5/thumbnails/83.jpg)
Joe Kutner@codefinger
JVM Platform Owner
(http://www.slideshare.net/jkutner/javaone-2015-12-factor-app)http://bit.ly/1PSRxcm