xebicon'17 : fluo, les choix déterminants pour une startup innovante et productive - arthur...
TRANSCRIPT
Florent Le GallDéveloppeur full-stack @ Fluo
@flornt
Thierry AbaléaCTO @ Fluo
@ThierryAbalea
Arthur SudreDéveloppeur full-stack @ Xebia
@ASudre
Fluo
Les enjeux de Fluo
→ Développer de nombreux services à partir de composants métiers communs
→ Accroître la vélocité
→ Vaincre la spécialisation
→ Faciliter le recrutement
→ Garantir fiabilité et sécurité dans le contexte bancaire / assurantiel
Mono-repo JS Moderne Infra As Code
→ Développer de nombreux services à partir de composants métiers communs
→ Accroître la vélocité
→ Vaincre la spécialisation
→ Faciliter le recrutement
→ Garantir fiabilité et sécurité dans le contexte bancaire / assurantiel
Mono-repo
L’approche mono-repository
Mutualiser le code
→ Via les bibliothèques de code ?
→ Via des micro-services ?
On a toujours besoin de bibliothèques de code !
L’approche mono-repository
Mutualiser le codeVersionner chaque bibliothèque et chaque service dans son repository ?
Service B
Common Library
Service A
V1
Uses CommonLibrary@V1 Uses CommonLibrary@V1
V1V1
L’approche mono-repository
Mutualiser le codeVersionner chaque bibliothèque et chaque service dans son repository ?
Service B
Common Library
Service A
V2
Uses CommonLibrary@V2 Uses CommonLibrary@V1
V1V2
→ Qui modifie le service B ?
L’approche mono-repository
Mutualiser le codeVersionner toutes les bibliothèque et services dans un seul repository !
Service B
Common Library
Service A
L’approche mono-repository
Pas d’Intégration Continue avec un workflow à base de branches
→ Contraire à l’Intégration ContinueMartin Fowler: “ The whole idea is that nobody is working on a code base that deviates significantly from anyone else’s. ”
→ Refactorisations transverses extrêmement compliquées
→ Travail des développeurs en silo
L’approche mono-repository
Trunk Based Development
→ Comment s’assurer qu’on peut releaser à tout le moment ?
→ Grâce au feature toggles !
→ Les features toggles doivent être testées !
L’approche mono-repository
Difficultés de l’approche monorepo
→ Upgrade global & atomique des versions des dépendances extérieures
→ Exige une équipe polyvalente et un travail d’équipe
→ Codes Review plus difficiles avec les outils standards
L’approche mono-repository
Disclaimer
Un monorepo n’implique pas une application monolithique
L’approche micro-services n’implique pas un repository par service
L’approche mono-repository
Conclusion
→ Apport majeur: l’Intégration Continue
→ Approche Trunk Based Development déstabilisante pour les nouveaux
→ Pré-requis : une équipe “mature” et une dette technique maîtrisée
→ Développer de nombreux services à partir de composants métiers communs
→ Accroître la vélocité
→ Vaincre la spécialisation
→ Faciliter le recrutement
→ Garantir fiabilité et sécurité dans le contexte bancaire / assurantiel
JS Moderne
Le JS moderne chez Fluo
JavaScript un choix évident pour Fluo ?
→ Fluo sur mobile → Fluo sur le web
Début 2016
Le JS moderne chez Fluo
JavaScript un choix évident pour Fluo ?“One language to rule them all”
→ Typé statiquement par défaut
→ Très approprié pour les backends
→ Plutôt exotique sur les frontends
Le JS moderne chez Fluo
JavaScript un choix évident pour Fluo ?“One language to rule them all”
→ Typé dynamiquement par défaut
→ Approprié pour les backends
→ Très approprié pour les frontends
Le JS moderne chez Fluo
1- Décomposition (spreading)Quelques fonctionnalités fournies par ES2015, ES2016 et ES2017
Le JS moderne chez Fluo
2 - Affectation par décomposition (destructuring assignment)
contractDetails.js
Quelques fonctionnalités fournies par ES2015, ES2016 et ES2017
Le JS moderne chez Fluo
Quelques fonctionnalités fournies par ES2015, ES2016 et ES20173 - Modules (import / export)
…file.js
Le JS moderne chez Fluo
4 - Async / AwaitQuelques fonctionnalités fournies par ES2015, ES2016 et ES2017
Le JS moderne chez Fluo
Le JavaScript typé statiquementPourquoi ?
→ Un filet de sécurité
→ Aider au développement
→ Faciliter les changements dans le code
→ Garantir la cohérence dans le code
Choix de Node.js en backend
Le JS moderne chez Fluo
→ Transpilation
→ Async / Await
→ Même langage entre le frontend et le backend
React.js pour les frontends
Le JS moderne chez Fluo
→ Simple et facile
→ Expérience développeur au top !
React Native pour le mobile
Le JS moderne chez Fluo
→ Expérience développeur aussi bonne que sur le web
→ Pas de spécialisation Android / iOS
Les limites du tout JavaScript
Le JS moderne chez Fluo
→ Faible maturité des APIs
→ Investissement en tooling nécessaire
→ Développer de nombreux services à partir de composants métiers communs
→ Accroître la vélocité
→ Vaincre la spécialisation
→ Faciliter le recrutement
→ Garantir fiabilité et sécurité dans le contexte bancaire / assurantiel
Infra As Code
Historique - Des moyens rudimentaires
Infra As Code chez Fluo
→ Installation / Mise à jour des “middlewares”: apt-get
→ Déploiement des applications Fluo: tar, scp & ssh
→ OVH VPS (Virtual Private Server)
Historique - Problèmes
Infra As Code chez Fluo
→ État (state) d’un serveur peu prédictible (non immutable)
→ Peur de mettre à jour les packages (Apache, Tomcat, ...)
→ Déploiements fastidieux et sujets aux erreurs
Pourquoi le choix de docker ?
Infra As Code chez Fluo
→ facilité de déploiement
→ portabilité
→ légèreté (mémoire disque et RAM)
→ orientation micro-services
Avantages de Docker sur Puppet/Chef/Ansible
Infra As Code chez Fluo
→ Testé et validé une fois pour toute depuis la CI
→ Déploiement atomique: pas de dérive de la configuration
→ Même livrable partout
Immutable
Infra As Code chez Fluo
→ Changement nécessaire ⇒ nouvelle image
→ Une image n’est pas modifiable
Et le reste ?
Infra As Code chez Fluo
→ Tout élément d’infra n’est pas basé sur une image :- DNS- Bucket S3- VPC- RDS- Règles Firewall- ...
Outils pour le provisioning et la configuration des ressources AWS
Infra As Code chez Fluo
→ Outil de gestion de configuration :- Puppet- Ansible- Chef
→ Outils d’orchestration :- AWS Cloudformation- HashiCorp Terraform
→ AWS SDK
Terraform
Infra As Code chez Fluo
→ particulièrement adapté à Docker
→ déclaratif : on décrit l’état attendu
Terraform
Infra As Code chez Fluo
→ Ressources AWS gérées : EC2, ALB, RDS, IAM, VPC, ...
→ 70 providers : AWS, Google Cloud, Microsoft Azure, ...
Conclusion
Infra As Code chez Fluo
→ Approche immutable convaincante
→ Courbe d’apprentissage assez élevée pour des développeurs
→ Le pragmatisme paye
Pour conclureEnjeux
→ Développer de nombreux services à partir de composants métiers communs
→ Accroître la vélocité
→ Vaincre la spécialisation
→ Faciliter le recrutement
→ Garantir fiabilité et sécurité dans le contexte bancaire / assurantiel
React Native Web
Le JS moderne chez Fluo
→ Un composant React Native dans le Back-office Fluo (React JS)
Qu’est-ce que le JS moderne pour Fluo ?
Utiliser les fonctionnalités fournies par ES2015 et ES2017Classes
Before After
Paradigme fonctionnel
Qu’est-ce que le JS moderne pour Fluo ?
→ Immutabilité→ Fonctions pures→ Fonctions d’ordre supérieur
Notions utilisées
Fonctions classiques
→ map→ filter→ reduce
Exemple
Multi comptes AWS
Infra As Code chez Fluo
→ Le multi comptes a un léger surcoût mais le ROI est clair
→ Meilleur isolation entre comptes en terme de:● sécurité (IAM perfectible)● auditabilité● coût: visibilité par environment
Pourquoi le choix de terraform comme infra-as-code ?
Infra As Code chez Fluo
Tableau tiré de https://blog.gruntwork.io/why-we-use-terraform-and-not-chef-puppet-ansible-saltstack-or-cloudformation-7989dad2865c
Chef Puppet Ansible SaltStack CloudFormation Terraform
Code Open source Open source Open source Open source Closed source Open source
Cloud All All All All AWS only All
Type Config Mgmt Config Mgmt Config Mgmt Config Mgmt Orchestration Orchestration
Infrastructure Mutable Mutable Mutable Mutable Immutable Immutable
Language Procedural Declarative Procedural Declarative Declarative Declarative
Architecture Client/Server Client/Server Client-Only Client/Server Client-Only Client-Only
Exemple de l’usage de terraform
Infra As Code chez Fluo
example.tf
→ Télécharge les “providers” : provider.aws
…
…
…
→ Planifie les changements
Exemple de l’usage de terraform
Infra As Code chez Fluo
→ Exécute le plan
…
→ Création des services
→ Sauvegarde d’un état
● terraform.tfstate● terraform.tfstate.backup
Infra As Code chez Fluo
→ Exécute
example.tf
Exemple de l’usage de terraform
→ Mise à jour du service et sauvegarde de l’état
Exemple de l’usage de terraform
Infra As Code chez Fluo
→ Planifie la destruction
→ Supprime l’instance
… → Sauvegarde du nouvel état
● terraform.tfstate● terraform.tfstate.backup
→ Suppression des services
Exemple de l’usage de Docker
Infra As Code chez Fluo
Image de base : node:7.10
Création du dossier de l’application
Téléchargement des modules
Copie du mono-repo
Remplacement des données sensibles grâces aux clés AWS
Compilation de l’application
Commande d’exécution de l’imageDockerfile
Le JS moderne chez Fluo
Utiliser les fonctionnalités fournies par ES2015 et ES20171- Fat Arrow
Before After