SlideShare une entreprise Scribd logo
#DevoxxFR
Microservices, DDD
et bootstrapping
pour faire un départ lancé…
Laurent Guérin
Aurélien Brisard
1
OneCraft
Qui parle ?
Laurent Guérin Aurélien Brisard
Senior Architect Architect & DevOps expert
Software Crafter DDD supporter
@ltguerin
Telosys creator
OneCraft
#DevoxxFR
3
Le contexte du projet
• Client: secteur public
• Organisation: itératif, ~130 développeurs
• Legacy:
• Important de ~17 années, ~100
modules
• Architecture: 3-tier monolithique Java
• Modernisation:
• Débutée en 2021, ~20 microservices
• Architecture: 3-tier microservice
Legacy
Cloud Cloud – IA
Contexte du projet
Contexte du projet
Cloud
Cloud – IA
Legacy
Infrastructure: Cloud
Système d’exploitation
Orchestration de conteneurs: Kubernetes
Moteur de conteneurs: Containerd
Service Mesh: Istio
Microservice:
Spring-boot
Microservice:
Spring-boot
Microservice:
Spring-boot
Base de données:
PostgreSQL
Appli mobile:
Xamarin
SPA:
Vue.js
Batch:
Spring batch
Batch:
Spring batch
• Pattern principal – Domain Driven
Design (DDD):
• 3 couches DDD « classiques »
• 1 domaine = 1 microservice
• Approche: « contract first »
Structure des microservices « standards »
Socle technique
• Actuator
• Data:
• AMQP
Création d’un
nouveau
microservice
Projet microservice Framework « léger »
( fonctionnalités techniques, librairies communes,
configuration des plugins de compilation/packaging)
Structuration Maven
Modules Maven
Parent
Domain
Infra SQL
Infra AMQP
Application
DTO
Microservice
etc...
Tout ça pour
chaque microservice ?
Comment bien démarrer ?
=> Copier/Coller ?
=> Bootstraping ?
REST API
Génération de code… ?
Black
box
Model
Résultat imposé !

Fichiers
générés
Objections classiques :
• C’est lourd
• Le code généré n’est pas propre ou non conforme aux attentes
• Souvent intrusif : le générateur impose des choix (style de code, framework, etc )
Génération de code
Templates
Model
Personnalisation
du projet,
du modèle
et des templates
Résultat =
exactement ce
qu’on veut
☺
Black
box
Fichiers
générés
Model
Résultat imposé !

