-
Notifications
You must be signed in to change notification settings - Fork 487
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Various changes including Spring Cloud upgrade and improved instructi…
…ons. Improved instructions on how to build and run the application Upgraded to latest Spring Cloud Front-end web application uses Hystrix when invoking backend service Added Eureka Server Backend service validates parameters Switched Selenium web tests to use Chrome Improved shell scripts Added end to end tests for application launched using Docker
- Loading branch information
Showing
57 changed files
with
1,266 additions
and
296 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,22 +1,171 @@ | ||
A simple example of microservices that is described in this [blog post](http://plainoldobjects.com/2014/11/16/deploying-spring-boot-based-microservices-with-docker/). | ||
A simple example of microservices that is described in this [series of blog posts](http://plainoldobjects.com/2014/11/16/deploying-spring-boot-based-microservices-with-docker/). | ||
|
||
The services are built using | ||
There are two services: | ||
* RESTful service - exposes a REST API for registering a user. | ||
It saves the user registration in MongoDB and posts a message to RabbitMQ. | ||
It is the example code for the article [Building microservices with Spring Boot - part 1](http://plainoldobjects.com/2014/04/01/building-microservices-with-spring-boot-part1/). | ||
|
||
* Web application - implements the user registration UI and invokes the RESTful service. | ||
It is the example code for the article [Building microservices with Spring Boot - part 2](https://plainoldobjects.com/2014/05/05/building-microservices-with-spring-boot-part-2/). | ||
|
||
The services are written in Scala and use the following technologies. | ||
|
||
* Spring Boot | ||
* Spring Cloud | ||
* Netflix OSS Eureka | ||
* RabbitMQ | ||
|
||
There is also a [microservices example that uses event sourcing](https://github.com/cer/event-sourcing-examples). | ||
Note: There are [other example microservice applications](http://eventuate.io/exampleapps.html). | ||
|
||
# Building and running the microservices | ||
|
||
This project uses with [Docker Compose](https://docs.docker.com/compose/) to run the services as well as RabbitMQ and MongoDB. | ||
|
||
The `spring-boot-webapp` project uses Selenium to test the web UI using the Chrome browser. | ||
You will need to install [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/getting-started). | ||
On Mac OSX you can run `brew install chromedriver`. | ||
|
||
|
||
## The quick way | ||
|
||
The quickest way to build and run the services on Mac OSX is the script `build-test-and-run-all.sh`. | ||
|
||
Otherwise, follow these instructions. | ||
|
||
## Running MongoDB and RabbitMQ | ||
|
||
The RESTful service uses RabbitMQ and MongoDB. | ||
The easier way to run them is to using Docker: | ||
|
||
``` | ||
docker-compose up -d mongodb rabbitmq | ||
``` | ||
|
||
You also need to set some environment variables so that the services can connect to them: | ||
|
||
``` | ||
export DOCKER_HOST_IP=$(docker-machine ip default 2>/dev/null) | ||
export SPRING_DATA_MONGODB_URI=mongodb://${DOCKER_HOST_IP}/userregistration | ||
export SPRING_RABBITMQ_HOST=${DOCKER_HOST_IP} | ||
``` | ||
|
||
## Build the Eureka server | ||
|
||
This application uses Netflix OSS Eureka for service discovery. | ||
Build the Spring Cloud based Eureka server using the following commands: | ||
|
||
``` | ||
cd eureka-server | ||
./gradlew build | ||
``` | ||
|
||
## Building the RESTful service | ||
|
||
Use the following commands to build the RESTful service: | ||
|
||
``` | ||
cd spring-boot-restful-service | ||
./gradlew build | ||
``` | ||
|
||
## Running the RESTful service | ||
|
||
You can run the service by using the following command in the top-level directory: | ||
|
||
``` | ||
docker-compose up -d restfulservice | ||
``` | ||
|
||
## Using the RESTful service | ||
|
||
Once the service has started, you can send a registration request using: | ||
|
||
``` | ||
./register-user.sh | ||
``` | ||
|
||
You can examine the MongoDB database using the following commands | ||
|
||
``` | ||
$ ./mongodb-cli.sh | ||
> show dbs; | ||
local 0.031GB | ||
mydb 0.031GB | ||
userregistration 0.031GB | ||
> use userregistration; | ||
switched to db userregistration | ||
> | ||
> | ||
> show collections; | ||
registeredUser | ||
system.indexes | ||
> | ||
> | ||
> db.registeredUser.find() | ||
{ "_id" : ObjectId("55a99b0993860551c6020e9d"), "_class" : "net.chrisrichardson.microservices.restfulspringboot.backend.RegisteredUser", "emailAddress" : "[email protected]", "password" : "secret" } | ||
> exit | ||
$ | ||
``` | ||
|
||
## Building the web application | ||
|
||
Since the web application invokes the RESTful service you must set the following environment variable: | ||
|
||
``` | ||
export USER_REGISTRATION_URL=http://${DOCKER_HOST_IP}:8081/user | ||
``` | ||
|
||
Next, use the following commands to build the web application: | ||
|
||
``` | ||
cd spring-boot-webapp | ||
./gradlew build | ||
``` | ||
|
||
## Running the web application | ||
|
||
Run the web application using the following command in the top-level directory: | ||
|
||
``` | ||
docker-compose up -d web | ||
``` | ||
|
||
## Using the web application | ||
|
||
You can access the web application by visiting the following URL: `http://${DOCKER_HOST_IP?}:8080/register.html` | ||
|
||
There are also other URLs that you can visit: | ||
|
||
* `http://${DOCKER_HOST_IP?}:8761` - Eureka console | ||
* `http://${DOCKER_HOST_IP?}:8081/swagger-ui.html` - the Swagger UI | ||
|
||
# Building and running Docker images | ||
|
||
The previous instructions deployed the services as Docker containers without actually packaging the services as Docker images. | ||
The `docker-compose.yml` file ran the image `java:openjdk-8u91-jdk` and used volume mapping to make the Spring Boot jar files accessible. | ||
Follow these instructions to build and run the Docker images. | ||
|
||
## Building the images | ||
|
||
You can build the images by running the following command: | ||
|
||
``` | ||
./build-docker-images.sh | ||
``` | ||
|
||
This script is a simple wrapper around `docker build`. | ||
|
||
## Running the images | ||
|
||
Building and running the microservices | ||
=== | ||
You can now run the Docker images using the `docker-compose` command with `docker-compose-images.yml`: | ||
|
||
You can find instructions for building the services in the READMEs. | ||
Start by [building the RESTful backend service](spring-boot-restful-service). | ||
Once you have build the services, you can launch them by running `docker-compose up -d`. | ||
``` | ||
docker-compose -f docker-compose-images.yml up -d | ||
``` | ||
|
||
The quick version | ||
== | ||
The following command will wait until the services are available and displays the URLs: | ||
|
||
The script `build-and-test-all.sh` might work for you depending on your machine. | ||
``` | ||
./show-urls.sh | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
#! /bin/bash | ||
|
||
set -e | ||
|
||
# Build and test the services | ||
|
||
./build-test-and-run-all.sh | ||
|
||
echo ================== Test the services launched with Docker Compose | ||
|
||
./run-e2e-test.sh | ||
|
||
echo ================== Test the services packaged as Docker images | ||
|
||
./run-test-e2e-test-images.sh |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#! /bin/bash | ||
|
||
set -e | ||
|
||
(cd spring-boot-restful-service/docker ; ./build.sh) | ||
(cd spring-boot-webapp/docker ; ./build.sh) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
#! /bin/bash | ||
|
||
set -e | ||
|
||
./build-and-test-all.sh | ||
|
||
echo Launching services in Docker containers | ||
echo This can take a while | ||
|
||
docker-compose up -d | ||
|
||
./wait-for-services.sh ${DOCKER_HOST_IP?} /health 8080 8081 | ||
|
||
./show-urls.sh |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
|
||
apply plugin: 'scala' | ||
dependencies { | ||
compile "org.scala-lang:scala-library:2.10.2" | ||
|
||
testCompile "junit:junit:4.11" | ||
testCompile "org.scalatest:scalatest_2.10:2.1.0" | ||
testCompile "org.seleniumhq.selenium:selenium-java:2.45.0" | ||
} | ||
|
||
|
||
repositories { | ||
mavenCentral() | ||
} | ||
|
||
task wrapper(type: Wrapper) { | ||
gradleVersion = '2.11' | ||
} |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#Thu Mar 03 01:04:28 PST 2016 | ||
distributionBase=GRADLE_USER_HOME | ||
distributionPath=wrapper/dists | ||
zipStoreBase=GRADLE_USER_HOME | ||
zipStorePath=wrapper/dists | ||
distributionUrl=http\://services.gradle.org/distributions/gradle-2.11-all.zip |
Oops, something went wrong.