Cloud Foundry Deployment

If you have configured and built the sample stream applications to run with one of the supported message brokers, You can run them as stand-alone applications on a Cloud Foundry installation.

This section walks you through how to deploy the three Spring Cloud Stream applications on Cloud Foundry.

As of this writing, Kafka must be managed as an external service which is accessible to your Cloud Foundry environment.

Create deployment manifests

Create a CF manifest for each application, configured to connect to the external Kafka broker.

Create a CF manifest YAML file called usage-detail-sender.yml for the UsageDetailSender:

applications:
- name: usage-detail-sender
  timeout: 120
  path: ./target/usage-detail-sender-0.0.1-SNAPSHOT.jar
  memory: 1G
  buildpack: java_buildpack
  env:
    SPRING_CLOUD_STREAM_KAFKA_BINDER_BROKERS: [Kafka_Service_IP_Address:Kafka_Service_Port]
    SPRING_CLOUD_STREAM_KAFKA_BINDER_ZKNODES: [ZooKeeper_Service_IP_Address:ZooKeeper_Service_Port]

Create a CF manifest YAML file called usage-cost-processor.yml for the UsageCostProcessor:

applications:
- name: usage-cost-processor
  timeout: 120
  path: ./target/usage-cost-processor-0.0.1-SNAPSHOT.jar
  memory: 1G
  buildpack: java_buildpack
  env:
    SPRING_CLOUD_STREAM_KAFKA_BINDER_BROKERS: [Kafka_Service_IP_Address:Kafka_Service_Port]
    SPRING_CLOUD_STREAM_KAFKA_BINDER_ZKNODES: [ZooKeeper_Service_IP_Address:ZooKeeper_Service_Port]

Create a CF manifest YAML file called usage-cost-logger.yml for the UsageCostLogger:

applications:
- name: usage-cost-logger
  timeout: 120
  path: ./target/usage-cost-logger-0.0.1-SNAPSHOT.jar
  memory: 1G
  buildpack: java_buildpack
  env:
    SPRING_CLOUD_STREAM_KAFKA_BINDER_BROKERS: [Kafka_Service_IP_Address:Kafka_Service_Port]
    SPRING_CLOUD_STREAM_KAFKA_BINDER_ZKNODES: [ZooKeeper_Service_IP_Address:ZooKeeper_Service_Port]

Create a RabbitMQ service

From the CF market place, create a RabbitMQ service instance, named rabbitmq from one of the available RabbitMQ service plans. For example, for a service plan p.rabbitmq single-node, use:

cf create-service p.rabbitmq single-node rabbitmq

Create deployment manifests

Create a CF manifest for each application, configured to bind to the rabbitmq service.

Create a CF manifest YAML file named usage-detail-sender.yml for the UsageDetailSender:

applications:
- name: usage-detail-sender
  timeout: 120
  path: ./target/usage-detail-sender-rabbit-0.0.1-SNAPSHOT.jar
  memory: 1G
  buildpack: java_buildpack
  services:
    - rabbitmq

Create a CF manifest YAML file named usage-cost-processor.yml for the UsageCostProcessor:

applications:
- name: usage-cost-processor
  timeout: 120
  path: ./target/usage-cost-processor-0.0.1-SNAPSHOT.jar
  memory: 1G
  buildpack: java_buildpack
  services:
    - rabbitmq

Create a CF manifest YAML file named usage-cost-logger.yml:

applications:
- name: usage-cost-logger
  timeout: 120
  path: ./target/usage-cost-logger-0.0.1-SNAPSHOT.jar
  memory: 1G
  buildpack: java_buildpack
  services:
    - rabbitmq

Push the UsageDetailSender application by using its manifest, as follows:

cf push -f usage-detail-sender.yml

Push the UsageCostProcessor application by using its manifest, as follows:

cf push -f usage-cost-processor.yml

Push the UsageCostLogger application by using its manifest, as follows:

cf push -f usage-cost-logger.yml

You can see the applications by running the cf apps command, as the following example (with output) shows:

cf apps
name                   requested state   instances   memory   disk   urls
usage-cost-logger      started           1/1         1G       1G     usage-cost-logger.cfapps.io
usage-cost-processor   started           1/1         1G       1G     usage-cost-processor.cfapps.io
usage-detail-sender    started           1/1         1G       1G     usage-detail-sender.cfapps.io

To verify the deployment, tail the logs on the usage-cost-logger application.

cf logs usage-cost-logger

You should see something like this:

   2019-05-13T23:23:33.36+0530 [APP/PROC/WEB/0] OUT 2019-05-13 17:53:33.362  INFO 15 --- [e-cost.logger-1] i.s.d.s.u.UsageCostLogger     : {"userId": "user5", "callCost": "1.0", "dataCost": "12.350000000000001" }
   2019-05-13T23:23:33.46+0530 [APP/PROC/WEB/0] OUT 2019-05-13 17:53:33.467  INFO 15 --- [e-cost.logger-1] i.s.d.s.u.UsageCostLogger     : {"userId": "user1", "callCost": "19.0", "dataCost": "10.0" }
   2019-05-13T23:23:34.46+0530 [APP/PROC/WEB/0] OUT 2019-05-13 17:53:34.466  INFO 15 --- [e-cost.logger-1] i.s.d.s.u.UsageCostLogger     : {"userId": "user4", "callCost": "2.2", "dataCost": "5.15" }
   2019-05-13T23:23:35.46+0530 [APP/PROC/WEB/0] OUT 2019-05-13 17:53:35.469  INFO 15 --- [e-cost.logger-1] i.s.d.s.u.UsageCostLogger     : {"userId": "user3", "callCost": "21.0", "dataCost": "17.3" }

Clean Up

Delete the application instances:

cf d -f usage-detail-sender
cf d -f usage-cost-processor
cf d -f usage-cost-logger

If using RabbitMQ, you may delete the service instance:

cf ds -f rabbitmq