Le projet est "configuration driven", tout part de la définition des services et des actions, aussi appelés "microservices".
L'architecture de type "hexagonale", ou port/adapter, se base sur :
Moleculer, brique de base, qui est un framework orienté microservices, avec du service discovery, du load balancing applicatif, voir même du circuit breaker, des métriques automatiques, etc.
HapiJS, pour le gateway, son orientation configuration driven et son orientation API en font un atout de choc sur ce type de projet.
Apollo Server, vient finir la dernière brique de cette architecture.
Dans le projet, le serveur graphql et moleculer sont ensemble ; Il est bien entendu préconisé d'avoir les services moleculer dans une infrastructure scalable d'un coté et le serveur graphql d'un autre.
Installation des dépendances :
yarn
Le dossier infrastructure contient un Bootstrap prod ready ; En développement on utilisera docker swarm comme orchestrateur.
En premier lieu, assurez vous d'avoir docker swarm de disponible en mode master
docker swarm init
Une fois cela vérifié, lancez la stack en local en effectuant :
yarn bootstrap:start
Pour stopper la stack en local, une fois la review effectuée, faire :
yarn bootstrap:stop
Mais revenons à l'installation, il faut attendre que tout soit bien démarré, puis quand cela est fait, passez à la migration des data :
yarn knex:all
Le résultat du coverage sera dans le dossier coverage
yarn test
Il est temps de lancer le projet :
yarn start
A ce stade, deux servers http sont disponibles :
- graphql: http://localhost:3000/graphql
- hapijs : http://localhost:7000/documentation
Comme vous le voyez, une auto-documentation est générée par la configuration, voir swagger pour plus d'information.
Un service important ici est le services/Metrics.js, comme on peut le voir nous pouvons brancher des exporters vers logstash (pour kibana), où même des évènements.
On peut également étendre l'architecture pour faire un véritable CQRS / Eventsourcing assez facilement.
La dockerisation est quant à elle facile, pas besoin de montrer quelque chose dessus.