Opdracht
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
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, zoalsS3
)
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
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!