⭐ Microservices-applicatie Formule 1

Opdracht

Frontend Formula 1: Grand Prix page Frontend Formula 1: Drivers page Frontend Formula 1: GP form

In het vak Advanced Programming Topics hebben we geleerd over de microservices-architectuur. We kregen daarom ook de opdracht om een applicatie te maken gebruikmakend van deze architectuur. Ik heb voor dit project gekozen voor een Formule 1-applicatie, die informatie over chauffeurs, teams, circuits en Grand Prix bijhoudt.

Microservices

Diagram architectuur

In mijn microservices-architectuur communiceren alle services met elkaar binnen een kubernetes-netwerk. Elke service heeft zijn eigen database. Enkel de frontend en de api-gateway zijn blootgesteld voor externe gebruikers.

Hiernaast maakt mijn applicatie ook gebruik van Google OAuth2 voor authenticatie.

Toen ik het project startte ben ik begonnen met alles in Docker te maken. Later besloot ik om het ook in kubernetes te maken, dus heb ik mijn docker-compose.yaml-bestand omgevormd naar configuratiebestanden voor kubernetes. Deze heb ik lokaal dan getest met Minikube.

Services

De applicatie die ik heb gebouwd bestaat uit 7 verschillende projecten waaronder 5 services, 1 api-gateway en 1 react-project.

De services:

  • circuit-service
  • driver-service
  • gp-service
  • team-service
  • image-service (uploaden en hosten van foto’s, zoals S3)

Zowel de services als de api-gateway maken gebruik van Spring Boot.

Binnen het netwerk, kunnen deze services data van elkaar gebruiken door api-requests te maken. Alle objecten worden geïdentificeerd met een unieke UUID, in plaats van een database id, omdat elke service zijn eigen database gebruikt.

Hiernaast heb ik voor alle service-klassen binnen de verschillende projecten voor alle functies unittests geschreven. Hierbij heb ik gebruik gemaakt van mock data voor het nabootsen van antwoorden van de overige services.

Frontend

Frontend Fromula 1

De frontend heb ik gebouwd in React, met behulp van Shadcn/ui en TailwindCSS. Alle formulieren worden gevalideerd met zod. Ik heb hier ook Google-login geïmplementeerd. Alle admin-pagina’s zijn daarom ook beveiligd met deze login.

Extra functies

Naast alle bovenstaande functies, heb ik ook nog wat extra’s toegevoegd. Zoals erg uitgebreide monitoring functionaliteit met behulp van:

Enkel de grafana-pod is blootgesteld aan het internet, de rest van de pods zijn enkel binnen het kubernetes-netwerk bereikbaar.

Nog een extraatje dat ik heb geïmplementeerd is rate limiting op de api-gateway. Deze limit op het ip-adres van de gebruiker en maakt gebruik van een Redis KV-database.

Besluit

Ik vond dit een erg fijn project om aan te werken, omdat het een combinatie van hosting/infrastructuur en applicatieontwikkeling bevat. Beide zaken vind ik interessant en doe ik graag.

Het was ook al even geleden, sinds ik een kubernetes-cluster opgezet had en het was daarom een goede opfrisser van deze vaardigheden.

Ik ben daarom ook erg blij met het resultaat, en ik was niet de enige, want ik kreeg van de leraar een 20/20 voor deze opdracht!