23
#DevoxxFR Quoi de neuf à Devoxx France 2017 ? Antoine Rey 1

Quoi de neuf à Devoxx France 2017 ?

Embed Size (px)

Citation preview

#DevoxxFR

Quoi de neuf à

Devoxx France 2017 ?

Antoine Rey

1

2

#DevoxxFR

Les modules débarquent

enfin !

3

10 ans d’attente pour voir débarquer les modules dans Java 9

Le JDK fait sa révolution :

• Graphe de dépendances au runtime

• Le classpath est mort, vive le module-path

• Adieu au rt.jar et au tools.jar

• Deep reflection interdite

Migration facilitée par le mixed mode, les auto-modules et les options de débrayage de la JVM

#DevoxxFR

Les modules débarquent

enfin !

4

Exemple de module-info.java :

module com.myapp.dao {

requires java.sql;

requires transitive com.myapp.utils;

export com.myapp.dao.api;

}

Par défaut, aucun package n’est exporté vers l’extérieur.

#DevoxxFR

Java 9, what else ?

5

Sortie prévue pour le 27 juillet 2017

Evolutions du langage :

• Méthodes privées dans les interfaces

• Opérateur <> dans classe anonyme

• @SafeVarags sur méthodes privées

• Identifiant _ désormais interdit

Nouvelles API :

• StackWalking API

• Reactive Stream

• HTTP/2 Client

#DevoxxFR

Java 9, what else ?

6

Evolutions des APIs :

• Améliorations de l’API Process

• Fabrique de collections immutables

• Classe Optional et API Stream enrichies

• Spin-wait hints

Mise à jour des outils du JDK :

• Réorganisation de la structure du JDK

• Syntaxe GNU pour les options de la ligne de commande

• Multi-release jar files

• JShell : interpréteur interactif en ligne de commandes

Map<String, String> map =

Map.of("key1", "value1",

"key2", "value2");

ProcessHandle.current().getPid())

#DevoxxFR

Java 9, what else ?

7

Amélioration de la JVM :

• G1 devient le Garbage Collector par défaut

• Compact String

• Indify String concatenation

Support de standards :

• JavaDoc générée en HTML 5 + JS

• UTF-8 dans les fichiers properties

• Support de SHA-3 dans JCE

#DevoxxFR

Vue.js, le petit nouveau

<v-beer v-on:ajout="ajoutPanier" :item="produit"></v-beer>

#DevoxxFR

Vue.js, le petit nouveau

<template lang="html">

<div class="thumbnail »

:class="{ last: item.stock == 1 }">

<img :src="item.image" alt="">

<div class="caption">

<h4>{{item.price | currency}}</h4>

<h4><a href="#">{{ item.label | uppercase }}</a>

</h4>

<p>{{item.description}}</p>

</div>

<button @click="ajouter">Ajouter</button>

</div>

</div>

</template>

<script>

export default {

name: 'beer',

props: ['item'],

methods: {

ajouter () {

this.$emit('ajout', this.item)

}

}

}

</script>

<style lang="css">

</style>

Fichier Beer.vue

La France dans le

cyberespace

#DevoxxFR

Spring Framework 5

Sortie prévue pour juin 2017

Pré-requis : Java 8 et +, Java EE 7 et JUnit 5

Amélioration des performances et diminution de l’empreinte mémoire

Supporte : Java 9, Kotlin

API fonctionnelle pour enregistrer des beans Spring et créer des routes

Nouveauté majeure : Spring WebFlux

#DevoxxFR

Spring Framework 5

#DevoxxFR

Reactive Programming

Modèle classique JavaEE d’un thread par requête HTTP :

• Tous les I/O sont bloquants

• Capacité serveur sous utilisée

Nouveau modèle avec nombre réduit de threads :

• Un I/O Selector thread va gérer les lectures/écritures

• Plusieurs Worker Threads qui vont toujours travailler

#DevoxxFR

Reactive Streams

Architectures micro-services entrainent de nombreuses communications

Sans gestion de débit : risque de saturation d’une application

Buzzword : stratégie de back-pressure

La back-pressure consiste à signaler au producteur que le consommateur est

en surcharge

Un groupe d’experts a créé la spécification Reactive Streams

• Ensemble minimaliste de 4 interfaces

• Implémentées par RxJava, Reactor et Akka Streams

#DevoxxFR

Reactive Streams

onSubscribe()

requestMore(n)

onNext()

requestMore(n)

subscribe()

(x n fois)

#DevoxxFR

Spring WebFlux

@GetMapping(path = "/persons", produces = "text/event-stream")

Flux<Person> getPersons() {

return this.repository.findAll();

}

public interface PersonRepository {

Mono<Person> findOne(String id);

Flux<Person> findAll();

Mono<Void> save(Mono<Person> user);

}

#DevoxxFR

Allo Docker ?

Apparentée à de la virtualisation légère

Les conteneurs partagent de nombreuses ressources avec l’OS hôte

Initialement : Docker est une technologie d’Ops mais pour les dévs

Full Stack versionning : un même artefact contient OS, middleware et

applicatif

Travail conjoint entre Ops et Dév pour construire les images

Disponible nativement sous Linux, BSD et Windows

CaaS platform

#DevoxxFR

Docker Swarm mode

. Swarm est un orchestrateur de conteneurs Docker

Sécurisé : tous les nœuds discutent en TLS

Modèle déclaratif pour arriver à l’état souhaité

Cluster , Service, Task, Network …

Possibilité de réplica pour le même service

Mécanisme de DNS dynamique

Lorsqu’un nœud du cluster tombe, les

conteneurs sont déployés sur d’autres nœuds

#DevoxxFR

REX sur les Microservices

Quelques conseils suite aux retour d’XP de la BNP et de Clever Cloud :

• L’architecture doit être drivée par la developper happiness

• Utiliser le DDD pour identifier les frontières des microservices

• Infra as code avec Docker + automatisation du l’orchestration des déploiements

• Utiliser un Discovery Server (API Gateway) pour simplifier les déploiements et augmenter la résilience

• Pattern CQRS/ES pour garantir la cohérence des données cross-domaines

• Authentifier les appels sans utiliser un serveur d’authentification : JWT ou Macaroons

• Ne pas trop découper : le réseau est lent, vraiment très lent

#DevoxxFR

Log me tender

De l’intérêt d’un service de log en 2017

@Service

class MyService {

private final LogService logService;

public MyService(LogServiceFactory factory) {

this.logService = factory.getLogService(MyService.class);

}

public void foo() {

logService.info("Hello World");

}

}

#DevoxxFR

Log me tender

• Injection par IoC, testable et mockable

• Expose une API métier et technique

• Centralise la gestion des messages : niveau, format …

• API restreinte et moderne utilisant des Supplier :

• Factory toujours nécessaire pour le cas d’utilisation « 1 logger par classe »

void restApiCalled(String path, long ms, int code);

void userLogged(Principal user, Device device);

void log(LogLevel level, Supplier<String> msg, Throwable ex);

#DevoxxFR

En route vers Java 10

Projet Valhalla- Value Types : petites structures de données, efficientes, sans héritage- Generic Specialization : List<int>

Projet Panama

- Vise à remplacer JNI pour faire communiquer la JVM et le code natif

Projet Amber

- Local Variable Type Inference : var a = 3 ;

- Enhanced Enum : enum FavoriteNumber<T extends Number>

- Lambda leftovers : (i, _) -> String.valueOf(i);

Pattern Matching : swith case sur des types

#DevoxxFR

Questions ?

23