logo Koumoul

Architectures Orientées Web

koumoul.com - contact@koumoul.com

Application servicialisée

  • Pas de livraison (téléchargement automatique)
  • Pas d'installation, si ce n'est un client pour l'utiilser
  • Mises à jours automatiques
  • Nécessite une connection internet pour fonctionner
  • Le client est dépendant de l'OS, pas l'application
  • Exemple : Google Docs
Architectures orientées services
  • C'est une représentation logique d'une activité métier avec un résultat attendu.
  • Elle est auto-contenue.
  • C'est une boite noire pour ses utilisateurs.
  • Elle peut être composée de sous-services.
Principes fondateurs
  • La valeur métier est plus importante que la stratégie technique.
  • L'inter-operabilité intrinsèque est plus importante que les intégrations spécifiques.
  • Il vaut mieux avoir des services génériques partagés que des implémentations spécifiques.
  • La flexibilité est plus importante que l'optimisation.
  • Il vaut mieux rafiner progressivement qu'essayer de faire parfait dès le début.
Pas de standard quand à la composition d'une architecture orientée services. Les services sont en général :
  • Contractualisés
  • Autonomes
  • Accessibles
  • Boîtes noires
  • Composables
  • Réutilisables
  • (Auto-découvrables)
  • (Composés de services qui n'etaient pas prévus pour une architecture SOA)

L'architecture mono-service

  • Toutes les fonctionnalités sont réalisées dans le même service
  • Utilisateurs, documents, évènement, discussions, ...
  • Le service peut devenir complexe à maintenir et à faire évoluer

L'architecture micro-services

  • Apparue au début de la décénie
  • Popularisée par Netflix
  • Considérée (a tord) comme un remède miracle
Principe
  • La philosophie est identique à celle du monde UNIX : "Faire une seule chose mais bien le faire"
  • Les services sont petits et ne font qu'une seule fonction
  • Le déploiement et le test automatique sont indispensables
  • Durant la conception, il faut vivre avec les erreurs et les pannes, quite à en provoquer
  • Chaque service est élastique, résistant, composable, minimal et complet
Intérêt
  • Coût de mise en place supérieur
  • Maintenance simplifiée et moins coûteuse
Exemple : redimensionnement de miniature
L'utilisateur charge une photo ou image pour son profil et celle-ci est redimensionnée automatiquement pour bien s'intégrer au site.
Eviter les nano-services (1)
  • Les micro-services trop petits sont un anti-pattern
  • Surcharge de code écrit (et donc de bugs)
  • Surcharge d'exécution : transformations, trafic réseau
  • Logique fragmentée : la fonctionnalité est distribuée sur plusieurs services
  • surcoût de conception et de maintenance
Eviter les nano-services (2)
  • Packager une fonctionnalité en tant que librairie plutot que service
  • Combiner la fonctionnalité avec d'autres pour avoir un service un peu plus conséquent
  • Refactoriser le système : refaire son design ou mettre la fonctionnalité dans d'autres services existants

Faire évoluer une architecture mono-service

  • Conception initiale ou évolutions qui ont ajouté des fonctionnalité
  • Le service devient trop complexe à maintenir
  • Evolutions compliquées, difficile d'ajouter de nouveaux composants dans nouveaux langages
Tout rédévelopper en plusieurs services
  • On redéveloppe tous les services de la même manière
  • Stack homogène
  • Mauvaise idée : Big-bang = catastrophe
  • Nécessite un investissement conséquent sur une période étalée
  • Maintenance en double
Transition progressive
  • On identifie bien les briques de fonctionnalités qui peuvent être isolées
  • On les servicialise et on les intègre une a une
  • On peut aussi s'interfacer avec des services existants
  • Stack qui peut être hétérogène
  • Le reste du produit peut encore évoluer

Authentification

Centralisée
  • Session centralisée dans le serveur
  • Latence aditionnelle
  • Single point of failure
Par jeton
  • JSON Web Token (JWT)
  • Le jeton porte la session
  • Il est stocké coté client
  • Emis dans chaque requête HTTP (header)
  • Il est signé par la clé privée du fournisseur d'authentification
  • Les services qui ont la clé publique du fournisseur d'authentification peuvent le vérifier
  • La durée du jeton peut être plus longue
  • Serveur reste stateless

Architecture Web

Nombre de services
  • Il va dépendre du découpage fonctionnel
  • Cartographie applicative alignée sur la cartographie métier
Choix de la stack
Bases de données
Rendu coté serveur ou coté client ?
  • Coté serveur : SEO, plus léger pour le client, mais plus coûteux en resources
  • Coté client : Single Page Application
  • Librairies accessibles avec des CDN
  • On peut faire les 2 !
API des services backends
  • Points d'entrée pour les clients Web et les autres services
  • La documentation et la contractualisation sont essentielles
  • Bien respecter la modélisation REST et les verbes HTTP
  • Un verbe = une action (GET, POST, PUT, DELETE, ...)
  • Ne pas mettre d'états dans le service ! (stateless => scalable)
  • Peut se concevoir rapidement en wrappant un service existant
  • Bien maitriser l'asynchronisme !
Contrat / documentation d'API
Compatibilité ascendante
  • Elles sont faites pour être utilisées par d'autres applications
  • Compatibilité non assurée => application cassée
  • Versionner les API
  • Privilégier les ajouts à de la réécriture
  • Bien documenter les changements entre les versions
Interface cliente
  • HTML (contenu) + CSS (forme) + Javascript (dynamisme + interactions)
  • L'utilisateur ne voit que ca, pas tout ce qu'il y a derrière
  • Les clients web n'ont plus rien a envier des applications installées
  • Belles animations, ergonomies matures
  • On peut même faire de la 3D dans le naviagateur (jeux possibles)
Reverse proxy
  • Nginx, HA proxy, Traefik, ...
Expérience utilisateur
  • Reste le point le plus important
  • La latence doit être inférieure à 1 seconde
  • L'architecture est construite dans ce but
  • Bien maitriser les proxys, les caches, CDN ...

Automatisation

Devops
  • Development + Operations
  • Objectifs contradictoire : fonctionnalité vs stabilité
  • Dévelopements, Déploiements, tests, déploiements, test, ...
  • Feedback / amélioration rapide sur des petites itérations
  • Mesures, analyses, surveillance
Amélioration continue
Développement
Build
  • Objectif : préparer le livrable
  • Déclenché au commit
  • Peut se décomposer en plusieurs phases
  • Si tous les indicateurs sont au vert, un livrable est créé
  • Différents types : archive, conteneur, image, tag dans un SCM, ...
Tests
  • Les tests unitaires font partie du développement
  • Tests d'intégration
  • Les tests sont programmés ou enregistrés
  • Tests d'API et test d'UI
  • Testcomplete, SoapUI, Selenium, ...
Release
  • Le livrable a un code (peut être lié a un hash de commit)
  • Le livrable est promu
  • On peut avoir une étape intermédiaire : release candidate
  • Mise a jour dans le gestionnaire de code (tag)
Déploiement
  • Le livrable est installé dans un ou plusieurs environnements
  • Processus automatisé : Ansible, Docker, ...
  • Les configurations de déploiement peuvent être versionnées
  • Bien maitriser la configuration des proxys
Exploitation
  • Mise en place de contrôles et d'alertes
  • Ajustement par rapport à la charge (Load balancing)
  • Collecte d'indicateurs (Monitoring)

Avenement du cloud

Outils en ligne
  • SCM : Gitlab, Github, ...
  • Build : Gitlab, TravisCI, ...
  • Registres docker : Gitlab, Dockerhub, ...
  • Test, monitoring, ...
Hébergement de machines virtuelles
  • Provisionnées en quelques minutes
  • Peuvent être conséquentes et supporter beaucoup de machine
  • Très facile de composer sa propre architecture / sous-réseau
  • On peut s'adapter facilement aux variations et pics de charge
  • Il faut des compétences d'opérationel
Hébergement de conteneurs
  • Les conteneurs sont plus légers que les VM
  • Conteneurs déployés en quelques secondes
  • On ne s'occupe plus du matériel
  • Très facile de composer sa propre architecture / sous-réseau
  • On peut s'adapter encore plus facilement aux variations et pics de charge
  • Compétences d'opérationel plus restreintes
La conteneurisation gagne du terrain !

Merci !

Des questions ?