Decomposing applications for
deployability and scalability
 Chris Richardson

 Author of POJOs in Action
 Founder of the original CloudFoundry.com

   @crichardson
 crichardson@vmware.com
 http://plainoldobjects.com/




                                            1
Presentation goal
    How decomposing
   applications improves
deployability and scalability
             and
 How Cloud Foundry helps
                           2
About Chris




              3
(About Chris)




                4
About Chris()




                5
About Chris




              6
About Chris




   http://www.theregister.co.uk/2009/08/19/springsource_cloud_foundry/




                                                                         7
vmc push About-Chris
     Developer Advocate for
       CloudFoundry.com


Signup at http://cloudfoundry.com
   promo code: JavaZone2012

                                    8
Agenda
§The (sometimes evil) monolith
§Decomposing applications into services
§How do services communicate?
§Presentation layer design
§How Cloud Foundry helps




                                           9
Let’s imagine you are building
 an e-commerce application




                             10
Traditional web application architecture
                         WAR



                                StoreFrontUI


                                 Accounting
                                  Service

                                                  MySQL
 Browser     Apache
                               InventoryService   Database


                                   Shipping
                                   Service


Simple to             Tomcat
   develop
   test
   deploy
   scale                                                 11
But there are problems with
 a monolithic architecture



                          12
Users expect a rich, dynamic
and interactive experience
                                                           h
                                                        oug
                                                      en
                                                ood
                                             ’tg
                        HTTP Request
                                          isn
                                    ure
                                 ect
                                                Java Web
    Browser
                               it
                        HTML/Javascript        Application

                        Ia rch
              ty le U
         s
     Old



     Real-time web ≅ NodeJS
                                                               13
Obstacle to frequent deployments
§Need to redeploy everything to change one component
§Interrupts long running background (e.g. Quartz) jobs
§Increases risk of failure



                       Fear of change




§Updates will happen less often
§e.g. Makes A/B testing UI really difficult              14
Overloads your IDE and container




     Slows down development    15
Obstacle to scaling development




    Accounting team
                      E-commerce
      Engineering
                       application



     Shipping team




                                     16
Obstacle to scaling development


                      WAR


        UI team              StoreFrontUI


    Accounting team           Accounting


    Inventory team          InventoryService


     Shipping team              Shipping




                                               17
Obstacle to scaling development




   Lots of coordination and
    communication required        18
Requires long-
term commitment
 to a technology
       stack




                   19
Agenda
§The (sometimes evil) monolith
§Decomposing applications into services
§How do services communicate?
§Presentation layer design
§How Cloud Foundry helps




                                           20
21
The scale cube


Y axis -
functional
decomposition
Scale by




                                                                 im ing
splitting




                                                              g s on

                                                                      r
                                                                   ila
                                                           tin iti
different things




                                                        lit art
                                                               p
                                                 gs y ata
                                             th ale - d
                                                     sp
                                            i        s
                                         ax
                                               in b
                                         Z

                   X axis - horizontal
                                             Sc

                   duplication
                                                                          22
Y-axis scaling - application level

              WAR



                     StoreFrontUI


                      Accounting
                       Service


                    InventoryService



                        Shipping
                        Service




                                       23
Y-axis scaling - application level
                                        accounting web application

                                                  Accounting
                                                   Service




  Store front web application            inventory web application


                                               InventoryService
           StoreFrontUI




                                        shipping web application


                                                    Shipping
                                                    Service




   Apply X axis cloning and/or Z axis partitioning to each service   24
Partitioning strategies
§Partition by verb, e.g. shipping service
§Partition by noun, e.g. inventory service
§Single Responsibility Principle
§Unix utilities - do one focussed thing well




     Something of an art
                                                25
Real world examples
          http://techblog.netflix.com/




          Between 100-150 services are accessed to build a
          page.
          http://highscalability.com/amazon-architecture




          http://www.addsimplicity.com/downloads/
          eBaySDForum2006-11-29.pdf

          http://queue.acm.org/detail.cfm?id=1394128

                                                           26
There are drawbacks



                      27
Complexity


   See Steve Yegge’s Google
Platforms Rant re Amazon.com

                               28
Multiple databases
            =
Transaction management
       challenges


                         29
When to use it?
  In the beginning:
 •You don’t need it
 •It will slow you down




              Later on:
             •You need it
             •Refactoring is painful   30
