Guide : Architecture Microservices avec Spring Boot


Table des matières

  1. Introduction aux Microservices
  2. Architecture du Projet
  3. Outils et Technologies
  4. Microservice 1 : msProduct

1. Introduction aux Microservices

Qu’est-ce qu’un microservice ?

Comparaison : Monolithe vs Microservices

Application Monolithe


2. Architecture du Projet (exemple)

Vue d’ensemble

Scénario d’utilisation


3. Outils et Technologies

Technologies utilisées

Architecture en couches (Pattern classique)


4. Microservice 1 : msProduct

Rôle

📁 Structure du projet


msProduct/
├── pom.xml                           (Dépendances Maven)
└── src/main/
    ├── java/com/commerce/msproduct/
    │   ├── MsProductApplication.java (Classe principale)
    │   ├── entities/
    │   │   ├── Product.java          (Table en BDD)
    │   │   └── Category.java         (Enum)
    │   ├── dto/
    │   │   ├── ProductReqDto.java    (Requête entrante)
    │   │   └── ProductResDto.java    (Réponse sortante)
    │   ├── mappers/
    │   │   └── ProductMapper.java    (Conversion Entity↔DTO)
    │   ├── repositories/
    │   │   └── ProductRepo.java      (Accès BDD)
    │   ├── services/
    │   │   ├── ProductService.java   (Interface)
    │   │   └── ProductServiceImp.java(Implémentation)
    │   └── web/
    │       └── ProductController.java(API REST)
    └── resources/
        └── application.properties    (Configuration)

Étape par étape : Création de msProduct

ÉTAPE 1 : Créer le projet avec Spring Initializr

ÉTAPE 2 : Configuration (application.properties)


spring.application.name=msProduct
server.port=8080

# Configuration MySQL
spring.datasource.url=jdbc:mysql://localhost:3306/productdb
spring.datasource.username=root
spring.datasource.password=

# JPA/Hibernate
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

ÉTAPE 3 : Créer l’Entity Product


@Entity  // ← Indique que c'est une table en BDD
@Data    // ← Lombok : génère getters/setters automatiquement
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Product {
    @Id  // ← Clé primaire
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // ← Auto-increment
    private Long id;

    private String productName;
    private Category category;
    private double price;
}

ÉTAPE 4 : Créer les DTOs


@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ProductReqDto {
    // Pas d'ID : il sera généré automatiquement
    private String productName;
    private Category category;
    private double price;
}

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ProductResDto {
    private Long id;  // ← Avec l'ID cette fois
    private String productName;
    private Category category;
    private double price;
}

ÉTAPE 5 : Créer le Mapper (MapStruct)


@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface ProductMapper {
    ProductResDto todto(Product product);     // Entity → DTO
    Product toEntity(ProductReqDto dto);      // DTO → Entity
}

ÉTAPE 6 : Créer le Repository


public interface ProductRepo extends JpaRepository<Product, Long> {
    // JpaRepository fournit déjà findById, save, findAll, etc.
    // Pas besoin d'écrire de code !
}

ÉTAPE 7 : Créer le Service

public interface ProductService {
  ProductResDto getProductById(Long id);
  ProductResDto addProduct(ProductReqDto product);
}
package com.example.demo.service.impl;

import com.example.demo.dto.ProductReqDto;
import com.example.demo.dto.ProductResDto;
import com.example.demo.entity.Product;
import com.example.demo.exception.EntityNotFoundException;
import com.example.demo.mapper.ProductMapper;
import com.example.demo.repository.ProductRepo;
import com.example.demo.service.ProductService;
import org.springframework.stereotype.Service;

import java.util.Optional;

@Service
public class ProductServiceImp implements ProductService {

    private final ProductRepo productRepo;
    private final ProductMapper mapper;

    //Injection de dépendances par constructeur (Spring Boot la gère automatiquement)
    public ProductServiceImp(ProductRepo productRepo, ProductMapper mapper) {
        this.productRepo = productRepo;
        this.mapper = mapper;
    }

    @Override
    public ProductResDto getProductById(Long id) {
        //Recherche du produit dans la base de données
        Optional<Product> productOptional = productRepo.findById(id);

        //Vérification si trouvé
        Product product = productOptional.orElseThrow(
                () -> new EntityNotFoundException("Product not found")
        );

        //Conversion Entity → DTO et retour
        return mapper.toDto(product);
    }

    @Override
    public ProductResDto addProduct(ProductReqDto productReqDto) {
        // 1️⃣ Conversion DTO → Entity
        Product product = mapper.toEntity(productReqDto);

        // 2️⃣ Sauvegarde en base de données
        Product savedProduct = productRepo.save(product);

        // 3️⃣ Conversion Entity → DTO et retour
        return mapper.toDto(savedProduct);
    }
}

ÉTAPE 8 : Créer le Controller


@RestController
@RequestMapping("/api/product")
public class ProductController {

    private final ProductService productService;

    public ProductController(ProductService productService) {
        this.productService = productService;
    }

    // GET /api/product/1
    @GetMapping("/{id}")
    public ProductResDto getProduct(@PathVariable Long id) {
        return productService.getProductById(id);
    }

    // POST /api/product/add
    @PostMapping("/add")
    public ProductResDto addProduct(@RequestBody ProductReqDto productReqDto) {
        return productService.addProduct(productReqDto);
    }
}

ÉTAPE 9 : Créer la base de données


CREATE DATABASE productdb;

ÉTAPE 10 : Lancer et tester


POST http://localhost:8080/api/product/add
Content-Type: application/json

{
  "productName": "Laptop Dell",
  "category": "ELECTRONICS",
  "price": 999.99
}

GET http://localhost:8080/api/product/1

5. Microservice 2 : msAchat