Upload
antoine-rey
View
3.786
Download
1
Embed Size (px)
Citation preview
#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
<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
#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
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