But there are many benefits
§Scales development: develop, deploy and scale
  each service independently
§Update UI independently
§Improves fault isolation
§Eliminates long-term commitment to a single
  technology stack



      Modular, polyglot, multi-
      framework applications
                                                  31
Two levels of architecture
                            System-level

Services
Inter-service glue: interfaces and communication mechanisms
Slow changing


                            Service-level

Internal architecture of each service
Each service could use a different technology stack
Pick the best tool for the job
Rapidly evolving


                                                              32
If services are small...
§Regularly rewrite using a better technology stack
§Adapt system to changing requirements and
  better technology without a total rewrite
§Pick the best developers rather than best <pick
  a language> developers polyglot culture

    Fred George
    “Developer Anarchy”

                                                      33
The human body as a system




                             34
50 to 70 billion of your cells die each
                  day




                                      35
Yet you (the system) remain you




                                  36
Can we build software systems
  with these characteristics?

              http://dreamsongs.com/Files/
              DesignBeyondHumanAbilitiesSimp.pdf




              http://dreamsongs.com/Files/WhitherSoftware.pdf




                                                            37
Agenda
§The (sometimes evil) monolith
§Decomposing applications into services
§How do services communicate?
§Presentation layer design
§How Cloud Foundry helps




                                           38
Inter-service communication options
§Synchronous HTTP        asynchronous AMQP

§Formats: JSON, XML, Protocol Buffers, Thrift, ...
§Even via the database


   Asynchronous is preferred

   JSON is fashionable but binary
   format is more efficient
                                                      39
Asynchronous message-based communication
                                 wgrus-billing.war

                                          Accounting
                                           Service



wgrus-store.war                wgrus-inventory.war
                    RabbitMQ
     StoreFrontUI   (Message          InventoryService   MySQL
                     Broker)



                               wgrus-shipping.war


                                       ShippingService




                                                                 40
Benefits
§Decouples caller from server
§Caller unaware of server’s coordinates (URL)
§Message broker buffers message when server is
down/slow




                                                  41
Drawbacks
§Additional complexity of message broker
§RPC using messaging is more complex




                                            42
Writing code that calls
       services



                          43
The need for parallelism
                                   Service B
                b = serviceB()


                                               Call in parallel
                  c = serviceC()
 Service A                         Service C



             d = serviceD(b, c)
                                   Service D


                                                                  44
Java Futures are a great
concurrency abstraction


  http://en.wikipedia.org/wiki/Futures_and_promises
                                                      45
Akka’s composable
futures are even better



                          46
Using Akka futures
def callB() : Future[...] = ...
def callC() : Future[...] = ...
def callD() : Future[...] = ...                           Two calls execute in parallel


val future = for {
  (b, c) <- callB() zip callC();
  d <- callD(b, c)
                                                                And then invokes D
 } yield d

val result = Await.result(future, 1 second)


  http://doc.akka.io/docs/akka/2.0.1/scala/futures.html           Get the result of D
                                                                                          47
Spring Integration
§Provides the building blocks for
  a pipes and filters architecture
§Enables development of
  application components that are
  •loosely coupled
  •insulated from messaging
  infrastructure
§Messaging defined declaratively




                                     48
Handling failure


   Service A                   Service B




               Errors happen
           in distributed systems



                                           49
About Netflix
          > 1B API calls/day
 1 API call average 6 service calls
     Fault tolerance is essential




        http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html




                                                                                 50
Use timeouts and retries

         Never wait forever

   Errors can be transient                             retry




                    http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html
                                                                                             51
Use per-dependency bounded thread pool
 Service A

    Runnable 1               Task 1

     Runnable 2              Task 2
                                                                                  Service B
     Runnable ...            Task ...

     bounded queue        bounded thread pool


       Fails fast if         Limits number of
service is slow or down     outstanding requests




                                                   http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html   52
Use a circuit breaker
High error rate   stop calling temporarily

   Down     wait for it to come back up

  Slow     gives it a chance to recover




                      http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html   53
On failure
          Return cached data
Avoid
Failing
          Return default data

               Fail fast




                     http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html   54
Agenda
§The (sometimes evil) monolith
§Decomposing applications into services
§How do services communicate?
§Presentation layer design
§How Cloud Foundry helps




                                           55
Modular application




Choice of presentation layer
        technology

                               56
