Projet illustrant une architecture e-commerce basée sur des microservices. Chaque domaine métier est exposé par une API FastAPI indépendante, tandis que Traefik joue le rôle d'API Gateway et redirige les requêtes vers le bon service.
Client
|
v
Traefik API Gateway (:8000)
|-- /api/users -> user_service (:8001)
|-- /api/products -> product_service (:8002)
|-- /api/payments -> payement_service (:8003)
`-- /api/orders -> order_service (:8004)
|
`-> product_service
| Service | Rôle | Port interne | Préfixe public |
|---|---|---|---|
api_gateway |
Routage Traefik | 8000 | / |
user_service |
Inscription et connexion | 8001 | /api/users |
product_service |
Création et consultation des produits | 8002 | /api/products |
payement_service |
Simulation des paiements | 8003 | /api/payments |
order_service |
Création des commandes | 8004 | /api/orders |
Les services communiquent sur le réseau Docker privé backend_network. Seuls l'API Gateway et le tableau de bord Traefik sont accessibles depuis la machine hôte.
- Python 3.9
- FastAPI
- Uvicorn
- Pydantic
- Traefik 3.7
- Docker et Docker Compose
- Docker
- Docker Compose v2
Vérifier leur installation :
docker --version
docker compose versionDepuis la racine du dépôt :
cd backend
docker compose up --buildUne fois les conteneurs démarrés :
- API Gateway : http://localhost:8000
- Tableau de bord Traefik : http://localhost:8080/dashboard/
- Documentation utilisateurs : http://localhost:8000/api/users/docs
- Documentation produits : http://localhost:8000/api/products/docs
- Documentation paiements : http://localhost:8000/api/payments/docs
- Documentation commandes : http://localhost:8000/api/orders/docs
Pour démarrer en arrière-plan :
docker compose up --build -dPour consulter les journaux :
docker compose logs -fPour arrêter le projet :
docker compose downcurl -X POST http://localhost:8000/api/users/signup \
-H "Content-Type: application/json" \
-d '{
"username": "eddy",
"email": "eddy@example.com",
"password": "secret"
}'curl -X POST http://localhost:8000/api/users/login \
-H "Content-Type: application/json" \
-d '{
"username": "eddy",
"email": "eddy@example.com",
"password": "secret"
}'curl -X POST http://localhost:8000/api/products/products \
-H "Content-Type: application/json" \
-d '{
"id": 1,
"name": "Clavier",
"price": 25.99,
"stock": 10
}'curl http://localhost:8000/api/products/products/1Le montant est actuellement reçu comme paramètre de requête :
curl -X POST "http://localhost:8000/api/payments/pay?amount=25.99"curl -X POST http://localhost:8000/api/orders/order \
-H "Content-Type: application/json" \
-d '{
"product_id": 1,
"quantity": 2
}'MICROSERVICES-EXO/
|-- README.md
`-- backend/
|-- docker-compose.yml
|-- user_service/
| |-- Dockerfile
| `-- main.py
|-- product_service/
| |-- Dockerfile
| `-- main.py
|-- payement_service/
| |-- Dockerfile
| `-- main.py
`-- order_service/
|-- Dockerfile
`-- main.py
Ce projet est une démonstration simple :
- les données sont stockées en mémoire et disparaissent au redémarrage des conteneurs ;
- aucune base de données n'est encore configurée ;
- l'authentification ne génère pas encore de jeton et les mots de passe ne sont pas chiffrés ;
- le paiement est simulé ;
- le service de commandes est encore en cours d'implémentation et son flux complet doit être corrigé avant une utilisation réelle ;
- aucun test automatisé n'est actuellement inclus.
- ajouter PostgreSQL ou MongoDB à chaque service qui en a besoin ;
- sécuriser l'authentification avec des mots de passe hachés et des jetons JWT ;
- finaliser la communication entre les services de commandes et de produits ;
- mettre à jour le stock après la validation d'une commande ;
- ajouter la validation et le suivi des paiements ;
- ajouter des tests unitaires et d'intégration ;
- centraliser la configuration avec des variables d'environnement.
Ce projet est fourni à des fins d'apprentissage.