0% ont trouvé ce document utile (0 vote)
24 vues10 pages

Activite 13 Synthese

Le document présente un projet de modernisation du système de gestion des projections et des réservations de MEGARAM CASA en utilisant une architecture microservices avec RabbitMQ pour la communication asynchrone. Il décrit les différents microservices (Films, Projections, Réservations) et l'API Gateway, ainsi que les étapes de développement et de déploiement. L'objectif est d'améliorer la scalabilité, la maintenabilité et la résilience du système tout en garantissant la fiabilité des échanges de données.

Transféré par

Houda Mansouri
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
24 vues10 pages

Activite 13 Synthese

Le document présente un projet de modernisation du système de gestion des projections et des réservations de MEGARAM CASA en utilisant une architecture microservices avec RabbitMQ pour la communication asynchrone. Il décrit les différents microservices (Films, Projections, Réservations) et l'API Gateway, ainsi que les étapes de développement et de déploiement. L'objectif est d'améliorer la scalabilité, la maintenabilité et la résilience du système tout en garantissant la fiabilité des échanges de données.

Transféré par

Houda Mansouri
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Objectifs pédagogiques Opérationnelles

Concevoir et mettre en œuvre une architecture RabbitMQ adaptée


aux workflows de production médiatique, intégrant les échanges
EFP : ISTA OUARZAZTE entre une chaîne de télévision (comme ARTE) et ses boîtes de
production partenaires, tout en garantissant la fiabilité, la traçabilité
et l'évolutivité des flux de données.
Activité N° : 14
Année : 2024-2025 Objectifs pédagogiques intermédiaires
Filière : Développement Digital (Option : Web FullStack) OPI 1.1 : Expliquer le rôle de RabbitMQ dans un
écosystème média distribué
Module 206 : Création application Cloud OPI 1.2 : Identifier les différences entre les types
d'exchanges (direct, fanout, topic, headers)
Chapitre II : OPI 1.3 : Décrire le cycle de vie d'un message dans le
contexte ARTE
Mise en palce de RabbitMQ

I. Contexte

MEGARAM CASA est une société de projection de films qui souhaite moderniser son système de
gestion des projections et des réservations. Actuellement, leur processus est manuel et centralisé, ce
qui entraîne des goulots d'étranglement et des difficultés à gérer les mises à jour en temps réel.

L'objectif de ce projet est de découper leur application monolithique en microservices indépendants,


améliorant ainsi la scalabilité, la maintenabilité et la résilience du système.

II. Problématique
1. Gestion centralisée inefficace :

o Toutes les fonctionnalités (ajout de films, planning, réservations) sont couplées dans une seule
application, ce qui rend les mises à jour complexes.
o Un seul point de défaillance peut impacter tout le système.
2. Besoin de communication asynchrone :

o Lorsqu'un nouveau film est ajouté, le service des projections et celui des réservations doivent
être notifiés sans créer de dépendances directes.
3. Technologies hétérogènes :

o L’équipe souhaite utiliser [Link]/Express pour les services critiques (films et projections)
et PHP pour le frontend des réservations (pour des raisons de compatibilité avec leur
système existant).

Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
Solution Proposée : Architecture Microservices

Le projet sera divisé en 3 microservices principaux, communiquant via une API


Gateway et RabbitMQ pour la messagerie asynchrone :

1. 🎬 Microservice Films (Producer - [Link]/Express)

o Ajout de films (ID, titre, durée, lien de téléchargement, date de projection).


o Publication des films dans une queue RabbitMQ pour une diffusion asynchrone.
2. 📅 Microservice Projections (Consumer - [Link]/Express)

o Consommation des films depuis RabbitMQ.


o Affichage de la liste des films disponibles.
o Génération d’un planning hebdomadaire basé sur les dates de projection.
3. 🎟 Microservice Réservations (PHP)

o Permet aux utilisateurs de réserver une place pour un film.


o Communique avec le service Projections pour vérifier les disponibilités.
4. 🚪 API Gateway ([Link]/Express)

o Point d’entrée unique pour les clients (applications web/mobile).