NodeJS is the fashionable technology




                                   57
Why NodeJS?
§Familiar Javascript
§High-performance, scalable event-driven, non-blocking
  I/O model
§Over 13,000 modules developed by the community
§Many JavaScript client frameworks have a NodeJS
 counterpart, e.g. socket.io




                                                          58
NodeJS example
                                    Handle         Handle file
var http = require('http');          HTTP            read
var fs = require("fs");             request

http.createServer(function (req, res) {
	       fs.readFile('somefile.txt', function (err, data) {
	        if (err) throw err;
	        res.writeHead(200, {'Content-Type': 'text/plain'});
	        res.end(data);
	       });
}).listen(1337, '127.0.0.1');

console.log('Server running at http://127.0.0.1:1337/');



                                                                59
NodeJS isn’t the only game in town




   JVM-based         http://vertx.io/

                                        60
A modern web application


                                                   Service 1
                 RESTful WS       Node JS
Browser

    HTML 5                    Server Application
   Application                                     Service 2
                   Events
    Socket.io                     Socket.io
      client                       server

                                                      ...




                                                               61
NodeJS - using RESTful WS and AMQP

                       REST
                               Service
REST
Requests



            Node JS


 Events
           socket.io
                       AMQP              AMQP
                              RabbitMQ          Service




                                                          62
Agenda
§The (sometimes evil) monolith
§Decomposing applications into services
§How do services communicate?
§Presentation layer design
§How Cloud Foundry helps




                                           63
Traditional tools: monolithic applications




                                         64
Developing modular apps is more difficult
§Many more moving parts to manage
  •Platform services: SQL, NoSQL, RabbitMQ
  •Application services: your code
§Who is going to setup the environments:
  •the developer sandbox?
  •...
  •QA environments?

     But Cloud Foundry
           helps...
                                             65
Easy polyglot application deployment
 and service provisioning
                                                                               OSS community




 vFabric
Postgres
                                Ap
                                   p
                                  lica




                                                                             Private	
  
                                      'o




                                                                             Clouds	
  
                                       n	
  S




             Data Services
                                         erv
                                            ice
                                               	
  In
                                                 ter




      vFabric
                                                    fac
                                                       e




      RabbitMQTM                                                    Public
                                                                    Clouds
                       Msg Services




                                                           Micro
                                          Other            Clouds
                                         Services

              Additional partners services
              …
Creating a platform service instance
$ vmc create-service mysql --name mysql1
Creating Service: OK

$ vmc services
......

=========== Provisioned Services ============

+-------------+---------+
| Name        | Service |
+-------------+---------+
| mysql1      | mysql   |
+-------------+---------+
Multi-application manifest - part 1
---
applications:
  inventory/target:         Path to application
    name: inventory
    url: cer-inventory.chrisr.cloudfoundry.me
    framework:
     name: spring
     info:
      mem: 512M
      description: Java SpringSource Spring Application
      exec:
    mem: 512M
    instances: 1
    services:          Required platform services
     si-rabbit:
      type: :rabbitmq
     si-mongo:
      type: :mongodb
     si-redis:
      type: :redis
                                                          68
Multi-application manifest - part 2
 store/target:
  name: store                           Path to application

  url: cer-store.chrisr.cloudfoundry.me
  framework:
   name: spring
   info:
    mem: 512M
    description: Java SpringSource Spring Application
    exec:
  mem: 512M
  instances: 1
  services:
                            Required platform services
   si-mongo:
    type: :mongodb
   si-rabbit:
    type: :rabbitmq

                                                              69
One command to create platform services and
deploy application
$ vmc push
Would you like to deploy from the current directory? [Yn]:
Pushing application 'inventory'...
Creating Application: OK
Creating Service [si-rabbit]: OK
Binding Service [si-rabbit]: OK
Creating Service [si-mongo]: OK
Binding Service [si-mongo]: OK
Creating Service [si-redis]: OK
Binding Service [si-redis]: OK
Uploading Application:
 Checking for available resources: OK
                                           vmc push:
 Processing resources: OK                  •Reads the manifest file
 Packing application: OK
 Uploading (12K): OK                       •Creates the required platform services
Push Status: OK
Staging Application 'inventory': OK
                                           •Deploys all the applications
