Alors, c'est RAML ou OAS (Swagger) ?

Dans le monde dynamique des microservices, tout peut changer — n'importe quel composant peut ĂȘtre réécrit dans un autre langage, en utilisant d'autres frameworks et architectures. Ce qui doit rester inchangĂ©, ce sont les contrats, afin de pouvoir interagir avec le microservice de façon constante, indĂ©pendamment des mĂ©tamorphoses internes. Aujourd'hui, nous allons parler de notre problĂšme de choix de format de description des contrats et partager les artefacts que nous avons trouvĂ©s.

Alors, c'est RAML ou OAS (Swagger) ?

Post préparé par Anna Melekhova et Vladimir Lapatin

Microservices. Dans le développement d'Acronis Cyber Cloud, nous avons compris que nous ne pouvions pas y échapper. La conception d'un microservice est impossible sans formalisation d'un contrat, qui représente l'interface du microservice.

Mais lorsque le produit contient plus d'un composant, et que le dĂ©veloppement du contrat devient une activitĂ© rĂ©guliĂšre, on commence inĂ©vitablement Ă  rĂ©flĂ©chir Ă  l'optimisation du processus. Il devient Ă©vident que l'interface (contrat) et l'implĂ©mentation (microservice) doivent correspondre l'une Ă  l'autre, que les diffĂ©rents composants doivent faire les mĂȘmes choses de la mĂȘme maniĂšre, et que sans une adoption centralisĂ©e de toutes ces dĂ©cisions, chaque Ă©quipe sera forcĂ©e de passer de nouveau du temps Ă  les obtenir.

Alors, c'est RAML ou OAS (Swagger) ?
Schéma des microservices d'Amazon issu de un tweet de Werner Vogels, CTO d'Amazon
Quelle est donc la dilemme ? De facto, il existe deux maniĂšres d'interagir entre les microservices – HTTP Rest et gRPC de Google. Ne souhaitant pas ĂȘtre impliquĂ©s dans la pile technologique de Google, nous avons choisi HTTP Rest. Les annotations aux contrats HTTP REST sont gĂ©nĂ©ralement dĂ©crites dans l'un des deux formats : RAML et OAS, anciennement connu sous le nom de Swagger. Par consĂ©quent, chaque Ă©quipe de dĂ©veloppement est confrontĂ©e Ă  la nĂ©cessitĂ© de faire un choix en faveur de l'un des standards. Mais, comme il s'est avĂ©rĂ©, faire ce choix peut ĂȘtre trĂšs difficile.

Pourquoi avons-nous besoin d'annotations ?

Une annotation est nĂ©cessaire pour que l'utilisateur externe puisse facilement comprendre ce qu'il peut faire avec votre service via son interface HTTP. À un niveau de base, l'annotation doit contenir au minimum une liste des ressources disponibles, leurs mĂ©thodes HTTP, les corps des requĂȘtes, l'Ă©numĂ©ration des paramĂštres, l'indication des en-tĂȘtes requis et pris en charge, ainsi que des codes de retour et des formats de rĂ©ponses. Un Ă©lĂ©ment crucial de l'annotation du contrat est Ă©galement leur description verbale (« que se passera-t-il si ce paramĂštre de requĂȘte est ajoutĂ© Ă  la requĂȘte ? », « dans quelle situation le code 400 sera-t-il retournĂ© ? »)

Cependant, lorsqu'il s'agit de développer un grand nombre de microservices, on souhaite tirer un bénéfice supplémentaire des annotations écrites. Par exemple, à partir de RAML/Swagger, il est possible de générer à la fois du code client et serveur dans un grand nombre de langages de programmation. De plus, il est possible d'obtenir automatiquement la documentation du microservice et de la publier sur votre developer-portal :)

Alors, c'est RAML ou OAS (Swagger) ?
Exemple de description structurée d'un contrat

Il est moins fréquent de voir la pratique de tester des microservices sur la base des descriptions de contrats. Si vous avez rédigé à la fois l'annotation et le composant, vous pouvez créer un autotest qui vérifie l'adéquation du service avec divers types de données en entrée. Le service retourne-t-il un code de réponse non décrit dans l'annotation ? Peut-il traiter correctement des données manifestement incorrectes ?

De plus, une mise en Ɠuvre de qualitĂ© des contrats eux-mĂȘmes, ainsi que des outils de visualisation des annotations, permet de simplifier le travail avec le microservice. Autrement dit, si l'architecte a dĂ©crit le contrat de maniĂšre adĂ©quate, sur cette base, les designers et les dĂ©veloppeurs pourront intĂ©grer le service dans d'autres produits sans coĂ»ts de temps supplĂ©mentaires.

