Skip to content

Commit 83c637d

Browse files
authored
Merge pull request #13
improve text
2 parents ebaf0e3 + 2b8ac8c commit 83c637d

File tree

3 files changed

+43
-52
lines changed

3 files changed

+43
-52
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,4 @@ pnpm-debug.log*
2222

2323
# jetbrains setting folder
2424
.idea/
25+
DOC/.HELP.md

src/content/blog/spring-micro-services-starter.md

+35-41
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,11 @@ link: "https://github.com/coundia/spring-microservices-starter"
99

1010
# Starter Microservices Spring Cloud
1111

12-
Dans cet article, je vous présente mon projet de starter microservices basé sur l’écosystème **Spring Cloud**, incluant **Eureka**, **Cloud Config**, **Gateway**, **Axon**, **RabbitMQ**, et **PostgreSQL**. L’objectif est de fournir un exemple de configuration et d’implémentation entièrement réactive et scalable.
13-
Dans un environnement 100% réactif avec **WebFlux** et **R2DBC**(Non bloquant), les microservices communiquent entre eux de manière asynchrone,
14-
ce qui permet de gérer un grand nombre de requêtes simultanées.
12+
Cet article présente le projet `spring-microservices-starter`, un socle technique destiné à simplifier la mise en place d’architectures microservices réactives et évolutives. Ce starter repose sur l’écosystème **Spring Cloud** et intègre des composants tels que **Eureka**, **Spring Cloud Config**, **Gateway**, **Axon Framework**, **RabbitMQ**, **PostgreSQL**, et **WebFlux** avec **R2DBC** pour assurer une communication non bloquante et entièrement asynchrone.
1513