Starting Application 'inventory': OK
Pushing application 'store'...
Creating Application: OK
Binding Service [si-mongo]: OK
Binding Service [si-rabbit]: OK
Uploading Application:
 Checking for available resources: OK
 Processing resources: OK
 Packing application: OK                                                             70
Micro Cloud Foundry: new developer sandbox


       App Instances                              Services




      Open source Platform as a Service project




                                                  10.04



     A PaaS packaged as a VMware Virtual Machine

                          Use as a developer sandbox
                          • Use the services from Junit integration tests
                          • Deploy your application for functional testing
                          • Remote debugging from STS

                                                                             71
Using Caldecott to tunnel into your services




                                               72
Caldecott = TCP over HTTP

            native
                                                             native
           protocol                  HTTP
 Service                 Caldecott            Caldecott     protocol
                                                                       Service
  client          Port     gem                application
                  NNN




Your computer                               Cloud Foundry




                                                                                 73
Using Caldecott…
$ vmc tunnel
1: mysql-135e0
2: mysql1
Which service to tunnel to?: 2
Password: ********
Stopping Application: OK
Redeploying tunnel application 'caldecott'.
Uploading Application:
  Checking for available resources: OK
  Packing application: OK
  Uploading (1K): OK
Push Status: OK
Binding Service [mysql1]: OK
Staging Application: OK
Starting Application: OK
Getting tunnel connection info: OK

Service connection info:
  username : uMe6Apgw00AhS
  password : pKcD76PcZR7GZ
  name     : d7cb8afb52f084f3d9bdc269e7d99ab50

Starting tunnel to mysql1 on port 10000.
1: none
2: mysql
Which client would you like to start?: 2
…Using Caldecott
Launching 'mysql --protocol=TCP --host=localhost --port=10000 --
    user=uMe6Apgw00AhS --password=pKcD76PcZR7GZ
    d7cb8afb52f084f3d9bdc269e7d99ab50'

Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 10944342
Server version: 5.1.54-rel12.5 Percona Server with XtraDB (GPL),
    Release 12.5, Revision 188

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights
    reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input
    statement.

mysql>
Running JUnit test with Caldecott
 Configure your test code to use port + connection info




                                                         76
Summary



          77
Monolithic applications are
simple to develop and deploy

    BUT have significant
        drawbacks

                               78
Apply the scale cube

                                                                       §Modular, polyglot, and
                                                                         scalable applications
                                                                       §Services developed,
Y axis -
functional
decomposition

                                                                  ng
                                                                         deployed and scaled
                                                                         independently
                                                                  i
                                                               on
                                                              iti
                                                             rt
                                                           pa
                                                         ta
                                                       da
                                                     is-
                                                  ax
                                                  Z




                X axis - horizontal duplication




                                                                                                  79
Cloud Foundry helps...
                                                                             .js
                        Ap
                           p  lica



                                                                                                 Private	
  
                                  'o




                                                                                                 Clouds	
  
                                 n	
  S




   Data Services
                                   erv
                                      ice
                                         	
  In
                                           ter
                                              fac




                                                                           e
                                                                        fac
                                                 e




                                                                                        Public




                                                                     ter
                                                                   r	
  In
                                                                                        Clouds
               Msg Services



                                                                ide
                                                              ov
                                                        	
  Pr
                                                      ud
                                                     Cl o


                                                                               Micro
                                                                               Clouds
                                Other Services
@crichardson crichardson@vmware.com
        http://slideshare.net/chris.e.richardson/




               Questions?
www.cloudfoundry.com promo code: JavaZone2012

