0
Thinking Outside the Container:                         Deploying Standalone Apps to Cloud Foundry                        ...
About Jennifer        • Engineer @ Cloud Foundry        • Focused on framework support        • Long time SpringSource-er ...
Cloud Foundry Big Picture                                                                                                ....
Core Runtimes and Frameworks        • Java              –Spring              –Grails              –Lift              –Play...
Community and partners contributions        • Python              –Django              –WSGI        • Erlang OTP/Rebar    ...
The Platinum Rule          Treat each framework          the way it wants to be treated!              6Saturday, October 2...
Common Framework Support        • Command-line for application management              –Create apps and services          ...
Common Framework Support        • Auto-reconfiguration for typical apps        • Access to services through Caldecott     ...
This Looks Great! But....                             My App Doesn’t Use Any of These Frameworks!              9Saturday, ...
Standalone: The “no framework” framework        • Cloud Foundry now supports standalone applications!        • Choose a ru...
Uses of Standalone Applications        • Async Web Frameworks        • BYOC: Embedding Jetty or Tomcat        • Distribute...
Call Me Maybe?        • New frameworks are concurrent, asynchronous, event-          driven              –C10K            ...
vert.x - Asynchronous, Event-Driven Java             13Saturday, October 20, 2012
SockJS - WebSocket Emulation        • Cloud Foundry does not (yet) support WebSocket        • SockJS emulates WebSocket   ...
Demo                      Vert.x with SockJS on Cloud                      FoundrySaturday, October 20, 2012
Uses of Standalone Applications        • Async Web Frameworks        • BYOC: Embedding Jetty or Tomcat        • Distribute...
Why BYOC?        • Framework programming model              –Unfiltered with Jetty support        • Outpace the CF enginee...
More reasons to BYOC....        • Deploy legacy EJB apps              –TomEE        • Customize Tomcat              –Chang...
Demo                      Unfiltered with Jetty on Cloud                      FoundrySaturday, October 20, 2012
Uses of Standalone Applications        • Async Web Frameworks        • BYOC: Embedding Jetty or Tomcat        • Distribute...
wgrus-monolithic.war                                                             @Controller                              ...
It’s simple to develop but ....        • Lack of scalability              –Scale through replication              –Non-rep...
And....        • Applications are brittle              –Store can’t accept orders unless all services are available       ...
Modern Applications        • Multiple types of clients              –Mobile              –HTML 5              –Desktop    ...
And....        • Polyglot persistence              –Relational              –NoSQL              –NewSQL        • Social ne...
Addressing the Scalability                      ProblemSaturday, October 20, 2012
The App             27Saturday, October 20, 2012
Simple Distribution                              Backend                                    HTTP                          ...
Widening Distribution                                Backend 1                                      HTTP                  ...
Widening Distribution                             Backend 2   Backend 1                                               HTTP...
Widening Distribution                             Backend 2   Backend 1    Backend 3                                      ...
Widening Distribution                             Backend 2    Backend 1    Backend 3                                     ...
Widening Distribution                             Backend 2    Backend 1    Backend 3                                     ...
Scaling out in Cloud Foundry                     vmc instances <app> 5             30Saturday, October 20, 2012
Cloud Foundry Manifests              ---              applications:                ./frontend:                  ...       ...
wgrus-billing.war                                                 Accounting                                              ...
Demo                      Distributed polyglot WGRUSSaturday, October 20, 2012
Scaling out through Akka        • Remote actors              –Location transparent and distributable by design            ...
Remote Actors and Routing                                   Backend 1    Backend 2                                     Net...
Akka: Messaging based remoting                             Backend 2    Backend 1    Backend 3                            ...
Demo                      WGRUS with AkkaSaturday, October 20, 2012
Widening Distribution: Messaging Middleware                             Backend 2    Backend 1    Backend 3               ...
wgrus-billing                                                           Accounting                                        ...
Spring Integration        • High-level of abstraction for building message based          applications        • Implements...
Spring Integration Concepts        • Message channel              –Virtual pipe connecting producer and consumer        • ...
Spring Integration Endpoints        • Endpoint types              –Transformer              –Filter              –Router  ...
Demo                      WGRUS with Spring IntegrationSaturday, October 20, 2012
Uses of Standalone Applications        • Async Web Frameworks        • BYOC: Embedding Jetty or Tomcat        • Distribute...
Get to Work!        • Update search indexes!        • Email your users!        • Backup your data!        • Upload new dat...
Polling for Tweets with Spring Integration            <int-twitter:search-inbound-channel-adapter id="twitter" query="clou...
Batch Processing with Spring Batch             47Saturday, October 20, 2012
Spring Batch        • Supports Batch API...              –Jobs have Steps              –Steps have Readers, and optional P...
Demo                      Spring Batch Working it on Cloud                      FoundrySaturday, October 20, 2012
Practical Tips                      Packaging Your AppSaturday, October 20, 2012
Maven Appassembler        • Creates start script and packages all deps in repo dir        • vmc push --path=target/appasse...
Gradle        • Use the application plugin              –Run “gradle installApp”        • Creates start script and package...
SBT        • Use sbt-package-dist        • Creates a zip of all code and deps        • vmc push --path=dist/appname/<zipna...
Eclipse Plugin        • Does the packaging for you        • Deploy and debug standalone Java apps              –Including ...
Practical Tips                      Accessing ServicesSaturday, October 20, 2012
cloudfoundry-runtime        • Programmatic creation of service connection factories              –Using ServiceCreator and...
Using ServiceCreator in Spring Applications                   //Provides access to CF service and application env info    ...
Using ServiceInfo for all Java Apps                    //Provides access to CF service and application env info           ...
More Practical Tips...        • Use VCAP_APP_HOST and VCAP_APP_PORT env vars              –If not using cloudfoundry-runti...
Key Takeaway            Endless possibilities with standalone apps on Cloud Foundry             60Saturday, October 20, 2012
Demos        • Vert.x with SockJS              –https://github.com/cloudfoundry-samples/vertx-socks-sample        • Unfilt...
Questions?Saturday, October 20, 2012
Upcoming SlideShare
Loading in...5
×

