SlideShare une entreprise Scribd logo
1  sur  44
Télécharger pour lire hors ligne
#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

Tendances

Troubleshooting Kerberos in Hadoop: Taming the Beast
Troubleshooting Kerberos in Hadoop: Taming the BeastTroubleshooting Kerberos in Hadoop: Taming the Beast
Troubleshooting Kerberos in Hadoop: Taming the BeastDataWorks Summit
 
Telosys tutorial - Code generation for a Python web application based on Bott...
Telosys tutorial - Code generation for a Python web application based on Bott...Telosys tutorial - Code generation for a Python web application based on Bott...
Telosys tutorial - Code generation for a Python web application based on Bott...Laurent Guérin
 
REST APIs with Spring
REST APIs with SpringREST APIs with Spring
REST APIs with SpringJoshua Long
 
Symfony in microservice architecture
Symfony in microservice architectureSymfony in microservice architecture
Symfony in microservice architectureDaniele D'Angeli
 
Introduction to Redis
Introduction to RedisIntroduction to Redis
Introduction to RedisDvir Volk
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesENSET, Université Hassan II Casablanca
 
Applications secure by default
Applications secure by defaultApplications secure by default
Applications secure by defaultSecuRing
 
Spring Framework - Data Access
Spring Framework - Data AccessSpring Framework - Data Access
Spring Framework - Data AccessDzmitry Naskou
 
Big Data in Real-Time at Twitter
Big Data in Real-Time at TwitterBig Data in Real-Time at Twitter
Big Data in Real-Time at Twitternkallen
 
Créer des applications Java avec MongoDB
Créer des applications Java avec MongoDBCréer des applications Java avec MongoDB
Créer des applications Java avec MongoDBMongoDB
 

Tendances (20)

Troubleshooting Kerberos in Hadoop: Taming the Beast
Troubleshooting Kerberos in Hadoop: Taming the BeastTroubleshooting Kerberos in Hadoop: Taming the Beast
Troubleshooting Kerberos in Hadoop: Taming the Beast
 
Support NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDB
 
Telosys tutorial - Code generation for a Python web application based on Bott...
Telosys tutorial - Code generation for a Python web application based on Bott...Telosys tutorial - Code generation for a Python web application based on Bott...
Telosys tutorial - Code generation for a Python web application based on Bott...
 
REST APIs with Spring
REST APIs with SpringREST APIs with Spring
REST APIs with Spring
 
Symfony in microservice architecture
Symfony in microservice architectureSymfony in microservice architecture
Symfony in microservice architecture
 
HazelCast
HazelCastHazelCast
HazelCast
 
Introduction à ASP.NET
Introduction à ASP.NETIntroduction à ASP.NET
Introduction à ASP.NET
 
Spring Security 5
Spring Security 5Spring Security 5
Spring Security 5
 
Hazelcast Introduction
Hazelcast IntroductionHazelcast Introduction
Hazelcast Introduction
 
Introduction to Redis
Introduction to RedisIntroduction to Redis
Introduction to Redis
 
Hibernate
HibernateHibernate
Hibernate
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependances
 
Applications secure by default
Applications secure by defaultApplications secure by default
Applications secure by default
 
Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1 Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1
 
Spring Framework - Data Access
Spring Framework - Data AccessSpring Framework - Data Access
Spring Framework - Data Access
 
Introduction JavaEE
Introduction JavaEEIntroduction JavaEE
Introduction JavaEE
 
Big Data in Real-Time at Twitter
Big Data in Real-Time at TwitterBig Data in Real-Time at Twitter
Big Data in Real-Time at Twitter
 
Les collections en Java
Les collections en JavaLes collections en Java
Les collections en Java
 
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfiSupport de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
 
Créer des applications Java avec MongoDB
Créer des applications Java avec MongoDBCréer des applications Java avec MongoDB
Créer des applications Java avec MongoDB
 

Similaire à Microservices-DDD-Telosys-Devoxx-FR-2022

Meetup python-bottle-telosys-2018-lgu-v1.0
Meetup python-bottle-telosys-2018-lgu-v1.0Meetup python-bottle-telosys-2018-lgu-v1.0
Meetup python-bottle-telosys-2018-lgu-v1.0Laurent Guérin
 
