Thinking Outside the Container: Deploying Standalone Apps to Cloud Foundry
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Thinking Outside the Container: Deploying Standalone Apps to Cloud Foundry

on

  • 2,599 views

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 ...

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!

Statistics

Views

Total Views
2,599
Views on SlideShare
2,507
Embed Views
92

Actions

Likes
0
Downloads
21
Comments
0

2 Embeds 92

https://twitter.com 91
https://si0.twimg.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Thinking Outside the Container: Deploying Standalone Apps to Cloud Foundry Presentation Transcript

  • 1. Thinking Outside the Container: Deploying Standalone Apps to Cloud Foundry Jennifer Hickey © 2012 SpringOne 2GX. All rights reserved. Do not distribute without permission.Saturday, October 20, 2012
  • 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 2Saturday, 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 3Saturday, October 20, 2012
  • 4. Core Runtimes and Frameworks • Java –Spring –Grails –Lift –Play • Ruby –Rails –Sinatra –Rack • Node.js 4Saturday, October 20, 2012
  • 5. Community and partners contributions • Python –Django –WSGI • Erlang OTP/Rebar • PHP • Perl • .Net –On Iron Foundry 5Saturday, October 20, 2012
  • 6. The Platinum Rule Treat each framework the way it wants to be treated! 6Saturday, 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 7Saturday, 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 8Saturday, October 20, 2012
  • 9. This Looks Great! But.... My App Doesn’t Use Any of These Frameworks! 9Saturday, 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 10Saturday, October 20, 2012
  • 11. Uses of Standalone Applications • Async Web Frameworks • BYOC: Embedding Jetty or Tomcat • Distributed polyglot applications • Workers 11Saturday, 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 12Saturday, October 20, 2012
  • 13. vert.x - Asynchronous, Event-Driven Java 13Saturday, 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) 14Saturday, October 20, 2012
  • 15. Demo Vert.x with SockJS on Cloud FoundrySaturday, October 20, 2012
  • 16. Uses of Standalone Applications • Async Web Frameworks • BYOC: Embedding Jetty or Tomcat • Distributed polyglot applications • Workers 16Saturday, 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/ 17Saturday, October 20, 2012
  • 18. More reasons to BYOC.... • Deploy legacy EJB apps –TomEE • Customize Tomcat –Change logging, server config, etc 18Saturday, October 20, 2012
  • 19. Demo Unfiltered with Jetty on Cloud FoundrySaturday, October 20, 2012
  • 20. Uses of Standalone Applications • Async Web Frameworks • BYOC: Embedding Jetty or Tomcat • Distributed polyglot applications • Workers 20Saturday, October 20, 2012
  • 21. wgrus-monolithic.war @Controller StoreFront Widget Gadget Accounting Shipping InventoryService InventoryService Service Service RDBMS 21Saturday, 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 22Saturday, 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 23Saturday, October 20, 2012
  • 24. Modern Applications • Multiple types of clients –Mobile –HTML 5 –Desktop • Polyglot applications –NodeJS front-end –Java/Scala backend • Asynchronous –RabbitMQ 24Saturday, October 20, 2012
  • 25. And.... • Polyglot persistence –Relational –NoSQL –NewSQL • Social network integration 25Saturday, October 20, 2012
  • 26. Addressing the Scalability ProblemSaturday, October 20, 2012
  • 27. The App 27Saturday, October 20, 2012
  • 28. Simple Distribution Backend HTTP Frontend 28Saturday, October 20, 2012
  • 29. Widening Distribution Backend 1 HTTP Frontend 1 29Saturday, October 20, 2012
  • 30. Widening Distribution Backend 2 Backend 1 HTTP Frontend 1 29Saturday, October 20, 2012
  • 31. Widening Distribution Backend 2 Backend 1 Backend 3 HTTP Frontend 1 29Saturday, October 20, 2012
  • 32. Widening Distribution Backend 2 Backend 1 Backend 3 HTTP Frontend 2 Frontend 1 29Saturday, October 20, 2012
  • 33. Widening Distribution Backend 2 Backend 1 Backend 3 HTTP Frontend 2 Frontend 1 Frontend 3 29Saturday, October 20, 2012
  • 34. Scaling out in Cloud Foundry vmc instances <app> 5 30Saturday, October 20, 2012
  • 35. Cloud Foundry Manifests --- applications: ./frontend: ... depends-on: ./backend ./backend: ... 31Saturday, October 20, 2012
  • 36. wgrus-billing.war Accounting Service MySQL wgrus-inventory wgrus-store.war Widget InventoryService StoreFront Gadget InventoryService wgrus-shipping Shipping Service 32Saturday, October 20, 2012
  • 37. Demo Distributed polyglot WGRUSSaturday, 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 34Saturday, October 20, 2012
  • 39. Remote Actors and Routing Backend 1 Backend 2 Netty Netty 173.136.3.4:59807 173.14.13.3:57895 Router Router Frontend 1 Frontend 2 35Saturday, October 20, 2012
  • 40. Akka: Messaging based remoting Backend 2 Backend 1 Backend 3 AMQP/ Redis Frontend 2 Frontend 1 Frontend 3 36Saturday, October 20, 2012
  • 41. Demo WGRUS with AkkaSaturday, October 20, 2012
  • 42. Widening Distribution: Messaging Middleware Backend 2 Backend 1 Backend 3 Frontend 2 Frontend 1 Frontend 3 38Saturday, 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 39Saturday, 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 40Saturday, 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 41Saturday, 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 42Saturday, October 20, 2012
  • 47. Demo WGRUS with Spring IntegrationSaturday, October 20, 2012
  • 48. Uses of Standalone Applications • Async Web Frameworks • BYOC: Embedding Jetty or Tomcat • Distributed polyglot applications • Workers 44Saturday, October 20, 2012
  • 49. Get to Work! • Update search indexes! • Email your users! • Backup your data! • Upload new data from external storage! 45Saturday, October 20, 2012
  • 50. Polling for Tweets with Spring Integration <int-twitter:search-inbound-channel-adapter id="twitter" query="cloud"> <int:poller fixed-rate="5000" max-messages-per-poll="10"/> </int-twitter:search-inbound-channel-adapter> ! <int:transformer input-channel="twitter" expression="payload.fromUser + : + payload.text" output- channel="rabbit"/> ! <int-amqp:outbound-channel-adapter id="rabbit" exchange-name="tweets"/> ! <rabbit:fanout-exchange name="tweets" durable="false"/> ! <rabbit:admin connection-factory="rabbitConnectionFactory"/> ! <rabbit:template id="amqpTemplate" connection-factory="rabbitConnectionFactory"/> ! <beans profile="default"> ! ! <rabbit:connection-factory id="rabbitConnectionFactory"/> ! </beans> ! <beans profile="cloud"> ! ! <cloud:rabbit-connection-factory id="rabbitConnectionFactory"/> ! </beans> 46Saturday, October 20, 2012
  • 51. Batch Processing with Spring Batch 47Saturday, 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 48Saturday, October 20, 2012
  • 53. Demo Spring Batch Working it on Cloud FoundrySaturday, October 20, 2012
  • 54. Practical Tips Packaging Your AppSaturday, October 20, 2012
  • 55. Maven Appassembler • Creates start script and packages all deps in repo dir • vmc push --path=target/appassembler –Start command “bin/<scriptname>” <plugin> <groupId>org.codehaus.mojo</groupId> ! <artifactId>appassembler-maven-plugin</artifactId> ! ! <version>1.1.1</version> ! ! <executions> ! ! <execution> ! ! ! <phase>package</phase> ! ! ! ! <goals> ! ! ! ! <goal>assemble</goal> ! ! ! ! </goals> ! ! ! ! <configuration> ! ! ! ! <assembledirectory>target</assembledirectory> ! ! ! ! ! <programs> ! ! ! ! ! <program> ! ! ! ! ! ! <mainClass>org.springsource.samples.twitter.Demo</mainClass> ! ! ! ! ! ! </program> 51Saturday, 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" 52Saturday, 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") 53Saturday, 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 54Saturday, October 20, 2012
  • 59. Practical Tips Accessing ServicesSaturday, 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 56Saturday, 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); 57Saturday, 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()); 58Saturday, 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 59Saturday, October 20, 2012
  • 64. Key Takeaway Endless possibilities with standalone apps on Cloud Foundry 60Saturday, 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 61Saturday, October 20, 2012
  • 66. Questions?Saturday, October 20, 2012