KotlinReactiveMS icon indicating copy to clipboard operation
KotlinReactiveMS copied to clipboard

An educational project to learn reactive programming with Spring 5 and Kotlin

Kotlin Reactive Micro Services Example

License: MIT Build Status codecov codebeat badge

IntelliJ code coverage runner gives a 100%, unfortunately I've not managed to get the same results using codecov.io and JaCoCo

info

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

This is a fork of the original java version.

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.

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

  • main/kotlin
    • /application : Main Spring boot application and context configuration.
    • /extensions : Custom kotlin extensions and high level functions.
    • /routers : Reactive routing functions.
    • /handlers : Handlers used by the routers.
    • /services : Services for the business logic needed by handlers.
    • /exceptions : Businesses exceptions.
    • /model : Data classes.
  • test/kotlin
    • /application : Application system and unit tests.
    • /extensions : Extensions unit tests.
    • /routers : Integration tests for routes.
    • /handlers : Unit tests for handlers.
    • /services : Unit tests for services.
    • /test : Helpers and base classes for testing.

References

  • https://github.com/LearningByExample/reactive-ms-example
  • https://github.com/aesteve/todobackend-springboot2