Devoxx 2017 : retour sur les dernières innovations Java

Comme d’habitude, énormément de sujets sont abordés au Devoxx avec pas moins de 8 tracks en parallèle. Voici le détail des sujets qui me paraissent très intéressants pour les mettre en pratique cette année !

Du 5 au 7 avril s’est déroulée la 6ème édition de Devoxx, la plus grande conférence française de l’écosystème Java. Comme d’habitude, énormément de sujets sont abordés dans pas moins de 8 tracks en parallèle. Voici le détail des sujets qui me paraissent intéressants à mettre en pratique cette année !

Terraform :

Terraform est un outil d’infra-as-code déclaratif et open source tout droit sorti des laboratoires HashiCorp. Il est à la fois simple et puissant et s’interface très bien avec les fournisseurs de services cloud les plus populaires. Dans cette présentation Yannick Lorenzati , a montré  comment créer une infrastructure simplement et rapidement sans passer par l’interface graphique. Retrouvez les slides de Terraform 101.

Les fonctionnalités clés de Terraform sont :

  • Infrastructure as Code : Terraform permet de décrire des infrastructures avec une syntaxe très générique et de haut niveau (faisant abstraction des fournisseurs d’infrastructure). Cela permet de modéliser les ressources d’une architecture applicative.
  • Execution Plans : Terraform permet de simuler les modifications qui vont être appliquées sur une infrastructure afin de prévoir et limiter les mauvaises surprises ou erreurs.
  • Resource Graph : Terraform construit un graph de toutes les ressources utilisées et parallélise la création et la modification de toutes les ressources indépendantes..

Ci-après un exemple de fichier test.tf pour la création d’un groupe de ressources dans le cloud Azure :

# Configure the Microsoft Azure Provider provider "azurerm" {   subscription_id = "your_subscription_id_from_script_execution"   client_id       = "your_client_id_from_script_execution"   client_secret   = "your_client_secret_from_script_execution"   tenant_id       = "your_tenant_id_from_script_execution" } # create a resource group resource "azurerm_resource_group" "helloterraform" {     name = "terraformtest"     location = "West US" }

Tous les informations de souscription sont disponibles dans le portal azure https://portal.azure.com Le fichier peut être enrichi pour configurer la création d’une vm sur le cloud azure. Pour tester avant déploiement (Execution Plan), exécuter la commande : 

terraform plan

Pour déployer, exécuter la commande : terraform apply

Pour supprimer les éléments d’infrastructure créés par Terraform précédemment : terraform destroy  

Introduction à la détection d’anomalies avec Graphite :

Francois NOLLEN nous a montré comment créer des alarmes relativement élaborées avec les fonctions Graphite et des outils comme Grafana, Seyren ou Cerebro. Graphite est un outil opensource très répandu pour suivre des indicateurs divers : infra, réseau, données applicatives, KPIs métier, mesures météo, etc. La présentation vidéo est disponible ici : Introduction à la détection d'anomalies avec Graphite . Francois NOLLEN a abordé trois sujets intéressants :

  • Limites du Dashboard: Les dashboards sont très visuels et peuvent communiquer beaucoup d’informations -- > mettre en place des alarmes. Ainsi, dès qu’un signal dépasse un certain seuil, l’équipe prod,dev,… sont alertés.
  • Limites de la détection classique à base de seuils et d'écarts : la maintenance de seuils d’alerte n’est pas optimale, les tendances périodiques ne sont pas prises en compte, et il y a beaucoup de faux négatifs.
  • Techniques de détection d'anomalies avec Graphite: Lissage, prise en compte de l'historique, algorithmes. Ces Techniques ont été montrées à travers une demo de cerebro, un outil développé chez Voyage-SNCF, et entièrement disponible sur GitHub, pour manipuler Graphite et fournir une interface graphique user friendly.

Java 9 :

Jean-Michel Doudoux nous fait découvrir les nouveautés de Java 9 en omettant volontairement la modularisation JIGSAW (JSR 376). Retrouvez les Slide Java 9 ici :  slides de Java 9. Ci-après les principales nouveautés qui vont améliorer/accélérer les développements des applications java :

  • Stack-Walking API : permet de Parcourir une stack d’execution de naviguer et d’interagir avec ses éléments et de filtrer les packages qui vous intéresse Grâce à cette API, lors d’une erreur, il est désormais possible de filtrer les classes en supprimant par exemple toutes les mentions de framework/proxies pour ne conserver que les classes métiers de l’application. Ci-après un exemple d’utilisation :

private static List<String> walkAndFilterStackframe() {   return StackWalker.getInstance().walk(s ->     s.map( frame -> frame.getClassName() + "/" + frame.getMethodName())            .filter(name -> name.startsWith("fr.sqli"))            .limit(10)            .collect(Collectors.toList()) ); }           .limit(10)            .collect(Collectors.toList()) ); }

 

  • Renforcement de la sécurité : un type publique (interface, classe, enum, …) n’est plus si publique que cela ! Si vous ne précisez rien, vos types publics sont visibles par l’ensemble des types du module dans lequel ils sont définis mais ne seront pas visibles depuis un autre module.

Java 9 introduit un nouveau niveau de visibilité : un package peut être « exporté » explicitement. Les types publiques de ce package (mais pas de ses sous packages) seront alors visibles depuis un autre module.  Cette configuration doit s’effectuer dans le fichier module-info.java définit dans la racine du module :

module fr.sqli.service {     exports fr.sqli.model;     export fr.sqli.dao }

  • Jshell: Java Shell : beaucoup de langages (ruby, scala, python, …) proposent une Read-Evaluate-Print-Loop (REPL). C’est un interpréteur interactif pour tester rapidement quelques lignes de code. Jshell est disponible dans le répertoire %JAVA_HOME%/bin/jshell

jshell> int divide(int x, int y) {   ...>     return x / y;   ...> }|  created method divide(int,int) jshell> divide(5, 0)|  java.lang.ArithmeticException thrown: / by zero|        at divide (#1:2)|        at (#2:1)                             jshell> /list                                                               1 : int divide(int x, int y) {           return x / y;       }                                                                                                                                                                   2 : divide(5, 0)