Skip to content

Demo project showing various applications of Spring WebFlux & WebClient in a Microservices setup

License

Notifications You must be signed in to change notification settings

kmandalas/webclient-showcase

Repository files navigation

Java CI with Maven

webclient-showcase

This demo project aims to be an introduction to developing Reactive Microservices based on the Spring framework. For a complete guide check our related article on Dzone here: https://dzone.com/articles/spring-reactive-microservices-a-showcase

We are going to implement a simplified One Time Password (OTP) service, offering the following capabilities:

  • Generate OTP
  • Validate (use) OTP
  • Resend OTP
  • Get OTP status
  • Get all OTPs of a given number

Our application will consist of the following microservices:

  • otp-service: which will provide the functionality above by orchestrating calls to local and remote services
  • customer-service: will keep a catalogue of registered users to our service with information like: account id, MSISDN, e-mail etc.

A number of remote (external) services will be invoked. We assume that our application is authorized to use them will access them via their REST API. Of course these will be mocked for simplicity. These "3rd-party" services are:

  • number-information: takes a phone number as input and verifies that it belongs to a Telecoms operator and is currently active
  • notification-service: delivers the generated OTPs to the designated number or channel (phone, e-mail, messenger etc.)

How to run

In order to build and test the application, the prerequisites are:

  • Java 11 and above
  • Maven
  • Docker (because we use TestContainers during our Integration tests)

Then simply execute a mvn clean verify

The easiest way is to run the microservices using Docker and Docker Compose:

docker-compose up --build

When the containers are up and running, you can visit consul's UI to see the active services:

http://localhost:8500/ui/dc1/services

Below you may find curl commands for invoking the various endpoints via our API Gateway:

Generate OTP

curl --location --request POST 'localhost:8000/otp-service/v1/otp' \
--header 'Content-Type: application/json' \
--data-raw '{
    "msisdn": "00306933177321"
}'

Validate OTP

curl --location --request POST 'http://localhost:8000/otp-service/v1/otp/36/validate?pin=356775' \

Resend OTP

curl --location --request POST 'localhost:8000/otp-service/v1/otp/2?via=AUTO,EMAIL,VOICE&mail=john.doe@gmail.com' \
--header 'Content-Type: application/json' \

Get All OTPs

curl --location --request GET 'localhost:8000/otp-service/v1/otp?number=00306933177321'

OTP Status

curl --location --request GET 'localhost:8000/otp-service/v1/otp/1'

Things covered

  • WebClient simple usage
  • Parallel calls to the same endpoint
  • Parallel calls to the different endpoint
  • .zip
  • .zipWhen
  • .zipDelayError
  • .doOnNext
  • .doOnSuccess VS .doOnError
  • Chaining of calls (Sequential execution)
  • Service-to-service communication
  • Database interaction (r2dbc/postgresql)

About

Demo project showing various applications of Spring WebFlux & WebClient in a Microservices setup

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •