In der dynamischen Welt der Mikrodienste kann sich alles Ă€ndern â jede Komponente kann in einer anderen Sprache neu geschrieben werden, unter Verwendung anderer Frameworks und Architekturen. Nur die VertrĂ€ge sollten unverĂ€nderlich bleiben, damit der Mikrodienst von auĂen auf einer konstanten Grundlage interagiert werden kann, unabhĂ€ngig von den internen Metamorphosen. Heute werden wir ĂŒber unser Problem bei der Wahl des Formats zur Beschreibung von VertrĂ€gen berichten und die gefundenen Artefakte teilen.

Beitrag verfasst von und
Mikrodienste. Bei der Entwicklung von Acronis Cyber Cloud wurde uns klar, dass wir nicht um sie herumkommen. Das Design eines Mikrodienstes ist ohne die Formalisierung des Vertrags, der die Schnittstelle des Mikrodienstes darstellt, nicht möglich.
Wenn ein Produkt mehr als eine Komponente enthĂ€lt und die Vertragsentwicklung zu einer regelmĂ€Ăigen AktivitĂ€t wird, beginnt man unweigerlich ĂŒber eine Optimierung des Prozesses nachzudenken. Es wird offensichtlich, dass das Interface (Vertrag) und die Implementierung (Mikroservice) aufeinander abgestimmt sein mĂŒssen, dass verschiedene Komponenten dieselben Aufgaben auf die gleiche Weise erledigen sollten und dass ohne eine zentralisierte Entscheidungsfindung jede Mannschaft immer wieder Zeit investieren muss, um diese zu erhalten.

Das Schema der Mikroservices von Amazon aus von Werner Vogels, CTO von Amazon
Was ist das Dilemma? De facto gibt es zwei Möglichkeiten fĂŒr die Interaktion von Mikroservices â HTTP Rest und gRPC von Google. Um nicht in das Technologie-Stack von Google involviert zu werden, haben wir uns fĂŒr HTTP Rest entschieden. Die Annotations zu HTTP REST-VertrĂ€gen werden meist in einem der beiden Formate beschrieben: RAML und OAS, frĂŒher bekannt als Swagger. Deshalb steht jedes Entwicklerteam vor der Notwendigkeit, sich fĂŒr einen der Standards zu entscheiden. Doch, wie sich herausstellte, kann diese Entscheidung sehr kompliziert sein.
Warum sind Annotations notwendig?
Eine Annotation ist erforderlich, damit externe Benutzer leicht verstehen, was sie ĂŒber die HTTP-Schnittstelle Ihres Dienstes tun können. Auf einer grundlegenden Ebene sollte die Annotation mindestens eine Liste der verfĂŒgbaren Ressourcen, deren HTTP-Methoden, Anfragekörper, Parameter, notwendige und unterstĂŒtzte Header sowie RĂŒckgabecodes und Antwortformate enthalten. Ein Ă€uĂerst wichtiger Bestandteil der Vertragsannotation ist auch deren verbale Beschreibung ("Was passiert, wenn ich diesen Query-Parameter zur Anfrage hinzufĂŒge?", "In welchem Fall wird der Code 400 zurĂŒckgegeben?").
Dennoch, wenn es um die Entwicklung einer groĂen Anzahl von Mikrodiensten geht, möchte man zusĂ€tzlichen Nutzen aus den geschriebenen Annotationen ziehen. Beispielsweise können auf Basis von RAML/Swagger sowohl Client- als auch Serverseitencodes in einer Vielzahl von Programmiersprachen generiert werden. AuĂerdem kann automatisch Dokumentation zu dem Mikrodienst erstellt und auf Ihr Entwickler-Portal hochgeladen werden :).

