/reactive-ms-example

An educational project to learn reactive programming with Spring 5

Primary LanguageJavaMIT LicenseMIT

Reactive Micro Services Example

License: MIT Build Status codecov codebeat badge

info

This is an example of doing reactive MicroServices using spring 5 functional web framework and spring boot 2.

There is a Kotlin fork of this service.

This service provide and API that will get the geo location and the sunrise and sunset times from an address.

Scenario: Get Location
  Given I've an address
  When I call the location service
  Then I should get a geo location
  And I should get the sunrise and sunset times

To implement this example we consume a couple of REST APIs.

This example cover several topics:

  • Functional programing.
  • Reactive types.
  • Router Functions.
  • Static Web-Content.
  • Creation on Reactive Java Services/Components.
  • Error handling in routes and services.
  • Reactive Web Client to consume external REST Services.
  • Organizing your project in manageable packaging.

Includes and in depth look to testing using JUnit5:

  • Unit, Integration and System tests.
  • Mocking, including reactive functions and JSON responses.
  • BDD style assertions.
  • Test tags with maven profiles.

usage

To run this service:

$ mvnw spring-boot:run

Sample requests

Get from address

$ curl -X GET "http://localhost:8080/api/location/Trafalgar%20Square%2C%20London%2C%20England" -H  "accept: application/json"

Post from JSON

$ curl -X POST "http://localhost:8080/api/location" -H  "accept: application/json" -H  "content-type: application/json" -d "{  \"address\": \"Trafalgar Square, London, England\"}"

Both will produce something like:

{
  "geographicCoordinates": {
    "latitude": 51.508039,
    "longitude": -0.128069
  },
  "sunriseSunset": {
    "sunrise": "2017-05-21T03:59:08+00:00",
    "sunset": "2017-05-21T19:55:11+00:00"
  }
}

All date and times are ISO 8601 UTC without summer time adjustment

API

View in the embedded Swagger UI View in the embedded Swagger UI

Run in Postman Run in Postman

Project Structure

References