Formation Java / Spring Boot – Architecture asynchrone & découplage
Hier, nous avons vu JPA/Hibernate avec Spring et cette journée sera découpée en 2 parties :
À l’issue de cette journée, vous serez capable de :
synchrone
asynchrone
Aujourd’hui, après avoir abordé le JPQL pour compléter la journée d’hier, on verra ensuite comment passer du monolithe REST à une architecture orientée événements !
Lien vers le cours complet sur JPQL & Spring Data
Avec REST :
Exemple :
Un virement déclenche :
Si tout est REST en mode synchrone :
Le principe :
Un Message Broker :
Exemples :
Nous utilisons RabbitMQ.
[Votre API] --> (Exchange) --> [Queue] --> [Consumer Service]
Il est possible que nous n’utilisions pas Docker. Nous aviserons en fonction de ce qui se fait chez CA-Titres
docker run -d --hostname rabbit \ -p 5672:5672 \ -p 15672:15672 \ rabbitmq:3-management
Interface web :
http://localhost:15672
Login par défaut :
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest
Lors d’un virement :
Un service externe :
@Configuration public class RabbitConfig { @Bean public Queue virementQueue() { return new Queue("virement.queue"); } @Bean public TopicExchange exchange() { return new TopicExchange("banque.exchange"); } @Bean public Binding binding(Queue queue, TopicExchange exchange) { return BindingBuilder .bind(queue) .to(exchange) .with("virement.*"); } }
@Service public class VirementPublisher { private final RabbitTemplate rabbitTemplate; public VirementPublisher(RabbitTemplate rabbitTemplate) { this.rabbitTemplate = rabbitTemplate; } public void publierVirement(VirementEvent event) { rabbitTemplate.convertAndSend( "banque.exchange", "virement.effectue", event ); } }
public record VirementEvent( String numeroSource, String numeroCible, BigDecimal montant ) {}
@Component public class VirementListener { @RabbitListener(queues = "virement.queue") public void traiterVirement(VirementEvent event) { System.out.println("Audit virement : " + event); } }
Dans VirementService :
VirementService
@Transactional public void virer(...) { // logique métier publisher.publierVirement(event); }
Le REST retourne immédiatement, l’audit est asynchrone.
Exemples réels :
MQ permet :
Ajouter :
throw new RuntimeException("erreur test");
Observer le comportement.
NotificationListener
Vous savez maintenant :