ALOM

đŸ€ Interoperability

UBER

Problématique

  • Comment communiquer avec les autres micro-services?
  • Comment communiquer avec les partenaires?

Contraintes ⛓

Toutes les applications ne sont pas Ă©crites dans le mĂȘme langage (Java, .Net, NodeJS, PHP, Ruby, Python...)

Les partenaires n'ont pas forcĂ©ment les mĂȘmes environnements (rĂ©seaux, firewall)

Solution 🎉

Définition d'une norme de communication, basée sur des standards.

Web services & web-sockets 🌍

  • Protocole HTTP(S)
    • Facile Ă  implĂ©menter (texte)
    • Passe les firewalls (port 80/443)
    • SĂ©curisation avec SSL/TLS 🔒
  • Formats de donnĂ©es
    • SOAP : XML
    • REST : JSON
  • Contrat de service
    • SOAP : WSDL
    • REST : Swagger...

Web services SOAP 🛁

Web services SOAP

Simple

Object

Access

Protocol

Web services SOAP

Principes architecturaux

  • Protocole de type RPC (Remote Procedure Call)
  • ReprĂ©sentation XML (Enveloppe, Header, Body) ✉
  • S'appuie sur HTTP, ou tout autre protocole (SMTP, JMS...)

En Java ☕

2 possiblités d'implémentation

  • Contract-first (top-down) âŹ‡ïž
  • Code-first (bottom-up) âŹ†ïž

Contract-first

Approche historique

RĂ©daction d'un contrat WSDL (ouch!) 💱 đŸ€•

Récupération d'un contrat d'un partenaire

Génération d'un stub(client) et d'un squeleton(server) Java

Contract-first

Génération du code avec un plugin maven:

Code-first

Approche plus simple 😎

Écriture des classes/interfaces Java

Génération du WSDL à partir des classes (annotations/méthodes etc...)

Code-first

Web services REST

Web services REST

REpresentational

State

Transfert

Web services REST

Principes architecturaux

  • Architecture dĂ©couplĂ©e client/serveur
  • Sans Ă©tat (pas de session)
  • AccĂšs Ă  des ressources:
    • IdentifiĂ©es de maniĂšre unique
    • ManipulĂ©es via des reprĂ©sentations (JSON, XML, HTML...)
    • Compatible avec une mise en cache
    • DonnĂ©es HypermĂ©dia

NĂ©gociation de contenu

Principes au coeur du web

Le client indique au serveur ses attentes via des headers HTTP

NĂ©gociation de contenu

  • Format des donnĂ©es : header Accept
  • Traduction : header Accept-Language
  • Retour avec les headers Content-Type et Content-Language

La RFC 4229 liste les headers possibles.

Web services REST

HATEOAS : Hypermedia As The Engine Of Application State

Le message contient les informations permettant de manipuler l'application

Web services REST : Exemple XML

Web services REST : Exemple JSON

HATEOAS

Excellent talk de Julien Topçu

Contrat de service REST

OpenAPI (ex Swagger)

OpenAPI est la spec, Swagger une implémentation

Description des API au format JSON ou YAML : OpenApi

Rendu Web + "Try It" : Swagger

Pokemon API

Swagger

Affichage de la documentation sous forme de page web

Swagger

Génération de squelettes clients/serveur

Swagger

Génération de squelettes clients/serveur

Swagger et OpenApi en Spring Boot

Pas d'implémentation de la part de Spring

1 projet Open Source

springdoc-openapi (doc)

Exposition d'un service REST Spring

En Spring

/api/pokemon-types/{id}

/api/pokemon-types?orderBy=name

/api/pokemon-types?type=poison

  • @RequestMapping : Ă©couter une URI
  • @PathVariable : rĂ©cupĂ©rer les variables d'URI entre '{}'
  • @RequestParam : rĂ©cupĂ©rer les paramĂštres de requĂȘte (query-strings '?a=b&c=d')
  • @RequestBody : rĂ©cupĂ©rer le corps de la requĂȘte

@RequestMapping

/api/pokemon-types

@PathVariable

/api/pokemon-types/{id}

@RequestParam

/api/pokemon-types?orderBy=name

@RequestParam

/api/pokemon-types?type=poison

@RequestBody

POST /api/trainers

Spring RestTemplate

Classe utilitaire pour effectuer des appels REST

  • ExĂ©cute les requĂȘtes HTTP : GET/POST/PUT/PATCH/OPTIONS/DELETE/HEAD
  • Utilise jackson-databind pour convertir les objets Java en JSON !

Outillage

đŸ’Ș $> curl

ou

Postman/Insomnia

Les autres moyens de communication réseau

  • Reactive Streams - Support avec Spring WebFlux
  • GraphQL - Support avec Spring GraphQL
  • gRPC - pas d'implĂ©mentation officielle

TP

Interoperability