inversion of control with nuun
TRANSCRIPT
Epo Jemba @ejemba Lundi 11 juillet 1 / 44
L‘IOC avec Nuun.io
« Develop using your own rules »
Epo Jemba @ejemba Lundi 11 juillet 2 / 44
Votre guide
● Architecte Logiciel Senior Ronin (i.e. indépendant)
● 17 ans de vadrouille dans le monde de l‘ingénierie logicielle
● Polyglote ou «language agnostic» (Java, Go, Scheme, Ada, Bash, Clojure, Scala,..)
● Étudie sur les architecture scalable (Openshift, Kubernetes, Docker, ...)
● Aime le libre, l‘art de coder et concevoir des applications belles et durables
Epo Jemba @ejemba Lundi 11 juillet 3 / 44
Agenda
● Définition : L‘inversion de contrôle
● Presentation de nuun
● Demo : L’inversion de contrôle avec nuun kernel
Epo Jemba @ejemba Lundi 11 juillet 4 / 44
Métaphore de la rivière
Conte écologique
Epo Jemba @ejemba Lundi 11 juillet 5 / 44
Tous les jours, je pars travailler
Epo Jemba @ejemba Lundi 11 juillet 6 / 44
je marche, je suis en contrôle.
Epo Jemba @ejemba Lundi 11 juillet 7 / 44
Un jour, je change de travail
Epo Jemba @ejemba Lundi 11 juillet 8 / 44
Une rivière sur le chemin !
Epo Jemba @ejemba Lundi 11 juillet 9 / 44
Nager ?
Epo Jemba @ejemba Lundi 11 juillet 10 / 44
Nager : Pour et Contre
● Pour
– On ne dépend de rien ni de personne #yolo
– On est en contrôle complet,
– Sensation totale de l’expérience● Contre
– On met plus de temps
– On doit se sécher
– C’est un peu dangereux
Epo Jemba @ejemba Lundi 11 juillet 11 / 44
Un bateau
Epo Jemba @ejemba Lundi 11 juillet 12 / 44
Bateau : Pour et Contre
● Pour
– On ne se mouille pas, pas besoin de se sécher
– On arrive plus vite
– c’est moins dangereux
– Moins de contexte switching
● Contre
– On maitrîse un moins,
– Moins de sensations,
– Et surtout, →
Epo Jemba @ejemba Lundi 11 juillet 13 / 44
Il faut acquerir un bateau ...
Epo Jemba @ejemba Lundi 11 juillet 14 / 44
La métaphore s’arrête ici.
Le monde numérique s’affranchissant de certaines barrières,
le temps/homme et l’expertise sont
partageables plus facilement aussi grâce aux logiciels libres et à l’opensource.
Epo Jemba @ejemba Lundi 11 juillet 15 / 44
L’inversion de contrôle est donc un principe général que l’on retrouve
IRL comme dans la programmation
Epo Jemba @ejemba Lundi 11 juillet 16 / 44
1
On utilise l’inversion de contrôle quand on a un besoin réel voire un point réellement bloquant ce n’est pas juste de la factorisation de code
Car elle a un coût
Epo Jemba @ejemba Lundi 11 juillet 17 / 44
2
L’Inversion de contrôle délègue la résolution d’une problématique précise à une solution
tierce
Epo Jemba @ejemba Lundi 11 juillet 18 / 44
3
En pratique la solution tierce vient souvent de vendeurs de solutions
Epo Jemba @ejemba Lundi 11 juillet 19 / 44
4
Les vendeurs de solutions proposent souvent leurs conventions bonnes ou mauvaises où ..
Epo Jemba @ejemba Lundi 11 juillet 20 / 44
On a un menu → xml → annotation style 1
Mais on aimerait aller voir en cuisine pour apprendre à se faire ses propres recettes
Epo Jemba @ejemba Lundi 11 juillet 21 / 44
Déclinaison de l’inversion de contrôle
● S.O.L.I.D. : le D est D.I. « Dependency Inversion ». L’ « Inversion de dépendance » est un principe basé sur la notion d’interface permettant de mettre en œuvre l’IOC dans son code
● D.I. « Dependency Injection » .L’«injection de dépendance » un pattern délégant l’instanciation et l’affectation des dépendances
● A.O.P. : La programmation orientée aspect permet également la mise en œuvre de l’IOC.
● Ces 3 concepts servent au final à définir les propriétés statiques et dynamiques de l«Object Graph» de l’application.
Epo Jemba @ejemba Lundi 11 juillet 22 / 44
Problématiques d’industrialisation
● Définition de l’Object Graph (DI, AOP,…)
● Configuration (JNDI, etcd, )
● Gestion de la modularité
● Gestion de l’extensibilité
● Prise en compte de la configuration de nouveaux framework complexe etc
● Le tout sans xml et avec son propre style
Epo Jemba @ejemba Lundi 11 juillet 23 / 44
Convention vs Configuration 1/2
● Les conventions sont l’outil le plus commun pour palier à la perte de contrôle,
● Suivre des conventions empêchent de se perdre quand le flow du code source est caché
● Utiliser ses propres conventions dans une organisation, est facteur clés de réussite
Epo Jemba @ejemba Lundi 11 juillet 24 / 44
Convention vs Configuration 2/2
● Trop de configuration apporte de la friction
● L’utilisation de valeurs par défaut saines et cohérente est un bon principe
● Nous cherchons tous l’auto-configuration
Epo Jemba @ejemba Lundi 11 juillet 25 / 44
nuun.io
est une micro lib permettant la mise en oeuvre l’inversion de contrôle
Epo Jemba @ejemba Lundi 11 juillet 26 / 44
● Nuun est un µframework permettant de concevoir des piles logicielles et des applications non triviales en se basant sur l’inversion de contrôle en Java/Scala/Kotlin/etc
● Nuun s’appuie sur des composant standards et éprouvés
– la JSR 330 pour gérer la DI (via guice)
– ServiceLoader
– Reflections
– Plus une architecture Kernel/Plugin unique
● Il est compatible avec les majeurs DI containers du marché.
Epo Jemba @ejemba Lundi 11 juillet 27 / 44
Vue générale de nuun.io
Epo Jemba @ejemba Lundi 11 juillet 28 / 44
Epo Jemba @ejemba Lundi 11 juillet 29 / 44
Fonctionnement général
● Le kernel doit fournir le graphe de l’application
● Pour cela il s’appuie sur les plugins en aggregeant leur fragments de configuration en une configuration globale
● La configuration est donc toujours fonction de l’environnement de l’application (classpath, ressources, etc ...)
Epo Jemba @ejemba Lundi 11 juillet 30 / 44
Détail du protocole Kernel / Plugin
Epo Jemba @ejemba Lundi 11 juillet 31 / 44
Chargement du kernel
Epo Jemba @ejemba Lundi 11 juillet 32 / 44
Chargement des plugins
Epo Jemba @ejemba Lundi 11 juillet 33 / 44
Les plugins envoient des requètes au kernel
Epo Jemba @ejemba Lundi 11 juillet 34 / 44
Le kernel scanne le classpath en fonction des requètes des plugins
Epo Jemba @ejemba Lundi 11 juillet 35 / 44
Le kernel retourne le résultat de chaque requète à chaque plugin
Epo Jemba @ejemba Lundi 11 juillet 36 / 44
À partir des résultats du kernel chaque plugin construit sa configuration dynamique
Epo Jemba @ejemba Lundi 11 juillet 37 / 44
Chaque plugin retourne son fragment de configuration
Epo Jemba @ejemba Lundi 11 juillet 38 / 44
Le kernel détermine la configuration globale et peut ainsi construire l’injecteur.
Epo Jemba @ejemba Lundi 11 juillet 39 / 44
L’injecteur comprend le modèle du graphe de l’application
Epo Jemba @ejemba Lundi 11 juillet 40 / 44
Done !
● Ce processus se passe au début de l’application une seule fois et dure moins de 200 ms
● Il permet d’avoir un niveau de flexibilité quasi illimité et nous allons le voir une définition d’injection de dépendance, d’AOP complètement dynamique
● Ce qui permet de définir nos propres conventions
Epo Jemba @ejemba Lundi 11 juillet 41 / 44
API Complète
API
● Kernel Lifecycle
● Kernel params
● Plugin Lifecycle
● Request API
● Plugin Dependencies
● Integration Tests
SPI
● DI Provider
● Concerns
● Multi-Round initialisat°
● Kernel Extension
● Kernel params aliases
Epo Jemba @ejemba Lundi 11 juillet 42 / 44
Démo Time
Epo Jemba @ejemba Lundi 11 juillet 43 / 44
From zero to productive with nuun
● Street Fighter – Static DI
● Street Fighter – IOC ++
– Custom launcher
● Crash with 2 launcher – Detect Pattern in our code then automate their
configuration – The sound (SF2PluginTest)
– «Here comes a new challenger»
● Monoidish Runner for the launcher
Epo Jemba @ejemba Lundi 11 juillet 44 / 44
Credits
● https://unsplash.com/@michaeljohnlum
● Pirogue fileuse dont les dossiers sont ornés de motifs variésPhot. S. François © Inventaire général, ADAGP, 2001
● Petit chantier de construction de pirogues, les coques monoxyles attendent les bordagesPhot. S. François © Inventaire général, ADAGP, 2001
● https://unsplash.com/zack_silver
●