16-
Le project est modulaire et évolutif disponible dans ici :
17-
[https://github.com/coundia/spring-microservices-starter](https://github.com/coundia/spring-microservices-starter)
14+
L’objectif est de fournir un modèle de démarrage robuste pour développer des microservices modulaires, scalables, et facilement maintenables. Il s’adresse aux équipes souhaitant adopter une architecture moderne et réactive en environnement distribué.
15+
16+
Le projet est disponible sur GitHub : [https://github.com/coundia/spring-microservices-starter](https://github.com/coundia/spring-microservices-starter)
1817

1918
## Sommaire
2019
1. [Architecture Globale](#architecture-globale)
@@ -30,81 +29,77 @@ Le project est modulaire et évolutif disponible dans ici :
3029

3130
## Architecture Globale
3231

33-
Voici un aperçu de la structure du projet :
32+
L’architecture repose sur les composants suivants :
3433

3534
![architecture_system.png](assets/architecture_system.png)
3635

37-
- **Cloud Config Server (Port 8081)** : Serveur de configuration centralisé.
38-
- **Eureka (Port 8761)** : Service de découverte pour enregistrer et localiser les microservices.
39-
- **Gateway (Port 8080)** : Point d’entrée unique, qui fait du load-balancing et du routage.
40-
- **Product-Command (Port 8090)** : Microservice pour gérer les commandes (CUD) des produits.
41-
- **Product-Query (Port 8091)** : Microservice pour gérer la consultation (Read) des produits.
36+
- **Cloud Config Server (Port 8081)** : Serveur de configuration centralisé chargé de fournir les fichiers de configuration aux microservices.
37+
- **Eureka (Port 8761)** : Registre de services permettant à chaque microservice de découvrir dynamiquement les autres.
38+
- **Gateway (Port 8080)** : Point d’entrée unique permettant le routage, la sécurité, et la tolérance aux pannes.
39+
- **Product-Command (Port 8090)** : Microservice chargé des opérations de création, modification et suppression des produits.
40+
- **Product-Query (Port 8091)** : Microservice dédié à la consultation des données produits.
41+
42+
Les services sont orchestrés via **Docker** ou **Docker Compose** pour faciliter le déploiement et la gestion.
4243

43-
L’ensemble est orchestré par Docker ou Docker Compose pour une gestion simplifiée de l’infrastructure.
4444
## Architecture DDD
4545

46-
Le projet est basé sur l'architecture **DDD** (Domain Driven Design) avec les couches suivantes :
46+
Le projet adopte l’approche **Domain Driven Design (DDD)** afin de mieux structurer le code métier. Il est découpé en couches clairement identifiées :
4747

4848
![ddd_layers.png](assets/ddd_layers.png)
4949

5050
source: https://www.hibit.dev/posts/15/domain-driven-design-layers
5151

52-
- **Domain Layer** : Contient les entités, les valeurs d’objet, les agrégats, les événements, les commandes, les gestionnaires de commandes, les spécifications, les services de domaine, etc.
53-
- **Application Layer** : Contient les services d’application, les gestionnaires de commandes, les gestionnaires de requêtes, les gestionnaires d’événements, etc.
54-
- **Infrastructure Layer** : Contient les implémentations des interfaces de persistance, les implémentations des interfaces de messagerie, les implémentations des interfaces de configuration, etc.
55-
- **Presentation Layer** : Contient les contrôleurs REST (@RestController)
52+
- **Domain Layer** : Contient les entités, agrégats, événements, commandes, objets valeurs et services métier.
53+
- **Application Layer** : Coordonne les opérations métier via des gestionnaires de commandes, d’événements et de requêtes.
54+
- **Infrastructure Layer** : Implémente les interfaces techniques (base de données, messaging, configuration).
55+
- **Presentation Layer** : Fournit les API REST pour l’exposition externe.
5656

5757
## Services Principaux
5858

5959
### Cloud Config Server
60-
Ce service charge la configuration depuis un dépôt Git local ou distant. L’application consomme ensuite cette configuration au démarrage pour centraliser et uniformiser la configuration.
60+
Centralise la configuration des microservices à partir d’un dépôt Git local ou distant. Cela permet une uniformisation et une gestion centralisée de la configuration.
6161

6262
### Eureka
63-
Chaque service s’enregistre auprès de **Eureka** et peut ensuite découvrir les autres services par leur nom logique, sans avoir à connaître les adresses réseau exactes.
63+
Chaque microservice s’enregistre auprès d’Eureka et peut découvrir les autres services par leur nom, sans dépendance à une adresse IP ou un port statique.
6464

6565
### Gateway
66-
Permet de centraliser toutes les requêtes sortantes et entrantes.
67-
Les clients externes n’ont accès qu’au Gateway, qui fait office de passerelle.
68-
Il gère également la résilience avec **Resilience4j**
66+
Fait office de passerelle unique pour toutes les requêtes entrantes. Il intègre des mécanismes de résilience avec **Resilience4j**.
6967

7068
### Product-Command
71-
C’est le microservice pour les opérations d’écriture (Create, Update, Delete) sur les produits. Il peut utiliser **Axon** et **RabbitMQ** pour émettre des événements.
69+
Responsable des opérations de modification des produits. Il utilise **Axon** pour la gestion des commandes et des événements, et **RabbitMQ** pour la communication inter-services.
7270

7371
### Product-Query
74-
Ce microservice expose des requêtes en lecture pour récupérer la liste ou le détail des produits.
72+
Expose les données en lecture via des projections. Repose sur **R2DBC** pour l’accès non bloquant à la base PostgreSQL.
7573

7674
## Configuration Eureka
7775

78-
Voici un extrait typique du `application.properties` pour Eureka :
76+
Extrait du fichier `application.properties` pour Eureka :
7977

8078
```properties
8179
spring.application.name=eureka
8280
server.port=8761
83-
84-
# Désactive la découverte pour lui-même
8581
eureka.client.register-with-eureka=false
86-
87-
# eureka.client.fetch-registry=false car c’est le serveur
82+
eureka.client.fetch-registry=false
8883
management.endpoints.web.exposure.include=health,info
8984
```
9085

91-
Une fois démarré, Eureka sera accessible sur `http://localhost:8761/`.
86+
Accessible via : `http://localhost:8761/`
9287

9388
## Configuration du Cloud Config Server
9489

95-
Exemple de configuration minimale :
90+
Exemple de configuration minimale :
9691

9792
```properties
9893
spring.application.name=cloud-config-server
9994
server.port=8081
10095
spring.cloud.config.server.git.uri=/MON-PATH/config-repo
10196
```
10297

103-
Dans le dépôt local `config-repo/`, on placera les fichiers `gateway-server.properties`, `product-command.properties`, etc., pour centraliser la configuration.
98+
Les fichiers de configuration centralisés (ex: `gateway-server.properties`, `product-command.properties`) sont placés dans ce dépôt.
10499

105100
## Configuration du Gateway
106101

107-
Le Gateway utilise les routes pour rediriger les requêtes vers les microservices :
102+
Configuration typique du Gateway avec découverte de service :
108103

109104
```properties
110105
spring.application.name=gateway-server
@@ -121,9 +116,9 @@ spring.cloud.gateway.routes[0].predicates[0]=Path=/api/v1/commands/products/**
121116

122117
## Axon, RabbitMQ et PostgreSQL
123118

124-
- **Axon** : Framework de mise en œuvre de **CQRS** et **Event Sourcing**.
125-
- **RabbitMQ** : Broker de messages pour la communication asynchrone.
126-
- **PostgreSQL** : Base de données relationnelle pour persister les données (Il sert egalement de event store).
119+
- **Axon** : Implémente les patterns **CQRS** et **Event Sourcing**.
120+
- **RabbitMQ** : Facilite la communication asynchrone entre les services.
121+
- **PostgreSQL** : Utilisé à la fois pour le stockage traditionnel et comme **event store** avec Axon.
127122

128123
### Exemple de test réactif
129124

@@ -141,23 +136,22 @@ void it_should_create_aggregate_reactively() {
141136

142137
## Sécuriser les Microservices
143138

144-
Pour vous assurer que seuls les appels venant du Gateway sont autorisés, vous pouvez ajouter un header spécifique (ex. `X-Gateway-Auth`) via un **Route Filter** ou un **Global Filter** dans Gateway, et vérifier la présence de ce header côté microservices :
139+
Pour garantir que seuls les appels issus du Gateway accèdent aux microservices, un header spécifique (`X-Gateway-Auth`) peut être ajouté via un **Route Filter** :
145140

146141
```properties
147142
spring.cloud.gateway.routes[0].filters[0]=AddRequestHeader=X-Gateway-Auth,true
148143
```
149144

150-
Ensuite, dans chaque microservice :
145+
Puis vérifié dans les services internes :
151146

152147
```java
153148
.http.authorizeExchange(exchanges -> exchanges
154-
.pathMatchers("/api/v1/commands/**").access(gatewayAuthManager)
149+
.pathMatchers("/**").access(gatewayAuthManager)
155150
.anyExchange().permitAll()
156151
)
157152
```
158153

159154
## Conclusion
160155

161-
Ce starter fournit une architecture solide basée sur **Spring Cloud**, **Axon**, **RabbitMQ**, et **PostgreSQL**.
162-
L’objectif est de montrer comment mettre en place une infrastructure microservices réactive, scalable et maintenable. Vous pouvez cloner ce projet, personnaliser la configuration, et ajouter vos propres fonctionnalités pour répondre à vos besoins métiers.
156+
Le projet `spring-microservices-starter` constitue une base solide pour développer des systèmes microservices modernes, réactifs et résilients. Grâce à une architecture modulaire, à l’intégration de composants éprouvés, et à l’adoption de principes comme le DDD et le CQRS, il permet d’industrialiser rapidement le développement de services métiers robustes. Il peut être utilisé tel quel ou adapté aux besoins spécifiques d’une organisation.
163157

src/data/HomeFr.ts

+7-11
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
export const HomeFr = {
22
'welcome': "Bienvenue",
3-
'presentation': 'Développeur expérimenté, ' +
4-
'spécialisé dans la création d\'applications performantes et centrées sur' +
5-
' l\'utilisateur avec Angular, CSS [Tailwind].' +
6-
' Mon expertise s\'étend également au back-end Java (Spring), Travaillé sur des projets avec PHP,' +
7-
' ainsi qu\'aux architectures comme DDD, CQRS etc.'+
8-
' Disponible pour collaborer sur ' +
9-
'de nouveaux projets stimulants et innovants qui apporte une valeur reel sur la société.',
3+
'presentation': 'Développeur expérimenté,' +
4+
' spécialisé dans la création d’applications performantes et centrées ' +
5+
'sur l’utilisateur avec Angular et Tailwind CSS. Une expertise étendue ' +
6+
'côté back-end avec Java (Spring), PHP, ainsi que dans les architectures modernes' +
7+
' telles que DDD et CQRS. Ouvert aux collaborations sur des projets innovants et à fort impact sociétal.',
108
'projects': 'Projets',
119
'services': 'Services',
1210
'contact-me': 'Contactez-moi',
13-
'contact-text': 'Je suis ravi de vous entendre ! Remplissez ce formulaire ' +
14-
'pour m\'envoyer vos questions, commentaires ou suggestions, même de façon anonyme.' +
15-
' Je vous répondrai dans les plus brefs délais.\n\n',
11+
'contact-text': 'Heureux de recevoir vos messages ! Remplissez ce formulaire pour poser des questions, partager des commentaires ou suggestions, même de manière anonyme. Une réponse sera apportée dans les plus brefs délais.\n\n',
1612
'footer': 'Papa Coundia tous droits réservés',
1713
'blog': 'Articles du blog',
18-
} as const;
14+
} as const;

0 commit comments

Comments
 (0)