Some applications simply cannot be contained. Perhaps you want to write a worker that periodically polls for updates or performs a maintenance task. Perhaps you would like to use a new lightweight web framework. You don’t necessarily want to build a WAR for these types of apps. With Cloud Foundry, you don’t have to! In this session from SpringOne 2012, we will build and deploy several types of standalone applications, from distributed workers built with Spring Integration and Akka, to container-less web applications built with vert.x and spray, to bring-your-own-container apps that embed Jetty. If you’re a Java or Scala developer who likes to “think outside the container”, this talk is for you!
2. About Jennifer
• Engineer @ Cloud Foundry
• Focused on framework support
• Long time SpringSource-er
• Contributed to many Spring and SpringSource projects
• Passionate about increasing developer productivity in the
cloud.
Contact Info
Twitter: @jencompgeek
Email: jhickey@vmware.com
2
Saturday, October 20, 2012
3. Cloud Foundry Big Picture
.js
Ap
p Private
ce
lic
Clouds
rfa
at
io
te
n
Data Services
In
Se
er
Public
r
vid
vic
Clouds
o
e
Msg
Pr
Services
In
te
ud
rfa
o
Micro
Cl
ce
Other
Services
Cloud Foundry
Apache2 license
3
Saturday, October 20, 2012
5. Community and partners contributions
• Python
–Django
–WSGI
• Erlang OTP/Rebar
• PHP
• Perl
• .Net
–On Iron Foundry
5
Saturday, October 20, 2012
6. The Platinum Rule
Treat each framework
the way it wants to be treated!
6
Saturday, October 20, 2012
7. Common Framework Support
• Command-line for application management
–Create apps and services
–Update bindings, memory etc.
–Scale instances
• Access service and app info through environment variables
–Service host, port, credentials
–App ip and port
• A runtime library
–Connect to services
–Retrieve app info
7
Saturday, October 20, 2012
8. Common Framework Support
• Auto-reconfiguration for typical apps
• Access to services through Caldecott
–Creates tunnel for local clients
–Mysql, Mongo, Redis CLIs, etc
• Manifest support
8
Saturday, October 20, 2012
9. This Looks Great! But....
My App Doesn’t Use Any of These Frameworks!
9
Saturday, October 20, 2012
10. Standalone: The “no framework” framework
• Cloud Foundry now supports standalone applications!
• Choose a runtime and provide a start command
$ vmc push myapp
Detected a Standalone Application, is this correct? [Yn]:
1: java
2: node
3: ruby18
– 4: ruby19
Select Runtime [java]:
Start Command: java -jar myapp.jar
10
Saturday, October 20, 2012
11. Uses of Standalone Applications
• Async Web Frameworks
• BYOC: Embedding Jetty or Tomcat
• Distributed polyglot applications
• Workers
11
Saturday, October 20, 2012
12. Call Me Maybe?
• New frameworks are concurrent, asynchronous, event-
driven
–C10K
–Thread per request/response isn’t going to cut it
• Single thread to handle multiple connections
–Callbacks
• Most use Netty for NIO
• Some examples
–vert.x, Blue Eyes, Spray, Unfiltered, Finagle
12
Saturday, October 20, 2012
14. SockJS - WebSocket Emulation
• Cloud Foundry does not (yet) support WebSocket
• SockJS emulates WebSocket
–Provides low latency, full duplex, cross-domain communication
channel between browser and web server
• Available for Node.js and vert.x
–Also Erlang, Lua (Luvit), Python (Tornado)
14
Saturday, October 20, 2012
15. Demo
Vert.x with SockJS on Cloud
Foundry
Saturday, October 20, 2012
16. Uses of Standalone Applications
• Async Web Frameworks
• BYOC: Embedding Jetty or Tomcat
• Distributed polyglot applications
• Workers
16
Saturday, October 20, 2012
17. Why BYOC?
• Framework programming model
–Unfiltered with Jetty support
• Outpace the CF engineers
–Tomcat 7/Servlet 3.0
• http://blog.cloudfoundry.org/2012/06/18/deploying-tomcat-7-using-the-
standalone-framework/
• Be cutting-edge
–Clojure
• http://blog.cloudfoundry.org/2012/09/25/experimental-clojure-support-
in-cloud-foundry/
17
Saturday, October 20, 2012
18. More reasons to BYOC....
• Deploy legacy EJB apps
–TomEE
• Customize Tomcat
–Change logging, server config, etc
18
Saturday, October 20, 2012
19. Demo
Unfiltered with Jetty on Cloud
Foundry
Saturday, October 20, 2012
20. Uses of Standalone Applications
• Async Web Frameworks
• BYOC: Embedding Jetty or Tomcat
• Distributed polyglot applications
• Workers
20
Saturday, October 20, 2012
21. wgrus-monolithic.war
@Controller
StoreFront
Widget Gadget Accounting Shipping
InventoryService InventoryService Service Service
RDBMS
21
Saturday, October 20, 2012
22. It’s simple to develop but ....
• Lack of scalability
–Scale through replication
–Non-replicable component => nothing can be replicated
–Can’t scale different parts of the application differently
• Lack of deployability
–Deploy it all in one go
–Increased risk of something breaking
22
Saturday, October 20, 2012
23. And....
• Applications are brittle
–Store can’t accept orders unless all services are available
–Failure (e.g. memory leak) in one component can take down
every other
• Monolingual
–Can’t use non-JVM server-side technologies: NodeJS, Rails
23
Saturday, October 20, 2012
24. Modern Applications
• Multiple types of clients
–Mobile
–HTML 5
–Desktop
• Polyglot applications
–NodeJS front-end
–Java/Scala backend
• Asynchronous
–RabbitMQ
24
Saturday, October 20, 2012
25. And....
• Polyglot persistence
–Relational
–NoSQL
–NewSQL
• Social network integration
25
Saturday, October 20, 2012
36. wgrus-billing.war
Accounting
Service MySQL
wgrus-inventory
wgrus-store.war Widget
InventoryService
StoreFront
Gadget
InventoryService
wgrus-shipping
Shipping
Service
32
Saturday, October 20, 2012
37. Demo
Distributed polyglot WGRUS
Saturday, October 20, 2012
38. Scaling out through Akka
• Remote actors
–Location transparent and distributable by design
–Netty based in Akka 2.0
–Needs cluster-like management
34
Saturday, October 20, 2012
43. wgrus-billing
Accounting
Service MySQL
wgrus-inventory
wgrus-store.war Widget
InventoryService
Message
StoreFront Broker
Gadget
InventoryService
wgrus-shipping
Shipping
Service
39
Saturday, October 20, 2012
44. Spring Integration
• High-level of abstraction for building message based
applications
• Implements EAI patterns
• Provides plumbing for exchanging messages between
application components
• Promotes loosely coupled components
• Integrates with external messaging infrastructure: JMS,
AMQP, HTTP, Email, File transfer
40
Saturday, October 20, 2012
45. Spring Integration Concepts
• Message channel
–Virtual pipe connecting producer and consumer
• Message endpoints
–The filter of a pipes-and-filter architecture
–Read from and/or write to channel
41
Saturday, October 20, 2012
46. Spring Integration Endpoints
• Endpoint types
–Transformer
–Filter
–Router
–Splitter
–Aggregator
–ServiceActivator
–Inbound channel adapter - read from external source, writes to
channel
–Outbound channel adapter - read from channel write to external
destination
42
Saturday, October 20, 2012
47. Demo
WGRUS with Spring Integration
Saturday, October 20, 2012
48. Uses of Standalone Applications
• Async Web Frameworks
• BYOC: Embedding Jetty or Tomcat
• Distributed polyglot applications
• Workers
44
Saturday, October 20, 2012
49. Get to Work!
• Update search indexes!
• Email your users!
• Backup your data!
• Upload new data from external storage!
45
Saturday, October 20, 2012
52. Spring Batch
• Supports Batch API...
–Jobs have Steps
–Steps have Readers, and optional Processors and Writers
• Readers read data
• Processors process data coming into them, optionally transforming it.
Optional.
• Writers write data out
48
Saturday, October 20, 2012
53. Demo
Spring Batch Working it on Cloud
Foundry
Saturday, October 20, 2012
54. Practical Tips
Packaging Your App
Saturday, October 20, 2012
56. Gradle
• Use the application plugin
–Run “gradle installApp”
• Creates start script and packages all deps in lib dir
• vmc push --path=build/install/<appname>
–Start command “bin/<scriptname>”
apply plugin: 'application'
mainClassName = "org.springsource.samples.twitter.Demo"
52
Saturday, October 20, 2012
57. SBT
• Use sbt-package-dist
• Creates a zip of all code and deps
• vmc push --path=dist/appname/<zipname>.zip
–Start command “java $JAVA_OPTS -jar <main>.jar”
plugins.sbt:
addSbtPlugin("com.twitter" %% "sbt-package-dist" % "1.0.0")
resolvers += "twitter-repo" at "http://maven.twttr.com"
build.sbt:
import com.twitter.sbt._
packageDistZipName := "bitshow.zip"
mainClass in Compile := Some("bitshow.Server")
53
Saturday, October 20, 2012
58. Eclipse Plugin
• Does the packaging for you
• Deploy and debug standalone Java apps
–Including Scala and Groovy
• Caldecott support
–Tunnel to all services
54
Saturday, October 20, 2012
59. Practical Tips
Accessing Services
Saturday, October 20, 2012
60. cloudfoundry-runtime
• Programmatic creation of service connection factories
–Using ServiceCreator and ServiceInfo classes
• CloudEnvironment class
–Access cloud properties
–Access service info
– No JSON parsing
• Get from the Spring milestone maven repo
56
Saturday, October 20, 2012
61. Using ServiceCreator in Spring Applications
//Provides access to CF service and application env info
CloudEnvironment environment = new CloudEnvironment();
! !
//Retrieve env info for bound service named "mysqlService"
RdbmsServiceInfo mysqlSvc =
environment.getServiceInfo("mysqlService", RdbmsServiceInfo.class);
! !
//create a DataSource bound to the service
RdbmsServiceCreator dataSourceCreator = new RdbmsServiceCreator();
DataSource dataSource = dataSourceCreator.createService(mysqlSvc);
57
Saturday, October 20, 2012
62. Using ServiceInfo for all Java Apps
//Provides access to CF service and application env info
CloudEnvironment environment = new CloudEnvironment();
! !
//Retrieve env info for bound service named "mongoService"
MongoServiceInfo mongoSvc =
environment.getServiceInfo("mongoService", MongoServiceInfo.class);
! !
//create a Mongo DB bound to the service
Mongo mongoDB = new Mongo(mongoSvc.getHost(), mongoSvc.getPort());
58
Saturday, October 20, 2012
63. More Practical Tips...
• Use VCAP_APP_HOST and VCAP_APP_PORT env vars
–If not using cloudfoundry-runtime lib
• Don’t assign your app a URL unless you plan to bind to the
web port
–CF will think your app did not start
• Keep It Alive!
–CF will attempt to restart your app if it dies
• Use $JAVA_OPTS in your Java commands
–Sets Heap appropriately
–Allows debug on local clouds
59
Saturday, October 20, 2012
64. Key Takeaway
Endless possibilities with standalone apps on Cloud Foundry
60
Saturday, October 20, 2012
65. Demos
• Vert.x with SockJS
–https://github.com/cloudfoundry-samples/vertx-socks-sample
• Unfiltered with Jetty
–https://github.com/cloudfoundry-samples/cf-unfiltered-sample
• WGRUS
–https://github.com/cloudfoundry-samples/wgrus
• Spring Batch Workers
–https://github.com/cloudfoundry-samples/spring-batch-tweet-
workers
61
Saturday, October 20, 2012