o Achemine les requêtes vers le bon microservice.

III. Architecture Proposée


Client → API Gateway → [
Microservice Films ([Link]/Express) - Producer RabbitMQ,
Microservice Projections ([Link]/Express) - Consumer RabbitMQ,
Microservice Réservations (PHP)
]

1. Microservice Films (Producer)


Technologie: [Link]/Express + RabbitMQ

Fonctionnalités:

 Ajout de films avec les champs: id_film, titre, durée, lienTelechargement, date_projection
 Publication des films dans une queue RabbitMQ

Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
Étapes de développement:

1. Initialisation du projet:

mkdir microservice-films
cd microservice-films
npm init -y
npm install express amqplib body-parser cors
2. Structure du projet:

microservice-films/
├── src/
│ ├── controllers/
│ │ └── [Link]
│ ├── models/
│ │ └── [Link]
│ ├── rabbitmq/
│ │ └── [Link]
│ └── [Link]
├── .env
└── [Link]
3. Code principal ([Link]):

const express = require('express');


const bodyParser = require('body-parser');
const cors = require('cors');
const filmRoutes = require('./routes/filmRoutes');
const { initRabbitMQ } = require('./rabbitmq/producer');

const app = express();


[Link](cors());
[Link]([Link]());

// Connexion RabbitMQ
initRabbitMQ().then(() => {
[Link]('RabbitMQ Producer connecté');
}).catch([Link]);

// Routes
[Link]('/api/films', filmRoutes);

const PORT = [Link] || 3001;


[Link](PORT, () => {
[Link](`Microservice Films en écoute sur le port ${PORT}`);
});

4. Producer RabbitMQ ([Link]):

Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
const amqp = require('amqplib');

let channel;

async function initRabbitMQ() {


const connection = await [Link]('amqp://localhost');
channel = await [Link]();
await [Link]('films_queue', { durable: true });
}