Fichiers
générés
Conf projet
Langage de templating : VTL
( Velocity Template Language )
• Directives :
#set, #if, #foreach, …
• Commentaires :
##, #* … *#
• Variables & objets
du modèle :
$xxx, $xxx.yy, $xxx.method()
• Classes Java spécifiques
(si besoin)
Templates Telosys http://velocity.apache.org/
/**
* REST DTO for entity "${entity.name}"
*
* @author ${AUTHOR}
*
*/
public class ${entity.name}RestDto {
#foreach($attribute in $entity.attributes)
private $attribute.type $attribute.name;
#end
« Bundle of templates »
Initialisation de la structure du projet
1
Bundle
(templates)
No model
Config
projet
Définition du
"Domain Model"
Modèle DDD – Exemple :
1
Clé
primaire
composite
Modèle Telosys
1
Une entité est décrite à l’aide d’un
DSL (Domain-Specific Language)
Grammaire très simple et
extensible avec des « tags »
DSL
#tag
1 modèle = 1 répertoire
Modèle « léger » basé sur des fichiers « texte » (pas d’UML)
1 entité = 1 fichier texte ( « .entity » )
@AggregateRoot
@DbTable(T_ORDER)
#MyEntityTag
Order {
// Id ( Primary Key )
num : int { @Id @NotNull @Label("order number") } ;
orderDate : date { @NotNull @Label("order date")} ;
status : short { @NotNull @DefaultValue(0) #MyTag(xy) };
comment : string { @Size(120) } ;
// FK referencing Customer
customerId : int { @FK(Customer) } ;
// Links
items : OrderItem[] ; // Many
deliveryAddress : DeliveryAddress ; // One
// No link to Customer (not in the aggregate, just FK)
}
Attributs
- Primary Key
- Basic attrib.
- Foreign Key
Liens
- to one
- to many
@xxx Annotations
Composite PK & FK
Fichier « .entity »
Types neutres
Entité
#xxx Tags
Visualisation du modèle avec PlantUML
Bundle
(templates)
Model
(entities)
Templates
pour PlantUML
Entités du
microservice
Fichier « .plantuml »
Génération du module « domain »
Bundle
(templates)
Model
(entities)
Templates
dédiés au
« domain »
Entités du
microservice

Implémentation
de la couche
« infrastructure »
DDD : « infrastructure »
Domain layer
Infrastructure layer
« Port »
<< interface >>
Repository
Application layer
xxx
xxx
Clés composites
=> changement d’implémentation en cours de projet :
Spring Data JDBC → JPA → MyBatis
Repository
implementation
( MyBatis )
Génération du module « infra-mybatis »
Bundle
(templates)
Model
(entities)
Templates
dédiés à
« mybatis »
Entités du
microservice


Génération des scripts SQL ( DDL )
Bundle
(templates)
Model
(entities)
Templates pour
« PostgreSQL »
Entités du
microservice
Scripts
SQL
Changesets
Liquibase
REST API
&
services de niveau
« application »
Articulation REST - application
Génération : DTO + application + REST
Bundle
(templates)
Model
(entities)
Templates
rest-dto
rest-app
Entités du
microservice


factory

REST API
REST API « Contract First »
« Code First »
« Contract First »
Contract
( Open API)
Il va falloir gérer 2 modèles ( Telosys + Open API ) ?
Contract
( Open API)
Code
Code
Génération des fichiers OpenAPI
Bundle
(templates)
Model
Telosys
(entities)
Templates pour
générer une
spec Open API
Meta-model
“Telosys”
Meta-model
“Open API”
M2M
DTO &
interfaces
Contract
( Open API)
Code
« Model to Model »
.yaml
Pour conclure…
Ce qu’on ne vous a pas montré…
• Adaptation spécifique au framework du projet
• Génération des tests unitaires (JUnit, …)
• Génération des tests d’intégration (Postman, SOAPUI, …)
• Bootstrapping des batchs (Spring Batch)
• Bootstrapping des IHM (CRUD)
Les gains
• Productivité
démarrage rapide,
réduction de la charge de travail & réduction des délais
• Simplification
certaines parties du code peuvent être générées intégralement
et deviennent « invisibles » pour le développeur (DTO, mappers, …)
• Standardisation
respect des règles de développement dans les templates
• Qualité
application des bonnes pratiques dans les templates
(Clean Code, Software Craftsmanship, tests unitaires, …)
Jusqu’ou aller ?
• Trouver un équilibre
• Privilégier les « quick wins »
• Savoir s’arrêter
Temps investi
dans les templates
Temps de développement gagné (+qualité)
Générateur de code : critères de choix
Flexibilité & adaptabilité
• Capacité à générer tout type de code
(langages, frameworks, autres modèles) => un seul outil pour tout générer
• Le projet décide de ses choix et le générateur s’adapte
- adaptation au socle du projet (ex : MyBatis, Spring Boot + JAX-RS)
- adaptation au framework du projet (héritage, pom parents, etc)
- respect des conventions et standards de développement du projet
• Le modèle doit être extensible (ex : les #tags)
• Les templates doivent être facilement adaptables
• Possibilité de gérer les clés primaires composites
« DDD on rails »
DDD
+ =
Merci !
Annexes
@telosys tag "telosys" groups/1340197/ channel "Telosys"
https://www.telosys.org/
• Telosys CLI :
https://github.com/telosys-tools-bricks/telosys-cli
• Telosys Eclipse plugin :
https://github.com/telosys-eclipse-v3/TelosysToolsPlugin
All stars are welcome ;-)
Stay tuned !
Spring-Data-JDBC vs. MyBatis vs. Implémentation JPA
Spring-Data-JDBC MyBatis Impl. JPA
Framework de persistance de type ORM X X
Indépendance du code avec le SGBD X X
Gestion des relations dans le modèle objet (aggregat) X X
Ecriture des requêtes avec le language natif du SGBD X X X
Gestion des clés composées X X
Chargement différé des relations (ex: lazy loading) X X
Cache de niveau 2 X X
Gestion des procédures stockées X X X
Gestion des géométries X X X
Processus & Pipeline CI/CD
• Processus commun:
• GitLab flow (feature + release
branching)
• Merge request obligatoires
• Pipeline CI/CD standardisés:
• Expérience développeur intégrée
en faisant de GitLab l’outil
central
• Templates GitLab-CI
Architecture hexagonale

Contenu connexe

PDF
ReactJS presentation
PPTX
Spring Framework
PDF
Kotlin coroutines 톺아보기
PDF
Chapter 1. java programming language overview
PDF
Spring Boot
PDF
Spring Boot
PPTX
Introduction to NodeJS
PDF
Spring Framework - Core
ReactJS presentation
Spring Framework
Kotlin coroutines 톺아보기
Chapter 1. java programming language overview
Spring Boot
Spring Boot
Introduction to NodeJS
Spring Framework - Core

Tendances (20)

PPT
React js
PDF
Spring Framework - AOP
PPT
JavaScript
PDF
Understanding Reactive Programming
PPTX
Spring Boot and REST API
PPTX
Java 8 Lambda and Streams
PDF
Jenkins-CI
PPTX
Spring Web MVC
PPSX
Spring - Part 1 - IoC, Di and Beans
PPTX
Java nio ( new io )
PPTX
Spring Boot Tutorial
PDF
Pwning mobile apps without root or jailbreak
PPTX
Building a REST Service in minutes with Spring Boot
PPTX
Understanding REST APIs in 5 Simple Steps
PPTX
Rapid json tutorial
PPTX
Express JS Rest API Tutorial
PPTX
.Net Core
PDF
Introduction to Hibernate Framework
PPT
JDBC – Java Database Connectivity
PDF
REST API Best (Recommended) Practices
React js
Spring Framework - AOP
JavaScript
Understanding Reactive Programming
Spring Boot and REST API
Java 8 Lambda and Streams
Jenkins-CI
Spring Web MVC
Spring - Part 1 - IoC, Di and Beans
Java nio ( new io )
Spring Boot Tutorial
Pwning mobile apps without root or jailbreak
Building a REST Service in minutes with Spring Boot
Understanding REST APIs in 5 Simple Steps
Rapid json tutorial
Express JS Rest API Tutorial
.Net Core
Introduction to Hibernate Framework
JDBC – Java Database Connectivity
REST API Best (Recommended) Practices
Publicité

Similaire à Microservices-DDD-Telosys-Devoxx-FR-2022 (20)

PDF
Telosys tools jug-nantes-2014-v1.2
PDF
JUG Nantes - Telosys Tools - Avril 2014
PDF
Dossier de competences MA
PPTX
Chapitre 01- Maitriser architecture micro-services avec Spring Boot et Spring...
PDF
Meetup python-bottle-telosys-2018-lgu-v1.0
PDF
Conference MicroServices101 - 1ere partie
PDF
Mdday 2011-telosys-v1.0
PDF
Sogeti telosys@md day2011
PDF
Presentation du socle technique Java open source Scub Foundation
PDF
Prise en main de Jhipster
PDF
Bbl microservices avec vert.x cdi elastic search
PDF
Scub Foundation, usine logicielle Java libre
PDF
LyonJUG-2023-v1.0.pdf
PDF
Architectures microservices
PPTX
Diapo PFE
PDF
Saas Libre
PPTX
Mia-Software at MD Day 2010
PDF
Mia software mdday2010
PDF
ToulouseJUG - REX Flex, Spring & Agilité
PDF
Le nouveau portail
Telosys tools jug-nantes-2014-v1.2
JUG Nantes - Telosys Tools - Avril 2014
Dossier de competences MA
Chapitre 01- Maitriser architecture micro-services avec Spring Boot et Spring...
Meetup python-bottle-telosys-2018-lgu-v1.0
Conference MicroServices101 - 1ere partie
Mdday 2011-telosys-v1.0
Sogeti telosys@md day2011
Presentation du socle technique Java open source Scub Foundation
Prise en main de Jhipster
Bbl microservices avec vert.x cdi elastic search
Scub Foundation, usine logicielle Java libre
LyonJUG-2023-v1.0.pdf
Architectures microservices
Diapo PFE
Saas Libre
Mia-Software at MD Day 2010
Mia software mdday2010
ToulouseJUG - REX Flex, Spring & Agilité
Le nouveau portail
Publicité

Plus de Laurent Guérin (12)

PDF
My web application in 20 minutes with Telosys
PDF
Telosys project booster Paris Open Source Summit 2019
PDF
Telosys tutorial - Code generation for a Python web application based on Bott...
PDF
MQTT avec Mosquitto et Paho - DevFest Brest 2019
PDF
MQTT avec Mosquitto et Paho - Laurent Guerin - JUG Nantes Nov 2018
PDF
Sogeti labs developer-today-v1.1
PDF
DevOps MeetUp NL - Docker (Oct 2014)
PDF
Bean Validation - Cours v 1.1
PDF
Genie logiciel eseo-v1.1-1spp
PDF
Devoxx 2011 - Scaffolding with Telosys
PDF
Open World Forum 2009 Migration With Telosys
PDF
Solutions Linux Développement Rapide Java
My web application in 20 minutes with Telosys
Telosys project booster Paris Open Source Summit 2019
Telosys tutorial - Code generation for a Python web application based on Bott...
MQTT avec Mosquitto et Paho - DevFest Brest 2019
MQTT avec Mosquitto et Paho - Laurent Guerin - JUG Nantes Nov 2018
Sogeti labs developer-today-v1.1
DevOps MeetUp NL - Docker (Oct 2014)
Bean Validation - Cours v 1.1
Genie logiciel eseo-v1.1-1spp
Devoxx 2011 - Scaffolding with Telosys
Open World Forum 2009 Migration With Telosys
Solutions Linux Développement Rapide Java

Microservices-DDD-Telosys-Devoxx-FR-2022

  • 1. #DevoxxFR Microservices, DDD et bootstrapping pour faire un départ lancé… Laurent Guérin Aurélien Brisard 1 OneCraft
  • 2. Qui parle ? Laurent Guérin Aurélien Brisard Senior Architect Architect & DevOps expert Software Crafter DDD supporter @ltguerin Telosys creator OneCraft
  • 4. • Client: secteur public • Organisation: itératif, ~130 développeurs • Legacy: • Important de ~17 années, ~100 modules • Architecture: 3-tier monolithique Java • Modernisation: • Débutée en 2021, ~20 microservices • Architecture: 3-tier microservice Legacy Cloud Cloud – IA Contexte du projet
  • 5. Contexte du projet Cloud Cloud – IA Legacy Infrastructure: Cloud Système d’exploitation Orchestration de conteneurs: Kubernetes Moteur de conteneurs: Containerd Service Mesh: Istio Microservice: Spring-boot Microservice: Spring-boot Microservice: Spring-boot Base de données: PostgreSQL Appli mobile: Xamarin SPA: Vue.js Batch: Spring batch Batch: Spring batch
  • 6. • Pattern principal – Domain Driven Design (DDD): • 3 couches DDD « classiques » • 1 domaine = 1 microservice • Approche: « contract first » Structure des microservices « standards »
  • 9. Projet microservice Framework « léger » ( fonctionnalités techniques, librairies communes, configuration des plugins de compilation/packaging) Structuration Maven
  • 10. Modules Maven Parent Domain Infra SQL Infra AMQP Application DTO Microservice etc... Tout ça pour chaque microservice ? Comment bien démarrer ? => Copier/Coller ? => Bootstraping ? REST API
  • 11. Génération de code… ? Black box Model Résultat imposé !  Fichiers générés Objections classiques : • C’est lourd • Le code généré n’est pas propre ou non conforme aux attentes • Souvent intrusif : le générateur impose des choix (style de code, framework, etc )
  • 12. Génération de code Templates Model Personnalisation du projet, du modèle et des templates Résultat = exactement ce qu’on veut ☺ Black box Fichiers générés Model Résultat imposé !  Fichiers générés Conf projet
  • 13. Langage de templating : VTL ( Velocity Template Language ) • Directives : #set, #if, #foreach, … • Commentaires : ##, #* … *# • Variables & objets du modèle : $xxx, $xxx.yy, $xxx.method() • Classes Java spécifiques (si besoin) Templates Telosys http://velocity.apache.org/ /** * REST DTO for entity "${entity.name}" * * @author ${AUTHOR} * */ public class ${entity.name}RestDto { #foreach($attribute in $entity.attributes) private $attribute.type $attribute.name; #end
  • 14. « Bundle of templates »
  • 15. Initialisation de la structure du projet 1 Bundle (templates) No model Config projet
  • 17. Modèle DDD – Exemple : 1 Clé primaire composite
  • 18. Modèle Telosys 1 Une entité est décrite à l’aide d’un DSL (Domain-Specific Language) Grammaire très simple et extensible avec des « tags » DSL #tag 1 modèle = 1 répertoire Modèle « léger » basé sur des fichiers « texte » (pas d’UML) 1 entité = 1 fichier texte ( « .entity » )
  • 19. @AggregateRoot @DbTable(T_ORDER) #MyEntityTag Order { // Id ( Primary Key ) num : int { @Id @NotNull @Label("order number") } ; orderDate : date { @NotNull @Label("order date")} ; status : short { @NotNull @DefaultValue(0) #MyTag(xy) }; comment : string { @Size(120) } ; // FK referencing Customer customerId : int { @FK(Customer) } ; // Links items : OrderItem[] ; // Many deliveryAddress : DeliveryAddress ; // One // No link to Customer (not in the aggregate, just FK) } Attributs - Primary Key - Basic attrib. - Foreign Key Liens - to one - to many @xxx Annotations Composite PK & FK Fichier « .entity » Types neutres Entité #xxx Tags
  • 20. Visualisation du modèle avec PlantUML Bundle (templates) Model (entities) Templates pour PlantUML Entités du microservice Fichier « .plantuml »
  • 21. Génération du module « domain » Bundle (templates) Model (entities) Templates dédiés au « domain » Entités du microservice 
  • 22. Implémentation de la couche « infrastructure »
  • 23. DDD : « infrastructure » Domain layer Infrastructure layer « Port » << interface >> Repository Application layer xxx xxx Clés composites => changement d’implémentation en cours de projet : Spring Data JDBC → JPA → MyBatis Repository implementation ( MyBatis )
  • 24. Génération du module « infra-mybatis » Bundle (templates) Model (entities) Templates dédiés à « mybatis » Entités du microservice  
  • 25. Génération des scripts SQL ( DDL ) Bundle (templates) Model (entities) Templates pour « PostgreSQL » Entités du microservice Scripts SQL Changesets Liquibase
  • 26. REST API & services de niveau « application »
  • 27. Articulation REST - application
  • 28. Génération : DTO + application + REST Bundle (templates) Model (entities) Templates rest-dto rest-app Entités du microservice   factory 
  • 30. REST API « Contract First » « Code First » « Contract First » Contract ( Open API) Il va falloir gérer 2 modèles ( Telosys + Open API ) ? Contract ( Open API) Code Code
  • 31. Génération des fichiers OpenAPI Bundle (templates) Model Telosys (entities) Templates pour générer une spec Open API Meta-model “Telosys” Meta-model “Open API” M2M DTO & interfaces Contract ( Open API) Code « Model to Model » .yaml
  • 33. Ce qu’on ne vous a pas montré… • Adaptation spécifique au framework du projet • Génération des tests unitaires (JUnit, …) • Génération des tests d’intégration (Postman, SOAPUI, …) • Bootstrapping des batchs (Spring Batch) • Bootstrapping des IHM (CRUD)
  • 34. Les gains • Productivité démarrage rapide, réduction de la charge de travail & réduction des délais • Simplification certaines parties du code peuvent être générées intégralement et deviennent « invisibles » pour le développeur (DTO, mappers, …) • Standardisation respect des règles de développement dans les templates • Qualité application des bonnes pratiques dans les templates (Clean Code, Software Craftsmanship, tests unitaires, …)
  • 35. Jusqu’ou aller ? • Trouver un équilibre • Privilégier les « quick wins » • Savoir s’arrêter Temps investi dans les templates Temps de développement gagné (+qualité)
  • 36. Générateur de code : critères de choix
  • 37. Flexibilité & adaptabilité • Capacité à générer tout type de code (langages, frameworks, autres modèles) => un seul outil pour tout générer • Le projet décide de ses choix et le générateur s’adapte - adaptation au socle du projet (ex : MyBatis, Spring Boot + JAX-RS) - adaptation au framework du projet (héritage, pom parents, etc) - respect des conventions et standards de développement du projet • Le modèle doit être extensible (ex : les #tags) • Les templates doivent être facilement adaptables • Possibilité de gérer les clés primaires composites
  • 38. « DDD on rails » DDD + =
  • 41. @telosys tag "telosys" groups/1340197/ channel "Telosys" https://www.telosys.org/ • Telosys CLI : https://github.com/telosys-tools-bricks/telosys-cli • Telosys Eclipse plugin : https://github.com/telosys-eclipse-v3/TelosysToolsPlugin All stars are welcome ;-) Stay tuned !
  • 42. Spring-Data-JDBC vs. MyBatis vs. Implémentation JPA Spring-Data-JDBC MyBatis Impl. JPA Framework de persistance de type ORM X X Indépendance du code avec le SGBD X X Gestion des relations dans le modèle objet (aggregat) X X Ecriture des requêtes avec le language natif du SGBD X X X Gestion des clés composées X X Chargement différé des relations (ex: lazy loading) X X Cache de niveau 2 X X Gestion des procédures stockées X X X Gestion des géométries X X X
  • 43. Processus & Pipeline CI/CD • Processus commun: • GitLab flow (feature + release branching) • Merge request obligatoires • Pipeline CI/CD standardisés: • Expérience développeur intégrée en faisant de GitLab l’outil central • Templates GitLab-CI