Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Spécifier ses API asynchrones avec AsyncAPI - D...

Spécifier ses API asynchrones avec AsyncAPI - Devoxx France 2022 - Tools-in-Action

AsyncAPI est le langage de description des API asynchrones très fortement inspiré de la spécification OpenAPI (aka Swagger). Avec l’émergence des architectures orientées événements, AsyncAPI est alors le bienvenu.

Nous verrons donc comment décrire très simplement et rapidement une API asynchrone, factoriser la description et générer une description moderne à publier en ligne !

Sébastien LECACHEUR

April 21, 2022
Tweet

More Decks by Sébastien LECACHEUR

Other Decks in Programming

Transcript

  1. Spécifier ses API asynchrones avec AsyncAPI { "fn": "Sébastien Lecacheur",

    "twitter": "@slecache", "org": "Odigo", "event": { "name": "Devoxx France", "type": "Tools in Action", "dt": { "start": "2022-04-21T18:30:00.000Z", "end": "2022-04-21T19:00:00.000Z" }, "location": "Paris 242 AB" } }
  2. Asynchrone 📣 qui n’attend pas une réponse dans l’immédiat one-to-one

    : commande / résultat de traitement one-to-many : notification / événement
  3. Contexte 🏞️ Pour nos APIs asynchrones, nous cherchions… Une documentation

    pour les utilisateurs internes et externes, rédigée avant l’implémentation pour une approche contract first,
  4. Contexte 🏞️ Pour nos APIs asynchrones, nous cherchions… Une documentation

    pour les utilisateurs internes et externes, rédigée avant l’implémentation pour une approche contract first, gérée comme du code source,
  5. Contexte 🏞️ Pour nos APIs asynchrones, nous cherchions… Une documentation

    pour les utilisateurs internes et externes, rédigée avant l’implémentation pour une approche contract first, gérée comme du code source, et lisible par des humains.
  6. Documentation d’API 📖 SDK, lib → JavaDoc, PHPDoc, JSDoc… Web

    Services, REST → OpenAPI Événements, messages
  7. Documentation d’API 📖 SDK, lib → JavaDoc, PHPDoc, JSDoc… Web

    Services, REST → OpenAPI Événements, messages → AsyncAPI
  8. Format des messages ✉️ La définition du payload est libre.

    JSON schema Apache Avro CloudEvents personnalisé
  9. Une API asynchrone ? 🖊️ un canal agent/presence: des opérations

    publish: subscribe: un format de représentation message: contentType: application/json examples: - name: login payload: {"type":"login", "agent":"xyzg0ht9"}
  10. Une API asynchrone ? 🖊️ un canal agent/presence: des opérations

    publish: subscribe: un format de représentation message: contentType: application/json examples: - name: login payload: {"type":"login", "agent":"xyzg0ht9"} Votre premier AsyncAPI !
  11. Démo ⌨️ édition - Studio (online/CLI) documentation - ag html/markdown

    top-down - ag java/spring bottom-up - springwolf @Annotation mocks - Microcks
  12. Aller plus loin 🛫 Outils Parseurs (RabbitMQ) linters : bundlers

    : @asyncapi/bundler, json-merger optimizer : @asyncapi/optimizer Exemples Protocol bindings Scribano Spectral AsyncAPI Spec examples APIs.guru - asyncapi-directory API Tracker - AsyncAPI specs
  13. Aller plus encore plus loin 🚀 Alternatives : Async(hronous )API

    Patterns EventCatalog.dev Event-based API Patterns and Practices AsyncAPI Online 2021 - From specification to production
  14. Ce qu’il faut retenir 💡 Agnostique (langage & middleware) 🌌

    Syntaxe proche d’OpenAPI ✌️ Pas seulement de la documentation 🧰
  15. Ce qu’il faut retenir 💡 Agnostique (langage & middleware) 🌌

    Syntaxe proche d’OpenAPI ✌️ Pas seulement de la documentation 🧰 Communauté ouverte 🤝
  16. Ce qu’il faut retenir 💡 Agnostique (langage & middleware) 🌌

    Syntaxe proche d’OpenAPI ✌️ Pas seulement de la documentation 🧰 Communauté ouverte 🤝 Ecosystème très jeune 👶
  17. Ce qu’il faut retenir 💡 Agnostique (langage & middleware) 🌌

    Syntaxe proche d’OpenAPI ✌️ Pas seulement de la documentation 🧰 Communauté ouverte 🤝 Ecosystème très jeune 👶 Trop d’implémentations possibles 👾
  18. [ { "from": "you", "to": "@slecache", "event" : { "type":

    "question", } }, { "from": "@slecache", "to": "all", "event" : { "type": "response", } } ]