JUG Nantes - Telosys Tools - Avril 2014
JUG Nantes - Telosys Tools - Avril 2014 JUG Nantes - Telosys Tools - Avril 2014
JUG Nantes - Telosys Tools - Avril 2014 telosys
 
Telosys tools jug-nantes-2014-v1.2
Telosys tools jug-nantes-2014-v1.2Telosys tools jug-nantes-2014-v1.2
Telosys tools jug-nantes-2014-v1.2Laurent Guérin
 
Introduction au Domain Driven Design
Introduction au Domain Driven DesignIntroduction au Domain Driven Design
Introduction au Domain Driven DesignDNG Consulting
 
Créer une IA capable de reconnaître des fleurs (ou autres)
Créer une IA capable de reconnaître des fleurs (ou autres)Créer une IA capable de reconnaître des fleurs (ou autres)
Créer une IA capable de reconnaître des fleurs (ou autres)Olivier Eeckhoutte
 
Bbl microservices avec vert.x cdi elastic search
Bbl microservices avec vert.x cdi elastic searchBbl microservices avec vert.x cdi elastic search
Bbl microservices avec vert.x cdi elastic searchIdriss Neumann
 
11 visual basic .net - acces aux donnees avec ado .net
11 visual basic .net - acces aux donnees avec ado .net11 visual basic .net - acces aux donnees avec ado .net
11 visual basic .net - acces aux donnees avec ado .netHamza SAID
 
Les dernières avancées HTML5 & CSS3 en action !
Les dernières avancées HTML5 & CSS3 en action !Les dernières avancées HTML5 & CSS3 en action !
Les dernières avancées HTML5 & CSS3 en action !Microsoft Technet France
 
Les dernières avancées html5 & css3 en action !
Les dernières avancées html5 & css3 en action !Les dernières avancées html5 & css3 en action !
Les dernières avancées html5 & css3 en action !davrous
 
Réussir son projet Drupal
Réussir son projet DrupalRéussir son projet Drupal
Réussir son projet DrupalAdyax
 
GraphTour - Workday: Tracking activity with Neo4j (French version)
GraphTour - Workday: Tracking activity with Neo4j (French version)GraphTour - Workday: Tracking activity with Neo4j (French version)
GraphTour - Workday: Tracking activity with Neo4j (French version)Neo4j
 
01 - [ASP.NET Core] Plénière
01 - [ASP.NET Core] Plénière 01 - [ASP.NET Core] Plénière
01 - [ASP.NET Core] Plénière Cellenza
 
Azure Camp 9 Décembre 2014 - slides Keynote
Azure Camp 9 Décembre 2014 - slides KeynoteAzure Camp 9 Décembre 2014 - slides Keynote
Azure Camp 9 Décembre 2014 - slides KeynoteMicrosoft
 
L'histoire d'html5 pour les développeurs windows phone 8
L'histoire d'html5 pour les développeurs windows phone 8L'histoire d'html5 pour les développeurs windows phone 8
L'histoire d'html5 pour les développeurs windows phone 8davrous
 
Xebicon architectures microservices azure v1.0
Xebicon   architectures microservices azure v1.0Xebicon   architectures microservices azure v1.0
Xebicon architectures microservices azure v1.0Michel HUBERT
 
Entity_framework_db first
Entity_framework_db firstEntity_framework_db first
Entity_framework_db firstZineb ELGARRAI
 
La Meta-programmation
La Meta-programmation La Meta-programmation
La Meta-programmation Microsoft
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Martin Latrille
 
Lyon JUG - Elasticsearch
Lyon JUG - ElasticsearchLyon JUG - Elasticsearch
Lyon JUG - ElasticsearchDavid Pilato
 
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)Publicis Sapient Engineering
 

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

Meetup python-bottle-telosys-2018-lgu-v1.0
Meetup python-bottle-telosys-2018-lgu-v1.0Meetup python-bottle-telosys-2018-lgu-v1.0
Meetup python-bottle-telosys-2018-lgu-v1.0
 
JUG Nantes - Telosys Tools - Avril 2014
JUG Nantes - Telosys Tools - Avril 2014 JUG Nantes - Telosys Tools - Avril 2014
JUG Nantes - Telosys Tools - Avril 2014
 
