Explorez Feign : un autre client Rest en Java ?

Le programme du DevFest Toulouse proposait une conférence sur Feign, (encore) un client REST pour Java. Très curieux, j’ai assisté à la session de live-coding animée par Igor Laborie, expert Java et Web.

Feign(ant) ?

Initialement développé par Netflix, Feign est une librairie open source sous licence Apache qui supporte les versions 7 et 8 de Java. La légèreté de cette librairie est un des premiers points soulevé par le speaker. En effet, sans extension le jar ne pèse que 336 ko et ne possède aucune dépendance. On ne peut s’empêcher de sourire en pensant à Spring et à la longue liste de jars que l’on embarque dans un projet ainsi qu’aux problèmes récurrents de conflit entre les versions.

feign

En utilisant Feign, Igor nous promet un développement rapide, maîtrisé, hautement et facilement “customisable”.

C’est parti pour 40 minutes de programmation, voilà ce qu’il faut en retenir !

CRUD

Feign est un client déclaratif, c’est à dire qu’il simplifie l’écriture des requêtes.

feign1

L’interface est déclarée avec une méthode simplement annotée RequestLine qui définit le verbe de la requête et son contexte. Il suffit ensuite de créer le client Feign en déclarant l’url à appeler et l’interface de définition des web services.

 

feing2

 

Quelques autres exemples de requêtes :

 

feign3

 

Afin d’implémenter dynamiquement les interfaces, Feign utilise l’API de réflection et il est intéressant de noter que si le développeur le préfère ou s’il possède un existant, il est possible d’utiliser les annotations de JAX-RS en utilisant l’extension feign-jaxrs.

 

feign4

Customisation

Les extensions permettent de customiser simplement Feign.

Encoding / decoding

Il est rare de toujours retourner et d’interpréter des types primitifs, c’est pourquoi il est nécessaire d’avoir recours à un encoder et à un decoder.

 

feign5

 

Dans cet exemple, c’est Gson qui est utilisé mais Feign dispose également des encodeurs/décodeurs Jackson, JAXB ou Sax. Il est également possible de fournir sa propre implémentation.

 

feign6

 

Header

Grâce à l’annotation Header, il est possible d’ajouter des informations dans l’entête de la requête.

feign7

On peut également définir cette annotation au niveau de l’interface ; le header est généralisé à toutes les requêtes.

 

feign8

 

Request Interceptor

Grâce au requestInterceptor, le développeur prend la main sur l’objet RequestTemplate utilisé par Feign pour construire la requête http.

feign9

Logs

De la même façon, il est possible, d’afficher toutes les requêtes dans sa console.

feign10

Cependant, plus élégamment, on préfèrera s’adjoindre les services d’une extension SL4J ou autre.

 

feign11

 

Gestion des Exceptions : customiser ses exceptions

Par défaut, Feign génère uniquement des FeignExceptions, mais il est possible de les gérer facilement de façon personnalisée :

feign12

Circuit breaker

Dans le cadre de micro-services, il est intéressant de noter que Feign s’intègre très facilement avec Hystrix au moyen de l’extension Feign-hystrix qui supporte RxJava.

 

Conclusion

Au final, Feign apparaît comme une alternative intéressante aux traditionnels clients REST. Sa customisation et son integration avec d’autres librairies la rendent finalement très simple à maîtriser.

Cependant, si on est responsable de l’exposition et de la consommation des services dans un environnement full Java, on lui préfèrera probablement une autre solution pour davantage de cohérence.

Share
Olivier THOMAS
Olivier THOMAS

854

Leave a Reply

Your email address will not be published. Required fields are marked *