Introduction to Spring Boot Microservices
In this blog post, we will discuss about Spring Boot Microservices on Kubernetes, that is how to develop an application with microservice architecture using the Spring Boot framework and then launch a local Minikube cluster to deploy that application as a container on that cluster. You have various choices to build a Spring application with microservices architecture. Still, Spring Boot is one of the most preferred frameworks for building production-ready Spring applications rapidly. Spring Boot is attracting many users due to its enhanced simplification while writing and developing Spring applications. You can deploy these Spring applications as WAR and JAR files, but Containers is another excellent choice. With a general-purpose Container Orchestration platform, you can easily manage a system of microservices; that's where Kubernetes comes into the picture. It is a platform for automating the deployment and management of containerized applications and services. With Kubernetes, you can group multiple containers into logical units to discover and manage applications with microservice architecture.Why are Spring Boot Microservices Important?
- Docker: You can download and install the Docker Community Edition (CE) by referring to their official documentation as per the platform being used by you.
- Docker Hub Account: You need to have a Docker Hub Account to push your application image.
- Kubernetes Cluster: You will also need a Kubernetes cluster running on your local system. If it's not already set up, you can create a cluster using Minikube or Kind.
- Kubectl: kubectl is a command-line utility required to run your commands against Kubernetes clusters. You can install and set it up using the Kubernetes official documentation.
Create a Spring Boot Application with Microservice Architecture
To be done by the designated team. The application should rely on the MongoDB database.Containerize the Spring Boot Application
Create a file named 'Dockerfile' in the root directory of your application with the following content: This Dockerfile contains the following commands:- FROM that defines the base layer for your application image. In this case use the OpenJDK:8 version.
- ENV command is helps to set the desirable environment variables.
- EXPOSE defines the listening port within the container.
- COPY is used to copy all the JAR files from the build/libs/ directory to the directory set in your APP_HOME environment variable, i.e.,/user/app.
- WORKDIR sets your current working directory to the directory defined in your APP_HOME environment variable, i.e.,/user/app.
- ENTRYPOINT executes sh -c that opens a shell inside the container.
- CMD provides an argument to the command defined in ENTRYPOINT. Thus, it executes java -jar $APP_FILE inside the container's shell.
Because of their flexibility, failure, and self-healing properties, Kubernetes implementation is the best for production purposes. Source - Implementing a Kubernetes Strategy in Your Organization
Deploy the Application on Kubernetes Cluster
Kubernetes -- a general-purpose container-orchestrator -- is designed to run complex applications efficiently with many scalable components.MongoDB Deployment
This application possesses a microservice architecture and relies heavily on the MongoDB database. Thus, you first need to deploy an instance of MongoDB for your application. Create a file named mongo. yaml with all the necessary resources that include deployment, service, config map, secret, and pvc, as shown below.apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongo-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 256Mi
---
apiVersion: v1
kind: Service
metadata:
name: mongo
spec:
selector:
app: mongo
ports:
- port: 27017
targetPort: 27017
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mongodb
data:
database-name: myapp
---
apiVersion: v1
kind: Secret
metadata:
name: mongodb
type: Opaque
data:
database-password: MTIzNDU2
database-user: cGlvdHI=
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo
spec:
selector:
matchLabels:
app: mongo
template:
metadata:
labels:
app: mongo
spec:
containers:
- name: mongo
image: mongo:latest
ports:
- containerPort: 27017
env:
- name: MONGO_INITDB_DATABASE
valueFrom:
configMapKeyRef:
name: mongodb
key: database-name
- name: MONGO_INITDB_ROOT_USERNAME
valueFrom:
secretKeyRef:
name: mongodb
key: database-user
- name: MONGO_INITDB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mongodb
key: database-password
volumeMounts:
- name: storage
mountPath: /data/db
volumes:
- name: storage
persistentVolumeClaim:
claimName: mongo-pvc
After creating the above file, you are ready to deploy your MongoDB instance with the following command: Now, You can check the status of your MongoDB pod by: Once the MongoDB instance runs the state, you can move further to deploy your Spring Boot Application.Spring Application Deployment
Since your MongoDB database is ready now, you can create a file named myapp.yaml consisting of all the required resources:apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app
image: priyankaagrawal28/sample-project/my-app:1.0
ports:
- containerPort: 8000
env:
- name: MONGO_DATABASE
valueFrom:
configMapKeyRef:
name: mongodb
key: database-name
- name: MONGO_USERNAME
valueFrom:
configMapKeyRef:
name: mongodb
key: database-user
- name: MONGO_PASSWORD
valueFrom:
configMapKeyRef:
name: mongodb
key: database-password
---
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8000
type: NodePort
Now you are here, ready to deploy your application on the cluster through the following command: Check the status of your pods by: Once your pods are running, you can access the application on your local browser: http://<your-node-ip>:8000Summary
This guide walks users through all about how you develop your Spring Boot Application with a microservice architecture and deploy it on your local Kubernetes cluster so that users can connect to the application, which they have exposed as a Service in Kubernetes.- Explore the Complete Guide to Set up Jenkins on Kubernetes.
- Read more about How to Debug Application Running on Kubernetes?