Telosys tools jug-nantes-2014-v1.2
Telosys tools jug-nantes-2014-v1.2Telosys tools jug-nantes-2014-v1.2
Telosys tools jug-nantes-2014-v1.2
 
Introduction au Domain Driven Design
Introduction au Domain Driven DesignIntroduction au Domain Driven Design
Introduction au Domain Driven Design
 
Créer une IA capable de reconnaître des fleurs (ou autres)
Créer une IA capable de reconnaître des fleurs (ou autres)Créer une IA capable de reconnaître des fleurs (ou autres)
Créer une IA capable de reconnaître des fleurs (ou autres)
 
Bbl microservices avec vert.x cdi elastic search
Bbl microservices avec vert.x cdi elastic searchBbl microservices avec vert.x cdi elastic search
Bbl microservices avec vert.x cdi elastic search
 
11 visual basic .net - acces aux donnees avec ado .net
11 visual basic .net - acces aux donnees avec ado .net11 visual basic .net - acces aux donnees avec ado .net
11 visual basic .net - acces aux donnees avec ado .net
 
Les dernières avancées HTML5 & CSS3 en action !
Les dernières avancées HTML5 & CSS3 en action !Les dernières avancées HTML5 & CSS3 en action !
Les dernières avancées HTML5 & CSS3 en action !
 
Les dernières avancées html5 & css3 en action !
Les dernières avancées html5 & css3 en action !Les dernières avancées html5 & css3 en action !
Les dernières avancées html5 & css3 en action !
 
Réussir son projet Drupal
Réussir son projet DrupalRéussir son projet Drupal
Réussir son projet Drupal
 
GraphTour - Workday: Tracking activity with Neo4j (French version)
GraphTour - Workday: Tracking activity with Neo4j (French version)GraphTour - Workday: Tracking activity with Neo4j (French version)
GraphTour - Workday: Tracking activity with Neo4j (French version)
 
01 - [ASP.NET Core] Plénière
01 - [ASP.NET Core] Plénière 01 - [ASP.NET Core] Plénière
01 - [ASP.NET Core] Plénière
 
Azure Camp 9 Décembre 2014 - slides Keynote
Azure Camp 9 Décembre 2014 - slides KeynoteAzure Camp 9 Décembre 2014 - slides Keynote
Azure Camp 9 Décembre 2014 - slides Keynote
 
L'histoire d'html5 pour les développeurs windows phone 8
L'histoire d'html5 pour les développeurs windows phone 8L'histoire d'html5 pour les développeurs windows phone 8
L'histoire d'html5 pour les développeurs windows phone 8
 
Xebicon architectures microservices azure v1.0
Xebicon   architectures microservices azure v1.0Xebicon   architectures microservices azure v1.0
Xebicon architectures microservices azure v1.0
 
Entity_framework_db first
Entity_framework_db firstEntity_framework_db first
Entity_framework_db first
 
La Meta-programmation
La Meta-programmation La Meta-programmation
La Meta-programmation
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)
 
Lyon JUG - Elasticsearch
Lyon JUG - ElasticsearchLyon JUG - Elasticsearch
Lyon JUG - Elasticsearch
 
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)
 

Plus de Laurent Guérin

My web application in 20 minutes with Telosys
My web application in 20 minutes with Telosys My web application in 20 minutes with Telosys
My web application in 20 minutes with Telosys Laurent Guérin
 
Telosys project booster Paris Open Source Summit 2019
Telosys project booster Paris Open Source Summit 2019Telosys project booster Paris Open Source Summit 2019
Telosys project booster Paris Open Source Summit 2019Laurent Guérin
 
MQTT avec Mosquitto et Paho - DevFest Brest 2019
MQTT avec Mosquitto et Paho - DevFest Brest 2019MQTT avec Mosquitto et Paho - DevFest Brest 2019
MQTT avec Mosquitto et Paho - DevFest Brest 2019Laurent Guérin
 
