API Gateway pour les services Kotlin : quand une seule entrée vaut mieux que mille
Imaginez que votre zoo de microservices en Kotlin ait atteint plus de 20 services. Chacun d'eux se connecte au monde via son propre port, nécessite sa propre authentification et gère les erreurs à sa manière. Les clients se perdent dans les points de terminaison, et chaque nuit vous priez pour qu'un service supplémentaire ne tombe pas et n'enterre pas toute l'application avec lui. Cela vous semble familier ?
Il existe une solution — API Gateway. C'est un point d'entrée unique qui prend en charge le routage, la sécurité, la mise en cache et la surveillance. Aujourd'hui, nous allons voir comment construire une telle passerelle en Kotlin, en utilisant deux approches populaires : le léger Ktor et l'industriel Spring Cloud Gateway. Pas de blabla — seulement du code et de la pratique.
Qu'est-ce qu'un API Gateway et pourquoi en avez-vous besoin ?
API Gateway (passerelle API) est une couche intermédiaire entre les clients et vos microservices. Au lieu que chaque frontend ou application externe connaisse les adresses de tous vos services, ils communiquent uniquement avec la passerelle. C'est elle qui décide où diriger la requête.
Fonctions principales de la passerelle :
- Routage — dirige les requêtes vers les services appropriés en fonction de l'URL ou des en-têtes.
- Authentification et autorisation — vérifie les jetons avant que la requête n'atteigne la logique métier.
- Équilibrage de charge — répartit les requêtes entre les instances d'un même service.
- Mise en cache — stocke les réponses pour les données fréquemment demandées.
- Surveillance et journalisation — collecte les métriques de toutes les requêtes en un seul endroit.
- Rate limiting — protège contre les DDoS et les surcharges.
Si vous codez en Kotlin et utilisez une architecture microservices, l'API Gateway est un must-have, pas une option. Sans lui, vous risquez le chaos avec des points de terminaison dispersés et des problèmes de sécurité.
Approche 1 : API Gateway avec Ktor — légèreté et flexibilité
Ktor est un framework de JetBrains, spécialement conçu pour Kotlin. Il est asynchrone, léger et parfait pour écrire des passerelles quand on ne veut pas traîner un lourd Spring Boot.
Écrivons un API Gateway simple avec Ktor qui route les requêtes vers deux services : user-service (utilisateurs) et order-service (commandes).
Étape 1 : Configuration du projet
Créez un nouveau projet Ktor via start.ktor.io ou ajoutez les dépendances manuellement dans build.gradle.kts :
dependencies { implementation("io.ktor:ktor-server-core:2.3.7") implementation("io.ktor:ktor-server-netty:2.3.7") implementation("io.ktor:ktor-client-core:2.3.7") implementation("io.ktor:ktor-client-cio:2.3.7") implementation("io.ktor:ktor-server-auth:2.3.7") implementation("io.ktor:ktor-server-content-negotiation:2.3.7") implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7") implementation("ch.qos.logback:logback-classic:1.4.14")}Étape 2 : Routage de base avec proxy
Créons le fichier principal Application.kt :
import io.ktor.client.*import io.ktor.client.request.*import io.ktor.client.statement.*import io.ktor.http.*import io.ktor.server.application.*import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.response.*import io.ktor.server.routing.*
fun main() { embeddedServer(Netty, port = 8080) { module() }.start(wait = true)}
fun Application.module() { val httpClient = HttpClient()
routing { // Proxy pour user-service route("/api/users") { handle { val response = httpClient.get("http://localhost:8081${call.request.uri}") call.respondText( text