Thinking Outside the Container: Deploying Standalone Apps to Cloud Foundry

2,629

Published on

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!

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,629
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
24
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 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. 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. 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. 4. Core Runtimes and Frameworks • Java –Spring –Grails –Lift –Play • Ruby –Rails –Sinatra –Rack • Node.js 4Saturday, October 20, 2012
  5. 5. Community and partners contributions • Python –Django –WSGI • Erlang OTP/Rebar • PHP • Perl • .Net –On Iron Foundry 5Saturday, October 20, 2012
  6. 6. The Platinum Rule Treat each framework the way it wants to be treated! 6Saturday, October 20, 2012
  7. 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. 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. 9. This Looks Great! But.... My App Doesn’t Use Any of These Frameworks! 9Saturday, October 20, 2012
  10. 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. 11. Uses of Standalone Applications • Async Web Frameworks • BYOC: Embedding Jetty or Tomcat • Distributed polyglot applications • Workers 11Saturday, October 20, 2012
  12. 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. 13. vert.x - Asynchronous, Event-Driven Java 13Saturday, October 20, 2012
  14. 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. 15. Demo Vert.x with SockJS on Cloud FoundrySaturday, October 20, 2012
  16. 16. Uses of Standalone Applications • Async Web Frameworks • BYOC: Embedding Jetty or Tomcat • Distributed polyglot applications • Workers 16Saturday, October 20, 2012
  17. 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. 18. More reasons to BYOC.... • Deploy legacy EJB apps –TomEE • Customize Tomcat –Change logging, server config, etc 18Saturday, October 20, 2012
  19. 19. Demo Unfiltered with Jetty on Cloud FoundrySaturday, October 20, 2012
  20. 20. Uses of Standalone Applications • Async Web Frameworks • BYOC: Embedding Jetty or Tomcat • Distributed polyglot applications • Workers 20Saturday, October 20, 2012
  21. 21. wgrus-monolithic.war @Controller StoreFront Widget Gadget Accounting Shipping InventoryService InventoryService Service Service RDBMS 21Saturday, October 20, 2012
  22. 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. 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. 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. 25. And.... • Polyglot persistence –Relational –NoSQL –NewSQL • Social network integration 25Saturday, October 20, 2012
  26. 26. Addressing the Scalability ProblemSaturday, October 20, 2012
  27. 27. The App 27Saturday, October 20, 2012
  28. 28. Simple Distribution Backend HTTP Frontend 28Saturday, October 20, 2012
  29. 29. Widening Distribution Backend 1 HTTP Frontend 1 29Saturday, October 20, 2012
  30. 30. Widening Distribution Backend 2 Backend 1 HTTP Frontend 1 29Saturday, October 20, 2012
  31. 31. Widening Distribution Backend 2 Backend 1 Backend 3 HTTP Frontend 1 29Saturday, October 20, 2012
  32. 32. Widening Distribution Backend 2 Backend 1 Backend 3 HTTP Frontend 2 Frontend 1 29Saturday, October 20, 2012
  33. 33. Widening Distribution Backend 2 Backend 1 Backend 3 HTTP Frontend 2 Frontend 1 Frontend 3 29Saturday, October 20, 2012
  34. 34. Scaling out in Cloud Foundry vmc instances <app> 5 30Saturday, October 20, 2012
  35. 35. Cloud Foundry Manifests --- applications: ./frontend: ... depends-on: ./backend ./backend: ... 31Saturday, October 20, 2012
  36. 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. 37. Demo Distributed polyglot WGRUSSaturday, October 20, 2012
  38. 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. 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. 40. Akka: Messaging based remoting Backend 2 Backend 1 Backend 3 AMQP/ Redis Frontend 2 Frontend 1 Frontend 3 36Saturday, October 20, 2012
  41. 41. Demo WGRUS with AkkaSaturday, October 20, 2012
  42. 42. Widening Distribution: Messaging Middleware Backend 2 Backend 1 Backend 3 Frontend 2 Frontend 1 Frontend 3 38Saturday, October 20, 2012
  43. 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. 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. 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. 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. 47. Demo WGRUS with Spring IntegrationSaturday, October 20, 2012
  48. 48. Uses of Standalone Applications • Async Web Frameworks • BYOC: Embedding Jetty or Tomcat • Distributed polyglot applications • Workers 44Saturday, October 20, 2012
  49. 49. Get to Work! • Update search indexes! • Email your users! • Backup your data! • Upload new data from external storage! 45Saturday, October 20, 2012
  50. 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. 51. Batch Processing with Spring Batch 47Saturday, October 20, 2012
  52. 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. 53. Demo Spring Batch Working it on Cloud FoundrySaturday, October 20, 2012
  54. 54. Practical Tips Packaging Your AppSaturday, October 20, 2012
  55. 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. 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. 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. 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. 59. Practical Tips Accessing ServicesSaturday, October 20, 2012
  60. 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. 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. 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. 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. 64. Key Takeaway Endless possibilities with standalone apps on Cloud Foundry 60Saturday, October 20, 2012
  65. 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. 66. Questions?Saturday, October 20, 2012
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×