MQTT avec Mosquitto et Paho - Laurent Guerin - JUG Nantes Nov 2018
MQTT avec Mosquitto et Paho - Laurent Guerin - JUG Nantes Nov 2018MQTT avec Mosquitto et Paho - Laurent Guerin - JUG Nantes Nov 2018
MQTT avec Mosquitto et Paho - Laurent Guerin - JUG Nantes Nov 2018Laurent Guérin
 
Sogeti labs developer-today-v1.1
Sogeti labs developer-today-v1.1Sogeti labs developer-today-v1.1
Sogeti labs developer-today-v1.1Laurent Guérin
 
DevOps MeetUp NL - Docker (Oct 2014)
DevOps MeetUp NL - Docker (Oct 2014)DevOps MeetUp NL - Docker (Oct 2014)
DevOps MeetUp NL - Docker (Oct 2014)Laurent Guérin
 
Bean Validation - Cours v 1.1
Bean Validation - Cours v 1.1Bean Validation - Cours v 1.1
Bean Validation - Cours v 1.1Laurent Guérin
 
Genie logiciel eseo-v1.1-1spp
Genie logiciel eseo-v1.1-1sppGenie logiciel eseo-v1.1-1spp
Genie logiciel eseo-v1.1-1sppLaurent Guérin
 
Devoxx 2011 - Scaffolding with Telosys
Devoxx 2011 - Scaffolding with TelosysDevoxx 2011 - Scaffolding with Telosys
Devoxx 2011 - Scaffolding with TelosysLaurent Guérin
 
Open World Forum 2009 Migration With Telosys
Open World Forum 2009 Migration With TelosysOpen World Forum 2009 Migration With Telosys
Open World Forum 2009 Migration With TelosysLaurent Guérin
 
Solutions Linux Développement Rapide Java
Solutions Linux Développement Rapide JavaSolutions Linux Développement Rapide Java
Solutions Linux Développement Rapide JavaLaurent Guérin
 

Plus de Laurent Guérin (11)

My web application in 20 minutes with Telosys
My web application in 20 minutes with Telosys My web application in 20 minutes with Telosys
My web application in 20 minutes with Telosys
 
Telosys project booster Paris Open Source Summit 2019
Telosys project booster Paris Open Source Summit 2019Telosys project booster Paris Open Source Summit 2019
Telosys project booster Paris Open Source Summit 2019
 
MQTT avec Mosquitto et Paho - DevFest Brest 2019
MQTT avec Mosquitto et Paho - DevFest Brest 2019MQTT avec Mosquitto et Paho - DevFest Brest 2019
MQTT avec Mosquitto et Paho - DevFest Brest 2019
 
MQTT avec Mosquitto et Paho - Laurent Guerin - JUG Nantes Nov 2018
MQTT avec Mosquitto et Paho - Laurent Guerin - JUG Nantes Nov 2018MQTT avec Mosquitto et Paho - Laurent Guerin - JUG Nantes Nov 2018
MQTT avec Mosquitto et Paho - Laurent Guerin - JUG Nantes Nov 2018
 
Sogeti labs developer-today-v1.1
Sogeti labs developer-today-v1.1Sogeti labs developer-today-v1.1
Sogeti labs developer-today-v1.1
 
DevOps MeetUp NL - Docker (Oct 2014)
DevOps MeetUp NL - Docker (Oct 2014)DevOps MeetUp NL - Docker (Oct 2014)
DevOps MeetUp NL - Docker (Oct 2014)
 
Bean Validation - Cours v 1.1
Bean Validation - Cours v 1.1Bean Validation - Cours v 1.1
Bean Validation - Cours v 1.1
 
Genie logiciel eseo-v1.1-1spp
Genie logiciel eseo-v1.1-1sppGenie logiciel eseo-v1.1-1spp
Genie logiciel eseo-v1.1-1spp
 
Devoxx 2011 - Scaffolding with Telosys
Devoxx 2011 - Scaffolding with TelosysDevoxx 2011 - Scaffolding with Telosys
Devoxx 2011 - Scaffolding with Telosys
 
Open World Forum 2009 Migration With Telosys
Open World Forum 2009 Migration With TelosysOpen World Forum 2009 Migration With Telosys
Open World Forum 2009 Migration With Telosys
 
Solutions Linux Développement Rapide Java
Solutions Linux Développement Rapide JavaSolutions Linux Développement Rapide Java
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