meshBlog
Step-by-Step: Deploying a Java Spring App to Cloud Foundry
You are a developer and have been dreaming of someone to take care of deploying and operating your cloud-native applications? With Cloud Foundry you might have found a solution to this.
What is Cloud Foundry?
Cloud Foundry is a container-based open-source software for application deployment. It enables developers to deploy apps of all common programming languages, such as Java, Python, Node.js, .NET Core or Go within minutes. The platform takes care of deployment, scaling and administration of cloud-native applications throughout their lifecycle.
What you need to get started
- An account to use Cloud Foundry. As Cloud Foundry is an open-source platform there are multiple providers.
- If not done yet, you should get started by installing the Cloud Foundry CLI. Type
cf
to your terminal to confirm that the installation was successful. - If not there already, you need to install Gradle.
So let’s get our hands dirty now and deploy an application on the platform.
Step 1: Deploying an application to Cloud Foundry
In general Cloud Foundry offers 2 ways to deploy applications. You can either let the platform build a container out of your application and the integrated buildpacks or, in case you already have a Docker container up and running, you can deploy your Docker container to Cloud Foundry. We will choose the first way in this example and will show how to deploy a Java Spring application.
To start, we need to login to Cloud Foundry. If you are using meshcloud you do this, by choosing a location in the meshPanel and then executing the command shown in the CLI-Access tab.
It will be something like this, depending on the location you chose.
$ cf api https://api.cf.eu-de-netde.msh.host
Now, we need to authenticate against this endpoint, by executing:
$ cf login -sso
You will be asked for a passcode, which you also get from the meshPanel (CLI-Access).
We will use an application that is provided within the Cloud Foundry sample apps on Github. It is an app to store music albums. While it has an integrated in-memory database, you can easily connect it to one of the databases in our marketplace to get persistence. We will get there in a moment. Let’s clone the code first:
$ git clone https://github.com/cloudfoundry-samples/spring-music.git
and access the folder.
Once you navigated to the app folder, you can build the app:
$ ./gradlew clean assemble
And push it to the cloud:
$ cf push
And there you are: The app is running.
You should see something like this. Have a look at the manifest.yml file in the app folder. It contains the specifications of name, memory, route, etc. for your app.
You can reach the app’s web interface by copying the url to your browser. Changes in the app will be stored in-memory. However, this is no long-term solution, as your are currently only running a single instance of your app. A restart will lead to a loss of your changes. So what we are going to do next is to bind the app to a persistent database and scale it up to 3 instances.
Step 2: Binding a Data Service to your application
A common microservice architecture consists of multiple apps and services like databases or message queues for communication. You can provision services from the Cloud Foundry Marketplace.
You reach the marketplace by executing:
$ cf marketplace
in your terminal. As a result you get a list of services that are currently offered on the platform. Let’s create a MongoDB service to bind to our application.
$ cf create-service MongoDB S musicDB
We are specifying the database, choosing a plan and a name for the database. The database will be created straight away. You will see it in your service list:
$ cf services
Getting services in org meshcloud-demo / space aproject as c9f7d64c-404d-4b29-b719-b2359f6c8157...
OK
name service plan bound apps last operation
musicDB MongoDB S create succeeded
Now we can bind the database to our app with a single command.
$ cf bind-service spring-music musicDB
This will cause changes within the app to be persistent.
Step 3: Scaling your application
As we saw in our manifest.yml file and the CLI, we just started a single instance of the application. If you have high-availability requirements, you should always run a minimum of 2 app instances. You can easily scale your application at any time. We will now scale our app horizontally to 4 instances.
$ cf scale spring-music -i 4
Alternatively, you can also scale vertically, increasing RAM or disk of your application instance.
Congratulations! You did it.