This project is part of the 'IBM Cloud Native Reference Architecture' suite, available at https://cloudnativereference.dev/
This project will demonstrate how to deploy a Spring Boot Application with an Elasticsearch database onto a Kubernetes Cluster. At the same time, it will also demonstrate how to deploy a dependency Microservice (Inventory) and its MySQL datastore. To know more about Inventory microservices, check this out.
Here is an overview of the project's features:
- Leverage
Spring Boot
framework to build a Microservices application. - Uses
Elasticsearch
to persist Catalog data to Elasticsearch database. - Uses
Spring data elasticsearch
to persist the data to Elasticsearch. - Uses
Docker
to package application binary and its dependencies.
- Get all items in catalog:
http://localhost:8080/micro/items
- Get item from catalog using id:
http://localhost:8080/micro/items/{item-id}
-
- Installing on MacOS
- Installing on Windows
- Installing on RHEL
- Installing on Ubuntu For more details on installation, check this out.
-
Docker Desktop
-
Clone inventory repository:
git clone https://github.com/ibm-garage-ref-storefront/refarch-cloudnative-micro-inventory-spring.git
cd refarch-cloudnative-micro-inventory-spring
- Run the MySQL Docker Container
Run the below command to get MySQL running via a Docker container.
# Start a MySQL Container with a database user, a password, and create a new database
docker run --name inventorymysql \
-e MYSQL_ROOT_PASSWORD=admin123 \
-e MYSQL_USER=dbuser \
-e MYSQL_PASSWORD=password \
-e MYSQL_DATABASE=inventorydb \
-p 3306:3306 \
-d mysql:5.7.14
If it is successfully deployed, you will see something like below.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d88a6e5973de mysql:5.7.14 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp inventorymysql
- Populate the MySQL Database
Now let us populate the MySQL with data.
- Firstly ssh into the MySQL container.
docker exec -it inventorymysql bash
- Now, run the below command for table creation.
mysql -udbuser -ppassword
- This will take you to something like below.
root@d88a6e5973de:/# mysql -udbuser -ppassword
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.14 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, 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>
-
Go to
scripts > mysql_data.sql
. Copy the contents from mysql_data.sql and paste the contents in the console. -
You can exit from the console using
exit
.
mysql> exit
Bye
- To come out of the container, enter
exit
.
root@d88a6e5973de:/# exit
- Run the Inventory application as follows.
# Build inventory docker image
appsody build
# Run the inventory
docker run --name inventory \
-e MYSQL_HOST=<docker_host> \
-e MYSQL_PORT=3306 \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=password \
-e MYSQL_DATABASE=inventorydb \
-p 8081:8080 \
-d dev.local/inventory-ms-spring
For instance, if it is docker-for-mac
it will be docker.for.mac.localhost
.
- You can also verify it as follows.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f192bd40fbbf dev.local/inventory-ms-spring "/start.sh" 20 hours ago Up 20 hours 8443/tcp, 0.0.0.0:8081->8080/tcp inventory
efed65e2ba5a mysql:5.7.14 "docker-entrypoint.s…" 2 days ago Up 2 days 0.0.0.0:3300->3306/tcp inventorymysql
We created a new springboot project using appsody as follows.
appsody repo add kabanero https://github.com/kabanero-io/kabanero-stack-hub/releases/download/0.6.5/kabanero-stack-hub-index.yaml
appsody init kabanero/java-spring-boot2
And then we defined the necessary code for the application on top on this template.
- Clone inventory repository:
git clone https://github.com/ibm-garage-ref-storefront/catalog-ms-spring.git
cd catalog-ms-spring
Run the below command to get Elasticsearch running via a Docker container.
# Start an Elasticsearch Container
docker run --name catalogelasticsearch \
-e "discovery.type=single-node" \
-p 9200:9200 \
-p 9300:9300 \
-d docker.elastic.co/elasticsearch/elasticsearch:6.3.2
If it is successfully deployed, you will see something like below.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0653c983fc6b docker.elastic.co/elasticsearch/elasticsearch:6.3.2 "/usr/local/bin/dock…" 21 seconds ago Up 18 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp
- To test the unit test cases for the catalog application, run the below command.
appsody test --docker-options "-e ELASTIC_CLUSTER_NAME=docker-cluster -e ELASTIC_NODE_URL=host.docker.internal:9300 -e INVENTORY_URL=http://docker.for.mac.localhost:8081/micro/inventory"
- To run the catalog application, run the below command.
appsody run --docker-options "-e ELASTIC_CLUSTER_NAME=docker-cluster -e ELASTIC_NODE_URL=host.docker.internal:9300 -e INVENTORY_URL=http://docker.for.mac.localhost:8081/micro/inventory"
- If it is successfully running, you will see something like below.
[Container] 2020-04-29 12:07:08.326 INFO 178 --- [ restartedMain] d.s.w.p.DocumentationPluginsBootstrapper : Context refreshed
[Container] 2020-04-29 12:07:08.379 INFO 178 --- [ restartedMain] d.s.w.p.DocumentationPluginsBootstrapper : Found 1 custom documentation plugin(s)
[Container] 2020-04-29 12:07:08.424 INFO 178 --- [ restartedMain] s.d.s.w.s.ApiListingReferenceScanner : Scanning for api listing references
[Container] 2020-04-29 12:07:08.704 INFO 178 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '/micro'
[Container] 2020-04-29 12:07:08.712 INFO 178 --- [ restartedMain] application.Main : Started Main in 14.364 seconds (JVM running for 17.025)
[Container] 2020-04-29 12:07:08.737 INFO 178 --- [ restartedMain] application.Main : Starting Inventory Refresh background task ...
[Container] 2020-04-29 12:07:09.185 INFO 178 --- [cTaskExecutor-1] a.catalog.InventoryRefreshTask : Loaded in to the cache
- You can also verify it as follows.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d829322e2a00 kabanero/java-spring-boot2:0.3 "/.appsody/appsody-c…" 2 minutes ago Up 2 minutes 0.0.0.0:5005->5005/tcp, 0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:35729->35729/tcp catalog-ms-spring
f192bd40fbbf dev.local/inventory-ms-spring "/start.sh" 20 hours ago Up 20 hours 8443/tcp, 0.0.0.0:8081->8080/tcp inventory
0653c983fc6b docker.elastic.co/elasticsearch/elasticsearch:6.3.2 "/usr/local/bin/dock…" 21 hours ago Up 21 hours 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp catalogelasticsearch
efed65e2ba5a mysql:5.7.14 "docker-entrypoint.s…" 2 days ago Up 2 days 0.0.0.0:3300->3306/tcp inventorymysql
Now, you can validate the application as follows.
-
Try to hit http://localhost:8080/micro/items/ and you should be able to see a list of items.
-
You can also do it using the below command.
curl http://localhost:8080/micro/items/
- Also you can access the swagger ui at http://localhost:8080/micro/swagger-ui.html
- We also enabled sonarqube as part of the application.
To run the sonarqube as a docker container, run the below command.
docker run -d --name sonarqube -p 9000:9000 sonarqube
To test the application, run the below command.
./mvnw sonar:sonar -Dsonar.login=admin -Dsonar.password=admin
Now, access http://localhost:9000/
, login using the credentials admin/admin
, and then you will see something like below.
- We included contract testing as part of our application too.
To run Pact as a docker container, run the below command.
cd pact_docker/
docker-compose up -d
To publish the pacts to pacts broker, run the below command.
./mvnw clean install pact:publish -Dpact.broker.url=http://localhost:8500 -Ppact-consumer
To verify the results, run the below command.
./mvnw test -Dpact.verifier.publishResults='true' -Dpactbroker.host=localhost -Dpactbroker.port=8500 -Ppact-producer
Now you can access the pact broker to see if the tests are successful at http://localhost:8500/.
To exit the application, just press Ctrl+C
.
It shows you something like below.
^CRunning command: docker stop catalog-ms-spring
[Container] [INFO] ------------------------------------------------------------------------
[Container] [INFO] BUILD SUCCESS
[Container] [INFO] ------------------------------------------------------------------------
[Container] [INFO] Total time: 10:01 min
[Container] [INFO] Finished at: 2020-04-29T12:16:34Z
[Container] [INFO] ------------------------------------------------------------------------
Closing down development environment.
You have successfully deployed and tested the Catalog Microservice and an Elasticsearch database in local Docker Containers using Appsody.
To see the Catalog application working in a more complex microservices use case, checkout our Microservice Reference Architecture Application here.