async function publishFilm(film) {


if (!channel) await initRabbitMQ();
[Link]('films_queue', [Link]([Link](film)), {
persistent: true
};
}

[Link] = { initRabbitMQ, publishFilm };

5. Controller ([Link]):

const { publishFilm } = require('../rabbitmq/producer');

[Link] = async (req, res) => {


try {
const { id_film, titre, durée, lienTelechargement, date_projection
} = [Link];

const newFilm = {
id_film,
titre,
durée,
lienTelechargement,
date_projection: new Date(date_projection)
};

await publishFilm(newFilm);

[Link](201).json({
message: "Film ajouté et publié dans la queue",
film: newFilm
});
} catch (error) {
[Link](500).json({ error: [Link] });
}
};

Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
2. Microservice Projections (Consumer)
Technologie: [Link]/Express + RabbitMQ

Fonctionnalités:

 Consommation des films depuis RabbitMQ


 Affichage des films disponibles
 Génération d'un planning hebdomadaire basé sur date_projection

Étapes de développement:

1. Initialisation:

mkdir microservice-projections
cd microservice-projections
npm init -y
npm install express amqplib cors
2. Structure:

microservice-projections/
├── src/
│ ├── controllers/
│ │ └── [Link]
│ ├── rabbitmq/
│ │ └── [Link]
│ ├── services/
│ │ └── [Link]
│ └── [Link]
└── [Link]
3. Consumer RabbitMQ ([Link]):

const amqp = require('amqplib');


let films = [];

async function startConsumer() {


const connection = await [Link]('amqp://localhost');
const channel = await [Link]();

await [Link]('films_queue', { durable: true });

[Link]('films_queue', (msg) => {


if (msg !== null) {
const film = [Link]([Link]());
[Link](film);
[Link](msg);
}
});
}

Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
function getFilms() {
return films;
}

function getWeeklyPlanning() {
const now = new Date();
const nextWeek = new Date([Link]() + 7 * 24 * 60 * 60 * 1000);

return [Link](film => {


const projectionDate = new Date(film.date_projection);
return projectionDate >= now && projectionDate <= nextWeek;
}).sort((a, b) => new Date(a.date_projection) - new Date(b.date_project
ion));
}

[Link] = { startConsumer, getFilms, getWeeklyPlanning };

4. Controller ([Link]):

const { getFilms, getWeeklyPlanning } = require('../rabbitmq/consume


r');

[Link] = (req, res) => {


try {
const films = getFilms();
[Link](200).json(films);
} catch (error) {
[Link](500).json({ error: [Link] });
}
};

[Link] = (req, res) => {


try {
const planning = getWeeklyPlanning();
[Link](200).json(planning);
} catch (error) {
[Link](500).json({ error: [Link] });
}
};

Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
3. Microservice Réservations (PHP)
Technologie: PHP (Slim Framework ou Laravel)

Fonctionnalités:

 Réservation de places pour les films


 Gestion des utilisateurs

Étapes de développement:

1. Initialisation (avec Composer):

mkdir microservice-reservations
cd microservice-reservations
composer init
composer require slim/slim slim/psr7
2. Structure:

microservice-reservations/
├── src/
│ ├── controllers/
│ │ └── [Link]
│ ├── models/
│ │ └── [Link]
│ └── public/
│ └── [Link]
├── vendor/
└── [Link]
3. Endpoint de réservation ([Link]):

<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;

require __DIR__ . '/../vendor/[Link]';

$app = AppFactory::create();

// Route pour créer une réservation


$app->post('/api/reservations', function (Request $request, Response $response) {
$data = $request->getParsedBody();

// Validation des données


if (empty($data['id_film']) || empty($data['id_utilisateur'])) {
$response->getBody()->write(json_encode(['error' => 'Données manquantes'])
);
return $response->withStatus(400);

Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
}

// Ici, vous devriez enregistrer en base de données


// Exemple simplifié:
$reservation = [
'id' => uniqid(),
'id_film' => $data['id_film'],
'id_utilisateur' => $data['id_utilisateur'],
'date_reservation' => date('Y-m-d H:i:s')
];

$response->getBody()->write(json_encode($reservation));
return $response->withHeader('Content-Type', 'application/json')->withStatus(2
01);
});

$app->run();

4. API Gateway
Technologie: [Link]/Express

Fonctionnalités:

 Routage des requêtes vers les microservices appropriés


 Gestion centralisée des accès

Étapes de développement:

1. Initialisation:

mkdir api-gateway
cd api-gateway
npm init -y
npm install express http-proxy-middleware cors morgan
2. Configuration ([Link]):

const express = require('express');


const { createProxyMiddleware } = require('http-proxy-middleware');
const cors = require('cors');
const morgan = require('morgan');

const app = express();

[Link](cors());
[Link](morgan('combined'));

// Routes
[Link]('/films', createProxyMiddleware({
target: '[Link]

Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
changeOrigin: true
}));

[Link]('/projections', createProxyMiddleware({
target: '[Link]
changeOrigin: true
}));

[Link]('/reservations', createProxyMiddleware({
target: '[Link]
changeOrigin: true
}));

const PORT = [Link] || 3000;


[Link](PORT, () => {
[Link](`API Gateway en écoute sur le port ${PORT}`);
});

Déploiement et Test
1. Lancer RabbitMQ:

docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

2. Lancer les microservices dans des terminaux séparés:

# Microservice Films
cd microservice-films
node src/[Link]

# Microservice Projections
cd microservice-projections
node src/[Link]

# Microservice Réservations (PHP)


cd microservice-reservations
php -S localhost:3003 -t src/public/

# API Gateway
cd api-gateway
node [Link]

3. Tests avec cURL:

Ajouter un film:

curl -X POST [Link] \


-H "Content-Type: application/json" \
-d '{
"id_film": "film001",
"titre": "Inception",
"durée": "148",
"lienTelechargement": "[Link]

Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud
"date_projection": "2023-12-15T[Link]"
}'

Voir les projections:

curl [Link]

Faire une réservation:

curl -X POST [Link] \


-H "Content-Type: application/json" \
-d '{
"id_film": "film001",
"id_utilisateur": "user123"
}'

Formateur : Said GAHI ISTA OUARZAZATE Module 206 : Création d’une application Cloud

Vous aimerez peut-être aussi