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.
To run this service:
$ mvnw spring-boot:run
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
View in the embedded Swagger UI
- main/java
- /application : Main Spring boot application and context configuration.
- /routers : Reactive routing functions.
- /handlers : Handlers used by the routers.
- /services : Services for the business logic needed by handlers.
- /exceptions : Businesses exceptions.
- /model : POJOs.
- test/java
- https://spring.io/blog/2016/09/22/new-in-spring-5-functional-web-framework
- https://spring.io/blog/2017/02/23/spring-framework-5-0-m5-update
- http://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven
- https://github.com/junit-team/junit5-samples
- https://developers.google.com/maps/documentation/geocoding/intro
- https://sunrise-sunset.org/api
- https://en.wikipedia.org/wiki/ISO_8601