Decomposing applications for scalability and deployability - javazone2012

  • 1.
    Decomposing applications for deployabilityand scalability Chris Richardson Author of POJOs in Action Founder of the original CloudFoundry.com @crichardson crichardson@vmware.com http://plainoldobjects.com/ 1
  • 2.
    Presentation goal How decomposing applications improves deployability and scalability and How Cloud Foundry helps 2
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
    About Chris http://www.theregister.co.uk/2009/08/19/springsource_cloud_foundry/ 7
  • 8.
    vmc push About-Chris Developer Advocate for CloudFoundry.com Signup at http://cloudfoundry.com promo code: JavaZone2012 8
  • 9.
    Agenda §The (sometimes evil)monolith §Decomposing applications into services §How do services communicate? §Presentation layer design §How Cloud Foundry helps 9
  • 10.
    Let’s imagine youare building an e-commerce application 10
  • 11.
    Traditional web applicationarchitecture WAR StoreFrontUI Accounting Service MySQL Browser Apache InventoryService Database Shipping Service Simple to Tomcat develop test deploy scale 11
  • 12.
    But there areproblems with a monolithic architecture 12
  • 13.
    Users expect arich, dynamic and interactive experience h oug en ood ’tg HTTP Request isn ure ect Java Web Browser it HTML/Javascript Application Ia rch ty le U s Old Real-time web ≅ NodeJS 13
  • 14.
    Obstacle to frequentdeployments §Need to redeploy everything to change one component §Interrupts long running background (e.g. Quartz) jobs §Increases risk of failure Fear of change §Updates will happen less often §e.g. Makes A/B testing UI really difficult 14
  • 15.
    Overloads your IDEand container Slows down development 15
  • 16.
    Obstacle to scalingdevelopment Accounting team E-commerce Engineering application Shipping team 16
  • 17.
    Obstacle to scalingdevelopment WAR UI team StoreFrontUI Accounting team Accounting Inventory team InventoryService Shipping team Shipping 17
  • 18.
    Obstacle to scalingdevelopment Lots of coordination and communication required 18
  • 19.
    Requires long- term commitment to a technology stack 19
  • 20.
    Agenda §The (sometimes evil)monolith §Decomposing applications into services §How do services communicate? §Presentation layer design §How Cloud Foundry helps 20
  • 21.
  • 22.
    The scale cube Yaxis - functional decomposition Scale by im ing splitting g s on r ila tin iti different things lit art p gs y ata th ale - d sp i s ax in b Z X axis - horizontal Sc duplication 22
  • 23.
    Y-axis scaling -application level WAR StoreFrontUI Accounting Service InventoryService Shipping Service 23
  • 24.
    Y-axis scaling -application level accounting web application Accounting Service Store front web application inventory web application InventoryService StoreFrontUI shipping web application Shipping Service Apply X axis cloning and/or Z axis partitioning to each service 24
  • 25.
    Partitioning strategies §Partition byverb, e.g. shipping service §Partition by noun, e.g. inventory service §Single Responsibility Principle §Unix utilities - do one focussed thing well Something of an art 25
  • 26.
    Real world examples http://techblog.netflix.com/ Between 100-150 services are accessed to build a page. http://highscalability.com/amazon-architecture http://www.addsimplicity.com/downloads/ eBaySDForum2006-11-29.pdf http://queue.acm.org/detail.cfm?id=1394128 26
  • 27.
  • 28.
    Complexity See Steve Yegge’s Google Platforms Rant re Amazon.com 28
  • 29.
    Multiple databases = Transaction management challenges 29
  • 30.
    When to useit? In the beginning: •You don’t need it •It will slow you down Later on: •You need it •Refactoring is painful 30
  • 31.
    But there aremany benefits §Scales development: develop, deploy and scale each service independently §Update UI independently §Improves fault isolation §Eliminates long-term commitment to a single technology stack Modular, polyglot, multi- framework applications 31
  • 32.
    Two levels ofarchitecture System-level Services Inter-service glue: interfaces and communication mechanisms Slow changing Service-level Internal architecture of each service Each service could use a different technology stack Pick the best tool for the job Rapidly evolving 32
  • 33.
    If services aresmall... §Regularly rewrite using a better technology stack §Adapt system to changing requirements and better technology without a total rewrite §Pick the best developers rather than best <pick a language> developers polyglot culture Fred George “Developer Anarchy” 33
  • 34.
    The human bodyas a system 34
  • 35.
    50 to 70billion of your cells die each day 35
  • 36.
    Yet you (thesystem) remain you 36
  • 37.
    Can we buildsoftware systems with these characteristics? http://dreamsongs.com/Files/ DesignBeyondHumanAbilitiesSimp.pdf http://dreamsongs.com/Files/WhitherSoftware.pdf 37
  • 38.
    Agenda §The (sometimes evil)monolith §Decomposing applications into services §How do services communicate? §Presentation layer design §How Cloud Foundry helps 38
  • 39.
    Inter-service communication options §SynchronousHTTP asynchronous AMQP §Formats: JSON, XML, Protocol Buffers, Thrift, ... §Even via the database Asynchronous is preferred JSON is fashionable but binary format is more efficient 39
  • 40.
    Asynchronous message-based communication wgrus-billing.war Accounting Service wgrus-store.war wgrus-inventory.war RabbitMQ StoreFrontUI (Message InventoryService MySQL Broker) wgrus-shipping.war ShippingService 40
  • 41.
    Benefits §Decouples caller fromserver §Caller unaware of server’s coordinates (URL) §Message broker buffers message when server is down/slow 41
  • 42.
    Drawbacks §Additional complexity ofmessage broker §RPC using messaging is more complex 42
  • 43.
    Writing code thatcalls services 43
  • 44.
    The need forparallelism Service B b = serviceB() Call in parallel c = serviceC() Service A Service C d = serviceD(b, c) Service D 44
  • 45.
    Java Futures area great concurrency abstraction http://en.wikipedia.org/wiki/Futures_and_promises 45
  • 46.
  • 47.
    Using Akka futures defcallB() : Future[...] = ... def callC() : Future[...] = ... def callD() : Future[...] = ... Two calls execute in parallel val future = for { (b, c) <- callB() zip callC(); d <- callD(b, c) And then invokes D } yield d val result = Await.result(future, 1 second) http://doc.akka.io/docs/akka/2.0.1/scala/futures.html Get the result of D 47
  • 48.
    Spring Integration §Provides thebuilding blocks for a pipes and filters architecture §Enables development of application components that are •loosely coupled •insulated from messaging infrastructure §Messaging defined declaratively 48
  • 49.
    Handling failure Service A Service B Errors happen in distributed systems 49
  • 50.
    About Netflix > 1B API calls/day 1 API call average 6 service calls Fault tolerance is essential http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html 50
  • 51.
    Use timeouts andretries Never wait forever Errors can be transient retry http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html 51
  • 52.
    Use per-dependency boundedthread pool Service A Runnable 1 Task 1 Runnable 2 Task 2 Service B Runnable ... Task ... bounded queue bounded thread pool Fails fast if Limits number of service is slow or down outstanding requests http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html 52
  • 53.
    Use a circuitbreaker High error rate stop calling temporarily Down wait for it to come back up Slow gives it a chance to recover http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html 53
  • 54.
    On failure Return cached data Avoid Failing Return default data Fail fast http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html 54
  • 55.
    Agenda §The (sometimes evil)monolith §Decomposing applications into services §How do services communicate? §Presentation layer design §How Cloud Foundry helps 55
  • 56.
    Modular application Choice ofpresentation layer technology 56
  • 57.
    NodeJS is thefashionable technology 57
  • 58.
    Why NodeJS? §Familiar Javascript §High-performance,scalable event-driven, non-blocking I/O model §Over 13,000 modules developed by the community §Many JavaScript client frameworks have a NodeJS counterpart, e.g. socket.io 58
  • 59.
    NodeJS example Handle Handle file var http = require('http'); HTTP read var fs = require("fs"); request http.createServer(function (req, res) { fs.readFile('somefile.txt', function (err, data) { if (err) throw err; res.writeHead(200, {'Content-Type': 'text/plain'}); res.end(data); }); }).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/'); 59
  • 60.
    NodeJS isn’t theonly game in town JVM-based http://vertx.io/ 60
  • 61.
    A modern webapplication Service 1 RESTful WS Node JS Browser HTML 5 Server Application Application Service 2 Events Socket.io Socket.io client server ... 61
  • 62.
    NodeJS - usingRESTful WS and AMQP REST Service REST Requests Node JS Events socket.io AMQP AMQP RabbitMQ Service 62
  • 63.
    Agenda §The (sometimes evil)monolith §Decomposing applications into services §How do services communicate? §Presentation layer design §How Cloud Foundry helps 63
  • 64.
  • 65.
    Developing modular appsis more difficult §Many more moving parts to manage •Platform services: SQL, NoSQL, RabbitMQ •Application services: your code §Who is going to setup the environments: •the developer sandbox? •... •QA environments? But Cloud Foundry helps... 65
  • 66.
    Easy polyglot applicationdeployment and service provisioning OSS community vFabric Postgres Ap p lica Private   'o Clouds   n  S Data Services erv ice  In ter vFabric fac e RabbitMQTM Public Clouds Msg Services Micro Other Clouds Services Additional partners services …
  • 67.
    Creating a platformservice instance $ vmc create-service mysql --name mysql1 Creating Service: OK $ vmc services ...... =========== Provisioned Services ============ +-------------+---------+ | Name | Service | +-------------+---------+ | mysql1 | mysql | +-------------+---------+
  • 68.
    Multi-application manifest -part 1 --- applications: inventory/target: Path to application name: inventory url: cer-inventory.chrisr.cloudfoundry.me framework: name: spring info: mem: 512M description: Java SpringSource Spring Application exec: mem: 512M instances: 1 services: Required platform services si-rabbit: type: :rabbitmq si-mongo: type: :mongodb si-redis: type: :redis 68
  • 69.
    Multi-application manifest -part 2 store/target: name: store Path to application url: cer-store.chrisr.cloudfoundry.me framework: name: spring info: mem: 512M description: Java SpringSource Spring Application exec: mem: 512M instances: 1 services: Required platform services si-mongo: type: :mongodb si-rabbit: type: :rabbitmq 69
  • 70.
    One command tocreate platform services and deploy application $ vmc push Would you like to deploy from the current directory? [Yn]: Pushing application 'inventory'... Creating Application: OK Creating Service [si-rabbit]: OK Binding Service [si-rabbit]: OK Creating Service [si-mongo]: OK Binding Service [si-mongo]: OK Creating Service [si-redis]: OK Binding Service [si-redis]: OK Uploading Application: Checking for available resources: OK vmc push: Processing resources: OK •Reads the manifest file Packing application: OK Uploading (12K): OK •Creates the required platform services Push Status: OK Staging Application 'inventory': OK •Deploys all the applications Starting Application 'inventory': OK Pushing application 'store'... Creating Application: OK Binding Service [si-mongo]: OK Binding Service [si-rabbit]: OK Uploading Application: Checking for available resources: OK Processing resources: OK Packing application: OK 70
  • 71.
    Micro Cloud Foundry:new developer sandbox App Instances Services Open source Platform as a Service project 10.04 A PaaS packaged as a VMware Virtual Machine Use as a developer sandbox • Use the services from Junit integration tests • Deploy your application for functional testing • Remote debugging from STS 71
  • 72.
    Using Caldecott totunnel into your services 72
  • 73.
    Caldecott = TCPover HTTP native native protocol HTTP Service Caldecott Caldecott protocol Service client Port gem application NNN Your computer Cloud Foundry 73
  • 74.
    Using Caldecott… $ vmctunnel 1: mysql-135e0 2: mysql1 Which service to tunnel to?: 2 Password: ******** Stopping Application: OK Redeploying tunnel application 'caldecott'. Uploading Application: Checking for available resources: OK Packing application: OK Uploading (1K): OK Push Status: OK Binding Service [mysql1]: OK Staging Application: OK Starting Application: OK Getting tunnel connection info: OK Service connection info: username : uMe6Apgw00AhS password : pKcD76PcZR7GZ name : d7cb8afb52f084f3d9bdc269e7d99ab50 Starting tunnel to mysql1 on port 10000. 1: none 2: mysql Which client would you like to start?: 2
  • 75.
    …Using Caldecott Launching 'mysql--protocol=TCP --host=localhost --port=10000 -- user=uMe6Apgw00AhS --password=pKcD76PcZR7GZ d7cb8afb52f084f3d9bdc269e7d99ab50' Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 10944342 Server version: 5.1.54-rel12.5 Percona Server with XtraDB (GPL), Release 12.5, Revision 188 Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql>
  • 76.
    Running JUnit testwith Caldecott Configure your test code to use port + connection info 76
  • 77.
  • 78.
    Monolithic applications are simpleto develop and deploy BUT have significant drawbacks 78
  • 79.
    Apply the scalecube §Modular, polyglot, and scalable applications §Services developed, Y axis - functional decomposition ng deployed and scaled independently i on iti rt pa ta da is- ax Z X axis - horizontal duplication 79
  • 80.
    Cloud Foundry helps... .js Ap p lica Private   'o Clouds   n  S Data Services erv ice  In ter fac e fac e Public ter r  In Clouds Msg Services ide ov  Pr ud Cl o Micro Clouds Other Services
  • 81.
    @crichardson crichardson@vmware.com http://slideshare.net/chris.e.richardson/ Questions? www.cloudfoundry.com promo code: JavaZone2012