Architecture hexagonale
@pauline_io
Principes
@pauline_io
@pauline_io
@pauline_io
Business
Infra
Business : domaine, code métier
@pauline_io
Infra : code technique
@pauline_io
PORTS
@pauline_io
DRIVER
DRIVEN
RIGHT SIDE
LEFT SIDE
@pauline_io
Rabbitmq
DRIVER
DRIVEN
RIGHT SIDE
Domaine
Modèle
Services
LEFT SIDE
REST
API
Adapteurs
Image WS
@pauline_io
Inversion de controle
@pauline_io
Ségrégation des interfaces (SOLID)
@pauline_io
Catalogue de produits
@pauline_io
Rabbitmq
DRIVER
DRIVEN
LEFT SIDE
RIGHT SIDE
Domaine
Modèle
Services
byte[] getImage(String description)
Product getProduct(String ean)
List<Product> findAllProduct()
void sendEvent(ProductEvent productEvent)
Product showProductDetail(String ean)
List<Product> showCatalog()
@pauline_io
Pattern : Adapteurs
Controller
“interface”
ProductService
ProductServiceImpl
ProductServiceImpl
“inteface”
ProductDAO
ProductMongodbDAO
@pauline_io
Pattern : “Anti corruption layer”
@pauline_io
Pattern : “Anti corruption layer”
Rabbitmq
Domaine
Modèle
Services
REST
api
Modèle appartenant à l’infra : DTO
Image WS
Modèle métier
M : Modèle métier
@pauline_io
M ->
M1
M ->
M2
M ->
M3
M ->M4
M ->M5
Mn
Livecoding
@pauline_io
Application de gestion d’un catalogue produit
Livecoding
H2
products
Product view, playframework application
GET /products/<ean>
GET /products
product details
Controllers
Règles métiers
Ebean
Modèle
product events
HTML
GET /events
@pauline_io
Livecoding
User story : consultation des événements d’un produit
Scénario : Un admin consulte un produit
Quand un Admin consulte un produit
Alors il peut voir tous les événements liés à ce produit
Scénario : Un gestionnaire consulte un produit
Quand un gestionnaire consulte un produit
Alors il peut voir tous les événements liés au produit qui ont été créés pendant sa session mais pas les événements techniques comme CHANGE_USER_ACCESS
Scénario : Un super gestionnaire consulte un produit
Quand un super gestionnaire consulte un produit
Alors il peut voir tous les événements liés au produit qui ont été générés par lui et les autres gestionnaires mais pas les événements techniques comme CHANGE_USER_ACCESS
@pauline_io
New feature :
Livecoding
User story : événement de connexion
Scénario : Un utilisateur accède à l’application
Quand un user accède au site
Alors alors un événement de connexion USER_CONNECTION est créé
Scénario : Un gestionnaire consulte un produit
Quand un gestionnaire consulte un produit
Alors il peut voir tous les événements liés au produit qui ont été créés pendant sa session mais pas les événements techniques comme CHANGE_USER_ACCESS et USER_CONNECTION
Scénario : Un super gestionnaire consulte un produit
Quand un super gestionnaire consulte un produit
Alors il peut voir tous les événements liés au produit qui ont été générés par lui et les autres gestionnaires mais pas les événements techniques comme CHANGE_USER_ACCESS et USER_CONNECTION
@pauline_io
Livecoding
Let’s go
@pauline_io
Application de gestion d’un catalogue produit
Livecoding
H2
products
Product view, playframework application
GET /products/<ean>
GET /products
product details
Controllers
Ebean
Modèle
events
HTML
GET /events
RG
RG
RG
Services
RG
@pauline_io
Code review
Le catalogue de produit hexagonalisée
@pauline_io
Microservices
MONOLITH
MONOLITH
HEXAGONALISES
MICROSERVICES
@pauline_io
Liens
Meetup “Alistair in the hexagone” :
https://www.youtube.com/watch?v=th4AgBcrEHA
https://www.youtube.com/watch?v=iALcE8BPs94&t=54s
https://www.youtube.com/watch?v=DAe0Bmcyt-4
Base de code fortement couplée : https://github.com/P4uline/product-catalog-tight-coulping-example
Base de code hexagonalisée : https://github.com/P4uline/product-catalog-hexagonalized
Merci
@pauline_io
Questions
@pauline_io
Comment séparer le métier de l’infra
Pourquoi ?
Pourquoi c’est bien
Comment l’amener dans l’équipe
Architecture hexagonal vs code legacy
Much better pattern
Mon REX à moi
Les pièges
Sources
Importance d’avoir de bons modèles, orienter ses pistes de reflexion dans la bonne direction, aller vers plus de pragmatisme, no more technico technique
RESTE A FAIRE
FEEDBACK LUNATECH