Pour le fonctionnement d'outils supplémentaires, RAML et OAS ont la possibilité d'ajouter des métadonnées non prévues par la norme (par exemple, c'est ainsi que cela se fait dans OAS).

En général, le champ pour la créativité dans l'application des contrats pour les microservices est immense
 du moins théoriquement

Comparaison d'un hérisson avec une couleuvre

Actuellement, la priorité de développement chez Acronis est l'évolution de la plateforme Acronis Cyber. Acronis Cyber Platform est un nouvel ensemble de points d'intégration pour les services tiers avec Acronis Cyber Cloud et la partie agent. Bien que nos API internes, décrites dans RAML, nous satisfaisaient, la nécessité de publier une API a de nouveau relancé la question : quelle norme d'annotations devrions-nous utiliser pour notre travail ?

Au dĂ©part, il semblait qu'il y avait deux solutions — les dĂ©veloppements les plus rĂ©pandus, RAML et Swagger (ou OAS). Mais en fait, il s'est avĂ©rĂ© qu'il y a au minimum trois alternatives ou plus.

D'une part, il y a RAML – un langage puissant et efficace. Il rĂ©alise bien la hiĂ©rarchie et l'hĂ©ritage, ce qui fait que ce format est plus adaptĂ© aux grandes entreprises ayant besoin de nombreuses descriptions — c'est-Ă -dire pas d'un seul produit, mais de nombreux microservices ayant des parties communes dans leurs contrats — schĂ©mas d'authentification, types de donnĂ©es identiques, corps d'erreur.

Mais le dĂ©veloppeur de RAML, la sociĂ©tĂ© Mulesoft, a rejoint le consortium Open API, qui s'occupe du dĂ©veloppement Swagger. Par consĂ©quent, RAML a suspendu son dĂ©veloppement. Pour imaginer le format Ă©vĂ©nement, imaginez que les mainteneurs des composants principaux de Linux vont travailler chez Microsoft. Une telle situation crĂ©e les conditions nĂ©cessaires pour adopter Swagger, qui Ă©volue dynamiquement et qui, dans sa derniĂšre — troisiĂšme version — rattrape pratiquement RAML en flexibilitĂ© et en fonctionnalitĂ©.

S'il n'y avait pas un mais


Il s'est avĂ©rĂ© que toutes les utilitaires open-source ne se sont pas mises Ă  jour vers la version OAS 3.0. Pour les microservices en Go, le manque d'adaptation go-swagger Ă  la derniĂšre version de la norme s'avĂšre critique. Cependant, la diffĂ©rence entre Swagger 2 et Swagger 3 — est Ă©norme. Par exemple, dans la troisiĂšme version, les dĂ©veloppeurs :

  • ont amĂ©liorĂ© la description des schĂ©mas d'authentification
  • ont finalisĂ© le support du JSON Schema
  • ont renforcĂ© la possibilitĂ© d'ajouter des exemples

La situation devient amusante : lors du choix d'une norme, il est nécessaire de considérer RAML, Swagger 2 et Swagger 3 comme des alternatives distinctes. Dans ce cas, seul Swagger 2 bénéficie d'un bon soutien des outils Open Source. RAML est trÚs flexible
 et complexe, tandis que Swagger 3 est faiblement soutenu par la communauté, vous devrez donc utiliser des outils de développement interne ou des solutions commerciales qui, en général, coûtent trÚs cher.

Il convient de noter que si Swagger propose de nombreuses fonctionnalitĂ©s intĂ©ressantes, telles qu'un portail prĂȘt Ă  l'emploi editor.swagger.io, oĂč vous pouvez tĂ©lĂ©charger une annotation et obtenir sa visualisation avec une description dĂ©taillĂ©e, des liens et des relations, alors que pour le RAML plus fondamental et moins convivial, cette possibilitĂ© n'existe pas. Oui, il est possible de rechercher quelque chose parmi les projets sur GitHub, d'y trouver un Ă©quivalent et de le dĂ©ployer vous-mĂȘme. Cependant, dans tous les cas, quelqu'un devra maintenir le portail, ce qui n'est pas si pratique pour un usage de base ou des besoins de test. De plus, Swagger est plus « libre » ou « libĂ©ral » — il peut ĂȘtre gĂ©nĂ©rĂ© Ă  partir de commentaires dans le code, ce qui, bien sĂ»r, va Ă  l'encontre du principe de l'API first et n'est supportĂ© par aucun des outils RAML.

Nous avons commencĂ© Ă  travailler avec RAML Ă  l'Ă©poque, Ă©tant un langage plus flexible, et finalement, nous avons dĂ» faire beaucoup de choses nous-mĂȘmes. Par exemple, dans l'un des projets, nous utilisons un outil ramlfications dans les tests unitaires, qui ne supporte que RAML 0.8. Il a donc fallu ajouter des rustines pour que l'outil puisse « digĂ©rer » les versions RAML 1.0.

Et faut-il choisir ?

AprÚs avoir galéré à ajouter des solutions à l'écosystÚme autour de RAML, nous sommes arrivés à la conclusion qu'il était nécessaire de convertir RAML en Swagger 2 et de faire toute l'automatisation, la vérification, le test et l'optimisation dans ce dernier. C'est un bon moyen d'utiliser à la fois la flexibilité de RAML et le soutien des outils de la communauté Swagger.

Pour résoudre ce problÚme, il existe deux outils OpenSource qui devraient permettre la conversion des contrats :

  1. oas-raml-converter – un outil actuellement non supportĂ©. Au cours de notre travail avec, nous avons dĂ©couvert qu'il avait un certain nombre de problĂšmes avec des RAML complexes, qui sont « Ă©talĂ©s » sur un grand nombre de fichiers. Ce programme est Ă©crit en JavaScript et effectue un parcours rĂ©cursif de l'arbre syntaxique. En raison de la typage dynamique, il devient difficile de comprendre ce code, donc nous avons dĂ©cidĂ© de ne pas perdre de temps Ă  Ă©crire des patchs pour un outil moribond.
  2. webapi-parser — un outil de la mĂȘme entreprise, qui prĂ©tend ĂȘtre capable de convertir tout et n'importe quoi, et ce dans les deux sens. À ce jour, il supporte RAML 0.8, RAML 1.0 et Swagger 2.0. Cependant, au moment de notre recherche, l'outil Ă©tait encore EXTRÊMEMENT brut et inutilisable. Les dĂ©veloppeurs crĂ©ent une sorte de IR, ce qui leur permettra d'ajouter rapidement de nouvelles normes Ă  l'avenir. Mais pour l'instant, tout cela ne fonctionne tout simplement pas.

Et ce n'est pas tout, les difficultĂ©s auxquelles nous avons Ă©tĂ© confrontĂ©s. L'une des Ă©tapes de notre pipeline consiste Ă  vĂ©rifier que le RAML du dĂ©pĂŽt est correct par rapport Ă  la spĂ©cification. Nous avons essayĂ© plusieurs outils. Étonnamment, tous ont critiquĂ© nos annotations Ă  diffĂ©rents endroits avec des mots totalement dĂ©placĂ©s. Et ce n'Ă©tait pas toujours justifiĂ© :).

Finalement, nous nous sommes arrĂȘtĂ©s sur un projet dĂ©sormais obsolĂšte, qui prĂ©sente Ă©galement un certain nombre de problĂšmes (il plante parfois sans raison, a des problĂšmes avec les expressions rĂ©guliĂšres). Ainsi, nous n'avons pas trouvĂ© de moyen de rĂ©soudre les tĂąches de validation et de conversion Ă  l'aide d'outils gratuits, et avons dĂ©cidĂ© d'utiliser un outil commercial. À l'avenir, lorsque les outils OpenSource seront plus avancĂ©s, rĂ©soudre cette tĂąche pourrait devenir plus facile. Mais pour l'instant, le coĂ»t en temps et en efforts pour le 'peaufiner' nous a semblĂ© plus important que le prix du service commercial.

Conclusion

AprĂšs tout cela, nous avons ressenti le besoin de partager notre expĂ©rience et de souligner qu'avant de choisir un outil pour dĂ©crire les contrats, il est essentiel de dĂ©finir clairement ce que vous en attendez et quel budget vous ĂȘtes prĂȘt Ă  investir. Si l'on ignore l'OpenSource, il existe dĂ©jĂ  de nombreux services et produits qui peuvent aider Ă  vĂ©rifier, convertir, valider. Mais ils sont chers, parfois trĂšs chers. Pour une grande entreprise, de telles dĂ©penses sont acceptables, mais pour une startup, cela peut reprĂ©senter un fardeau important.

DĂ©terminez l'ensemble des outils que vous allez utiliser par la suite. Par exemple, si vous avez simplement besoin d'afficher un contrat, il sera plus facile d'utiliser Swagger 2, qui dispose d'une API Ă©lĂ©gante, alors qu'avec le RAML, vous devrez mettre en place et maintenir le service vous-mĂȘme.
Plus vous aurez de tùches, plus vos besoins en outils s'élargiront, et ils varient selon les plateformes. Il est donc préférable de se familiariser dÚs le départ avec les versions disponibles pour faire un choix qui minimisera vos coûts à l'avenir.

Il convient de reconnaßtre que tous les écosystÚmes existants aujourd'hui ne sont pas parfaits. Donc, s'il y a des fans dans l'entreprise qui aiment travailler avec RAML parce qu'il "permet d'exprimer les idées de maniÚre plus flexible", ou au contraire, préfÚrent Swagger parce qu'il "est plus compréhensible", il est préférable de les laisser travailler avec ce qu'ils connaissent et préfÚrent, car les outils de chaque format nécessitent des ajustements.

En ce qui concerne notre expĂ©rience, dans les prochains posts, nous parlerons des vĂ©rifications — statiques et dynamiques — que nous effectuons sur notre architecture RAML-Swagger, ainsi que de la documentation que nous gĂ©nĂ©rons Ă  partir des contrats et de la maniĂšre dont tout cela fonctionne.

Seuls les utilisateurs enregistrés peuvent participer au sondage. Connectez-vous, s'il vous plaßt.

Quel langage utilisez-vous pour annoter les contrats des microservices ?

  • RAML 0.8

  • RAML 1.0

  • Swagger 2

  • OAS3 (aussi connu sous le nom de )

  • Blueprint

  • Autre

  • Je n'utilise pas

100 utilisateurs ont voté. 24 utilisateurs se sont abstenus.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster