-
Notifications
You must be signed in to change notification settings - Fork 0
TP010
PasRP-Theo edited this page Jun 10, 2025
·
1 revision

TP09-10/
│
├── services/
│ ├── api_misc/
│ ├── api_orders/
│ ├── api_products/
│ ├── database/
│ ├── front/
│ ├── reverse-proxy/
│ ├── build_push.sh
│ └── docker-compose.yml
└── libs/
└── ...
Dockerfile api_miscDockerfile api_ordersDockerfile api_products
api_misc:
image: pasrptheoo/woody_api_misc
restart: always
networks:
woody_net:
aliases:
- api_misc
deploy:
replicas: 1
api_orders:
image: pasrptheoo/woody_api_orders
restart: always
networks:
woody_net:
aliases:
- api_orders
deploy:
replicas: 1
api_products:
image: pasrptheoo/woody_api_products
restart: always
networks:
woody_net:
aliases:
- api_products
deploy:
replicas: 1La configuration Nginx a été modifiée pour router les requêtes vers les micro-services appropriés selon leur URL :
server {
listen 8080;
location /api/misc {
proxy_pass http://api_misc:5000/;
}
location /api/orders {
proxy_pass http://api_orders:5000/;
}
location /api/products {
proxy_pass http://api_products:5000/;
}
location /api/ {
proxy_pass http://api_misc:5000/;
}
location / {
proxy_pass http://front:80;
# Limitation pour simuler un trafic élevé
limit_rate 300k;
}
}Au lieu de RabbitMQ, l'équipe a opté pour Redis en mode Pub/Sub pour gérer le traitement asynchrone des commandes longues.
-
Qui émet : Service
api_orders - Quand : Dès qu'une commande est créée
-
Canal :
orders -
Contenu : JSON avec
order_idet nom du produit
-
Qui reçoit : Service
api_products - Comment : Thread d'écoute en arrière-plan
- Action : Validation coûteuse puis sauvegarde
redis:
image: redis:latest
networks:
woody_net:
aliases:
- redis
deploy:
replicas: 3# Avant (synchrone)
- process_order(order_id, product)
# Après (asynchrone)
+ r.publish("orders", json.dumps({
+ "order_id": order_id,
+ "order": product
+ }))def listen_for_orders():
pubsub = redis_client.pubsub()
pubsub.subscribe('orders')
for msg in pubsub.listen():
if msg['type'] == 'message':
data = json.loads(msg['data'])
process_order(data["order_id"], data["order"])La protection est assurée par rate limiting au niveau Nginx :
limit_req_zone $binary_remote_addr zone=gateway:1m rate=5r/s;
limit_req zone=gateway;
limit_req_status 429;- Limite : 5 requêtes par seconde par adresse IP
- Action : Code 429 (Too Many Requests) en cas de dépassement
- Objectif : Préserver la disponibilité contre les pics de trafic et attaques DDoS
for i in {1..10}; do
curl -s -o /dev/null -w "%{http_code}\n" -L http://localhost:8080/api/ping
sleep 0.2
doneRésultat : Toutes les requêtes passent (200)
200
200
200
200
200
200
200
200
200
200
for i in {1..10}; do
curl -s -o /dev/null -w "%{http_code}\n" -L http://localhost:8080/api/ping
sleep 0.1
doneRésultat : Alternance entre succès et rate limiting
200
429
200
429
200
429
200
429
200
429