GeoNetwork microservices is GeoNetwork ready to use in the cloud through dockerized microservices. It will work along with GeoNetwork 4 as it will only provide part of the application functionalities.
Those components are created with the following requirements:
- Java 11 JDK
- Maven 3.6.3
- Docker (optional)
- core-geonetwork:4.0.0, might need a local build, it's not available on any published maven repository?
To build the services:
NOTE: It will build all the services.
- authorizing
- gateway
- indexing
- ogc-api-records
- searching
./mvnw clean install
For a quicker build, you can skip checkstyle
, tests and docker image build with:
./mvnw clean install -Drelax -P-docker
The simple build command above created the docker images.
Now run the docker composition as follows, the first time it might need to download some additional images for the rabbitmq event broker and the postgresql config database:
NOTE: This will run the whole docker composition: the microservice architecture + all services.
docker-compose up -d
If some services fail to start and report config server error:
gateway_1 | java.lang.IllegalStateException: No instances found of configserver (config-service)
Restart docker-compose up -d
to launch again the missing services. The config server being up, they will start properly.
Once services are up and running, access GeoNetwork from http://localhost:9900/geonetwork.
Run docker-compose logs -f
to watch startup progress of all services.
Test the service using the token:
# Authenticate
USERNAME=admin
PASSWORD=admin
gn_token=$( \
curl test-client:noonewilleverguess@127.0.0.1:9900/oauth/token \
-dgrant_type=password -dscope=any \
-dusername=$USERNAME -dpassword=$PASSWORD \
| jq -r '.access_token')
# Testing the token
gn_auth_header=$(echo "Authorization: Bearer $gn_token")
curl 127.0.0.1:9900/secured -H "$gn_auth_header"
# Search service (TODO: Need to be accessible to anonymous)
curl 127.0.0.1:9900/search \
-H "Accept: application/json" \
-H "Content-type: application/json" \
-H "$gn_auth_header" \
-X POST \
-d '{"from": 0, "size": 0, "query": {"query_string": {"query": "+isTemplate:n"}}}' | jq -r '.hits.total.value'
Developments are made on https://github.com/geonetwork/geonetwork-microservices
To run one service directly without docker, use the standalone
profile.
mvn spring-boot:run -Dspring-boot.run.profiles=dev,standalone -f modules/services/indexing/
You can also run the service from the service root folder also eg modules/services/ogc-api-records
and refer to the documentation of the service
To run all services independently, start the event bus rabbitmq + support services, then start apps in order:
docker-compose up -d rabbitmq discovery config
mvn spring-boot:run -Dspring-boot.run.profiles=dev,standalone -f modules/support-services/discovery
mvn spring-boot:run -Dspring-boot.run.profiles=dev,standalone -f modules/support-services/configuring
mvn spring-boot:run -Dspring-boot.run.profiles=dev,standalone -f modules/services/indexing
mvn spring-boot:run -Dspring-boot.run.profiles=dev,standalone -f modules/services/ogc-api-records
...
To work on a microservice, start the docker containers and then run the service separetely:
SERVER_PORT=9901 mvn spring-boot:run -Dspring-boot.run.profiles=dev,standalone -f modules/services/searching
TODO
To set license header use:
./mvnw license:format
This is a feasibility exploration of moving from GeoNetwork monolithic application to a more scalable architecture. The main ideas are:
- improve discoverability & search availability by creating a dedicated search service that can be replicated
- better Search Engine Optimization by implementing an OGC API records service with a landing page builder mechanism
- be in capacity to have background tasks like harvester and indexing that do not alter performances of the main web application.