Beispiel fĂŒr eine strukturierte Beschreibung eines Vertrags
Es ist weniger verbreitet, dass Mikrodienste basierend auf Vertragsbeschreibungen getestet werden. Wenn Sie sowohl die Annotation als auch die Komponente geschrieben haben, können Sie einen automatisierten Test erstellen, der die Angemessenheit der Funktionsweise des Dienstes mit verschiedenen Eingabedatentypen ĂŒberprĂŒft. Gibt der Dienst einen Antwortcode zurĂŒck, der nicht in der Annotation beschrieben ist? Kann er ungĂŒltige Daten korrekt verarbeiten?
DarĂŒber hinaus ermöglicht eine qualitativ hochwertige Umsetzung nicht nur der VertrĂ€ge selbst, sondern auch der Werkzeuge zur Visualisierung von Annotationen eine Vereinfachung der Arbeit mit dem Mikrodienst. Wenn der Architekt den Vertrag gut beschrieben hat, können Designer und Entwickler basierend darauf den Dienst in andere Produkte einfĂŒhren, ohne zusĂ€tzliche Zeitaufwendungen.
FĂŒr die Funktion zusĂ€tzlicher Werkzeuge haben sowohl RAML als auch OAS die Möglichkeit, Metadaten hinzuzufĂŒgen, die im Standard nicht vorgesehen sind ().
Im Allgemeinen gibt es im kreativen Einsatz von VertrĂ€gen fĂŒr Mikrodienste ein riesiges Potenzial... zumindest theoretisch
Der Vergleich eines Igels mit einer Natter
Derzeit liegt der Schwerpunkt der Entwicklung bei Acronis auf der Acronis Cyber Platform. Die Acronis Cyber Platform bietet neue Integrationspunkte fĂŒr externe Dienste mit der Acronis Cyber Cloud und dem Agententeil. Obwohl unsere internen APIs, die in RAML beschrieben sind, zufriedenstellend waren, hat die Notwendigkeit der Veröffentlichung von APIs erneut die Frage aufgeworfen, welcher Annotationsstandard fĂŒr unsere Arbeit am besten geeignet ist.
Anfangs schien es, als gĂ€be es zwei Lösungen â die am hĂ€ufigsten verwendeten Entwicklungen RAML und Swagger (oder OAS). TatsĂ€chlich stellte sich jedoch heraus, dass es mindestens drei oder mehr Alternativen gibt.
Auf der einen Seite gibt es RAML â eine mĂ€chtige und effiziente Sprache. Sie bietet eine gut umgesetzte Hierarchie und Vererbung, wodurch dieses Format besser fĂŒr groĂe Unternehmen geeignet ist, die viele Beschreibungen benötigen â das heiĂt, nicht nur ein Produkt, sondern zahlreiche Mikrodienste, die gemeinsame Teile von VertrĂ€gen aufweisen â Authentifizierungsschemata, identische Datentypen, Fehlermeldungen.
Der Entwickler von RAML, das Unternehmen Mulesoft, hat sich dem Open API-Konsortium angeschlossen, das sich der Weiterentwicklung widmet. . Daher hat RAML seine Entwicklung eingestellt. Um sich das Ereignisformat vorzustellen, kann man sich vorstellen, dass die Entwickler der Hauptkomponenten von Linux zu Microsoft gewechselt sind. Eine solche Situation fĂŒhrt dazu, dass Swagger, das sich dynamisch weiterentwickelt, in der neuesten â dritten Version â RAML in Bezug auf FlexibilitĂ€t und FunktionalitĂ€t fast einholt.
WĂ€re da nicht eine KleinigkeitâŠ
Wie sich herausgestellt hat, haben lange nicht alle Open-Source-Tools auf die Version OAS 3.0 aktualisiert. FĂŒr Microservices in Go ist das Fehlen einer Anpassung hierfĂŒr besonders kritisch. auf die neue Version des Standards. Der Unterschied zwischen Swagger 2 und Swagger 3 ist jedoch â . Zum Beispiel haben die Entwickler in der dritten Version:
- die Beschreibung von Authentifizierungsschemata verbessert
- die Möglichkeit zur HinzufĂŒgung von Beispielen erweitert.
- Wir haben die Möglichkeit zur HinzufĂŒgung von Beispielen erweitert
Die Situation wird interessant: Wenn es um die Auswahl des Standards geht, sollten RAML, Swagger 2 und Swagger 3 als separate Alternativen betrachtet werden. Nur Swagger 2 bietet dabei eine gute UnterstĂŒtzung durch OpenSource-Tools. RAML ist sehr flexibel... und komplex, wĂ€hrend Swagger 3 nur schwach von der Community unterstĂŒtzt wird, sodass Sie gezwungen sind, eigene oder kommerzielle Lösungen zu verwenden, die in der Regel ziemlich teuer sind.
Dennoch bietet Swagger viele angenehme Funktionen, wie ein fertiges Portal. , auf den man Anmerkungen hochladen und eine Visualisierung mit detaillierten Beschreibungen, Links und Verbindungen erhalten kann. FĂŒr das fundiertere und weniger benutzerfreundliche RAML gibt es diese Möglichkeit nicht. Ja, man kann in Projekten auf GitHub suchen, dort ein Pendant finden und es selbst aufsetzen. Allerdings muss in jedem Fall jemand das Portal warten, was fĂŒr grundlegende Nutzung oder Testzwecke nicht so praktisch ist. Zudem ist Swagger âweniger dogmatischâ, oder liberal â es kann aus Kommentaren im Code generiert werden, was natĂŒrlich dem API-First-Prinzip widerspricht und von keinem der RAML-Tools unterstĂŒtzt wird.
Zu unserer Zeit haben wir mit RAML als einer flexibleren Sprache begonnen und mussten letztendlich vieles selbst erledigen. Zum Beispiel wird in einem der Projekte ein Tool verwendet, in den Unit-Tests, das nur RAML 0.8 unterstĂŒtzt. Daher mussten wir Workarounds hinzufĂŒgen, damit das Tool RAML Version 1.0 verarbeiten konnte.
Muss man ĂŒberhaupt eine Auswahl treffen?
Nachdem wir uns mit der Erweiterung des Lösungsecosystems fĂŒr RAML beschĂ€ftigt haben, sind wir zu dem Schluss gekommen, dass wir RAML in Swagger 2 konvertieren mĂŒssen, um dort alle Automatisierungen, ĂberprĂŒfungen, Tests und anschlieĂenden Optimierungen durchzufĂŒhren. Dies ist ein guter Weg, um sowohl die FlexibilitĂ€t von RAML als auch die UnterstĂŒtzung durch die Community-Tools von Swagger gleichzeitig zu nutzen.
FĂŒr diese Aufgabe gibt es zwei OpenSource-Tools, die die Konvertierung von VertrĂ€gen ermöglichen sollten:
- â ein derzeit nicht unterstĂŒtztes Tool. Bei der Arbeit damit haben wir festgestellt, dass es eine Reihe von Problemen mit komplexen RAMLs gibt, die auf viele Dateien verteilt sind. Dieses Programm ist in JavaScript geschrieben und fĂŒhrt eine rekursive Durchlaufung des Syntaxbaums durch. Aufgrund der dynamischen Typisierung ist es schwierig, diesen Code zu verstehen, weshalb wir uns entschieden haben, keine Zeit mit Patches fĂŒr dieses veraltete Tool zu verschwenden.
- â ein Tool von derselben Firma, das sich rĂŒhmt, alles und jedes konvertieren zu können, und das in beide Richtungen. Aktuell wird die UnterstĂŒtzung fĂŒr RAML 0.8, RAML 1.0 und Swagger 2.0 angegeben. Allerdings war das Tool zum Zeitpunkt unserer Untersuchung noch roh und unbrauchbar. Die Entwickler schaffen eine Art , was ihnen in Zukunft ermöglichen wird, schnell neue Standards hinzuzufĂŒgen. Aber bisher funktioniert das alles einfach nicht.
Und das ist noch nicht alles, mit den Schwierigkeiten, denen wir begegnet sind. Einer der Schritte in unserer Pipeline besteht darin, zu ĂŒberprĂŒfen, ob das RAML aus dem Repository korrekt in Bezug auf die Spezifikation ist. Wir haben mehrere Tools ausprobiert. Erstaunlicherweise hatten sie alle an unseren Anmerkungen an verschiedenen Stellen und mit völlig unterschiedlichen unsinnigen Worten zu kauen. Und das nicht immer zu Recht : ).
Letztendlich haben wir uns fĂŒr ein inzwischen veraltetes Projekt entschieden, das ebenfalls eine Reihe von Problemen hat (manchmal stĂŒrzt es unerwartet ab, hat Schwierigkeiten beim Umgang mit regulĂ€ren AusdrĂŒcken). Daher haben wir keinen Weg gefunden, die Validierungs- und Konvertierungsaufgaben mit kostenlosen Tools zu lösen, und haben beschlossen, ein kommerzielles Tool zu verwenden. In Zukunft, wenn die Open-Source-Mittel weiterentwickelt werden, wird die Lösung dieses Problems möglicherweise einfacher. Bis dahin schienen uns die Arbeits- und Zeitaufwendungen fĂŒr das "Nachbessern" bedeutender zu sein als die Kosten fĂŒr den kommerziellen Service.
Fazit
Nach all dem möchten wir unsere Erfahrungen teilen und darauf hinweisen, dass Sie vor der Auswahl eines Werkzeugs zur Vertragsbeschreibung klar definieren sollten, was Sie von diesem erwarten und welches Budget Sie bereit sind zu investieren. Auch ohne OpenSource gibt es bereits viele Dienste und Produkte, die Ihnen bei der ĂberprĂŒfung, Konvertierung und Validierung helfen können. Diese sind jedoch kostspielig, manchmal sogar sehr teuer. FĂŒr groĂe Unternehmen sind solche Ausgaben tragbar, doch fĂŒr ein Startup können sie eine erhebliche Belastung darstellen.
Bestimmen Sie die Werkzeugauswahl, die Sie spĂ€ter verwenden möchten. Wenn Sie beispielsweise einfach nur einen Vertrag anzeigen mĂŒssen, ist es einfacher, Swagger 2 zu verwenden, das eine ansprechende API bietet, wĂ€hrend Sie bei RAML den Dienst selbst aufsetzen und warten mĂŒssten.
Je mehr Aufgaben Sie haben, desto gröĂer wird der Bedarf an Werkzeugen, und diese variieren je nach Plattform. Es ist daher ratsam, sich frĂŒhzeitig ĂŒber die verfĂŒgbaren Versionen zu informieren, um eine Wahl zu treffen, die Ihre zukĂŒnftigen Kosten minimiert.
Es ist jedoch anzuerkennen, dass alle heute existierenden Ăkosysteme unvollkommen sind. Wenn es in einem Unternehmen also BefĂŒrworter gibt, die es bevorzugen, mit RAML zu arbeiten, da "es flexiblere Ausdrucksmöglichkeiten bietet", oder andersrum, die Swagger bevorzugen, weil "es verstĂ€ndlicher ist", ist es am besten, ihnen zu erlauben, mit dem zu arbeiten, womit sie vertraut sind und was sie möchten, denn die Werkzeuge der jeweiligen Formate erfordern noch Anpassungen.
Was unsere Erfahrungen betrifft, werden wir in den nĂ€chsten BeitrĂ€gen erlĂ€utern, welche statischen und dynamischen PrĂŒfungen wir auf Basis unserer RAML-Swagger-Architektur durchfĂŒhren sowie welche Dokumentation wir aus den VertrĂ€gen generieren und wie all das funktioniert.
Nur registrierte Benutzer können an der Umfrage teilnehmen. Sind Sie an Contour interessiert?
Welche Sprache verwenden Sie fĂŒr die Annotationen von Microservice-VertrĂ€gen?
RAML 0.8
RAML 1.0
Swagger 2
OAS3 (aka )
Blueprint
Ein weiteres
Nutze ich nicht
100 Benutzer haben abgestimmt. 24 Benutzer haben sich enthalten.
Quelle: habr.com
