Öffentliche Aufträge, wie ihre Konsistenz sichergestellt werden kann

  • Besteht Ihr System aus vielen miteinander verbundenen Diensten?
  • Aktualisieren Sie den Service-Code immer noch manuell, wenn Sie die öffentliche API ändern?
  • Änderungen in Ihren Diensten untergraben oft die Arbeit anderer, und andere Entwickler hassen Sie dafür?

Wenn Sie mindestens einmal mit Ja geantwortet haben, sind Sie herzlich willkommen!

Bedingungen


Öffentliche Aufträge, Spezifikationen - öffentliche Schnittstellen, über die Sie mit dem Dienst interagieren können. Im Text bedeuten sie dasselbe.

Um was geht es in dem Artikel


Erfahren Sie, wie Sie den Zeitaufwand für die Entwicklung von Webdiensten mithilfe von Tools zur einheitlichen Beschreibung von Verträgen und zur automatischen Codegenerierung reduzieren können.

Durch die ordnungsgemäße Verwendung der unten beschriebenen Techniken und Tools können Sie schnell neue Funktionen einführen und alte nicht beschädigen.

Wie sieht das Problem aus?


Es gibt ein System, das aus mehreren Diensten besteht. Diese Dienste sind verschiedenen Teams zugeordnet.



Verbraucherdienste hängen vom Dienstleister ab.
Das System entwickelt sich weiter und eines Tages ändert der Dienstanbieter seine öffentlichen Aufträge.



Wenn Verbraucherdienste nicht für Änderungen bereit sind, funktioniert das System nicht mehr vollständig.



So lösen Sie dieses Problem


Das Lieferantenservice-Team wird alles reparieren


Dies kann erfolgen, wenn das Lieferantenteam den Themenbereich anderer Dienste besitzt und Zugriff auf deren Git-Repositories hat. Dies funktioniert nur in kleinen Projekten, wenn nur wenige abhängige Dienste vorhanden sind. Dies ist die billigste Option. Wenn möglich, sollten Sie es verwenden.

Aktualisieren Sie den Code Ihres Dienstes für das Verbraucherteam


Warum brechen andere, aber reparieren wir?

Die Hauptfrage ist jedoch, wie Sie Ihren Service reparieren können. Wie sieht der Vertrag jetzt aus? Sie müssen den neuen Provider-Service-Code kennenlernen oder sich an das entsprechende Team wenden. Wir verbringen Zeit damit, den Code zu studieren und mit einem anderen Team zu interagieren.

Überlegen Sie, was zu tun ist, um das Auftreten des Problems zu verhindern


Die auf lange Sicht vernünftigste Option. Betrachten Sie es im nächsten Abschnitt.

So verhindern Sie die Manifestation eines Problems


Der Lebenszyklus der Softwareentwicklung kann in drei Phasen dargestellt werden: Design, Implementierung und Test.

Jeder der Schritte muss wie folgt erweitert werden:

  1. in der Entwurfsphase Verträge deklarativ definieren;
  2. Während der Implementierung generieren wir Server- und Client-Code im Rahmen von Verträgen.
  3. Beim Testen prüfen wir Verträge und versuchen, die Kundenbedürfnisse (CDC) zu berücksichtigen.

Jeder der Schritte wird weiter als Beispiel für unser Problem erläutert.

Wie das Problem bei uns aussieht




So sieht unser Ökosystem aus.
Kreise sind Dienste und Pfeile sind Kommunikationskanäle zwischen ihnen.

Frontend ist eine webbasierte Client-Anwendung.

Die meisten Pfeile führen zum Speicherdienst. Es speichert Dokumente. Dies ist der wichtigste Service. Schließlich ist unser Produkt ein elektronisches Dokumentenmanagementsystem.

Sollte dieser Dienst seine Verträge ändern, funktioniert das System sofort nicht mehr.



Die Quellen unseres Systems sind hauptsächlich in c # geschrieben, aber es gibt auch Dienste in Go und Python. In diesem Zusammenhang spielt es keine Rolle, was die anderen Dienste in der Abbildung tun.



Jeder Dienst verfügt über eine eigene Client-Implementierung für die Arbeit mit dem Speicherdienst. Wenn Sie Verträge ändern, müssen Sie den Code in jedem Projekt manuell aktualisieren.

Ich möchte mich von der manuellen Aktualisierung zur automatischen Aktualisierung entfernen. Dies wird dazu beitragen, die Änderungsrate des Client-Codes zu erhöhen und Fehler zu reduzieren. Fehler sind Tippfehler in der URL, Fehler aufgrund von Nachlässigkeit usw.

Dieser Ansatz behebt jedoch keine Fehler in der Client-Geschäftslogik. Sie können es nur manuell einstellen.

Vom Problem zur Aufgabe


In unserem Fall ist es erforderlich, die automatische Generierung von Clientcode zu implementieren .
Dabei ist Folgendes zu beachten:

  • serverseitig - Controller sind bereits geschrieben;
  • Der Browser ist ein Client des Dienstes.
  • Dienste kommunizieren über HTTP.
  • Generation muss abgestimmt werden. Zum Beispiel, um JWT zu unterstützen.

Fragen


Bei der Lösung des Problems stellten sich Fragen:

  • welches Werkzeug zu wählen ist;
  • wie man Verträge bekommt;
  • wo die Verträge zu platzieren sind;
  • Wo soll der Client-Code platziert werden?
  • an welchem ​​Punkt die Generation zu tun.

Im Folgenden finden Sie Antworten auf diese Fragen.

Welches Tool soll ich wählen?


Tools für die Arbeit mit Verträgen werden in zwei Richtungen dargestellt - RPC und REST.



RPC kann nur als Remote-Aufruf verstanden werden, während REST zusätzliche Bedingungen für HTTP-Verben und URLs erfordert.

Die Unterschiede beim RPC- und REST-Aufruf werden hier dargestellt.
RPC - RemoteprozeduraufrufREST Representational State Transfer
, HTTP- URL
Restaurant:8080/Orders/PlaceOrderPOSTRestaurant:8080/Orders
Restaurant:8080/Orders/GetOrder?OrderNumber=1GETRestaurant:8080/Orders/1
Restaurant:8080/Orders/UpdateOrderPUTRestaurant:8080/Orders/1


Werkzeuge


Die Tabelle zeigt einen Vergleich der Tools für die Arbeit mit REST und RPC.
EigenschaftenOpenapiWsdlSparsamkeitgRPC
Eine ArtSICH AUSRUHENRpc
PlattformKommt nicht darauf an
ZungeKommt nicht darauf an
Entwicklungssequenz *Code zuerst, Spezifikation zuerstCode zuerst, Spezifikation zuerstSpezifikation zuerstCode zuerst, Spezifikation zuerst
TransportprotokollHTTP / 1.1any (REST erfordert HTTP)besitzenHTTP / 2
AussichtSpezifikationRahmen
KommentarNiedrige Einstiegsschwelle, viel DokumentationXML-Redundanz, SOAP usw.Hohe Einstiegsschwelle, wenig DokumentationDurchschnittliche Eintrittsschwelle, bessere Dokumentation
Code zuerst - zuerst schreiben wir den Serverteil und dann bekommen wir Verträge darüber. Es ist praktisch, wenn die Serverseite bereits geschrieben ist. Verträge müssen nicht manuell beschrieben werden.

Spezifikation zuerst - zuerst definieren wir die Verträge, dann erhalten wir den Client-Teil und den Server-Teil von ihnen. Es ist praktisch zu Beginn der Entwicklung, wenn noch kein Code vorhanden ist. Die WSDL-

Ausgabe ist

aufgrund ihrer Redundanz nicht geeignet.

Apache Thrift ist zu exotisch und schwer zu lernen.

GRPC erfordert Net Core 3.0 und Net Standard 2.1. Zum Zeitpunkt der Analyse wurden Net Core 2.2 und Net Standard 2.0 verwendet. Es gibt keine sofort einsatzbereite GRPC-Unterstützung im Browser. Eine zusätzliche Lösung ist erforderlich. GRPC verwendet die binäre Serialisierung von Protobuf und HTTP / 2. Aus diesem Grund wird der Umfang der Dienstprogramme zum Testen von APIs wie Postman usw. eingeschränkt. Lasttests über einige JMeter erfordern möglicherweise zusätzlichen Aufwand. Nicht geeignet, der Wechsel zu GRPC erfordert viele Ressourcen.

OpenAPI erfordert keine zusätzlichen Updates. Es bietet eine Fülle von Tools, die die Arbeit mit REST und dieser Spezifikation unterstützen. Wir wählen es aus.

Tools für die Arbeit mit OpenAPI


Die Tabelle zeigt einen Vergleich der Tools für die Arbeit mit OpenAPI.
WerkzeugeTaumelschnalleNSwagOpenapitools
Unterstützte SpezifikationsversionenKann Spezifikationen im OpenApi v2, v3-Format generieren
Code erste Unterstützunges gibtes gibtNein
Unterstützte ServersprachenNeinC #Viel
Unterstützte KundensprachenNeinC #, TypeScript, AngularJS, Angular (v2 +), window.fetch APIViel
GenerierungseinstellungenNeines gibtes gibt
AussichtNuget-PaketNuget-Paket + separates DienstprogrammSeparates Dienstprogramm
Die Schlussfolgerung von

Swashbuckle ist nicht geeignet, weil ermöglicht es Ihnen, nur die Spezifikation zu erhalten. Um Client-Code zu generieren, müssen Sie eine zusätzliche Lösung verwenden.

OpenApiTools ist ein interessantes Tool mit einer Reihe von Einstellungen, unterstützt jedoch nicht zuerst Code. Sein Vorteil ist die Möglichkeit, Servercode in vielen Sprachen zu generieren.

NSwag ist praktisch, da es sich um ein Nuget-Paket handelt. Beim Erstellen eines Projekts ist die Verbindung einfach. Unterstützt alles, was wir brauchen: Code First Approach und Generierung von Client-Code in c #. Wir wählen es aus.

Wo kann man Verträge abschließen? So greifen Sie auf Dienste zu Verträgen zu


Hier finden Sie Lösungen für die Organisation der Vertragsspeicherung. Die Lösungen werden in der Reihenfolge zunehmender Komplexität aufgelistet.

  • Der Provider-Service-Projektordner ist die einfachste Option. Wenn Sie den Ansatz ausführen müssen, wählen Sie ihn aus.
  • Ein freigegebener Ordner ist eine gültige Option, wenn sich die gewünschten Projekte im selben Repository befinden. Auf lange Sicht wird es schwierig sein, die Integrität der Verträge im Ordner aufrechtzuerhalten. Dies erfordert möglicherweise ein zusätzliches Tool, um verschiedene Versionen von Verträgen usw. zu berücksichtigen.
  • Separates Repository für Spezifikationen - Wenn sich die Projekte in verschiedenen Repositories befinden, sollten die Verträge an einem öffentlichen Ort platziert werden. Die Nachteile sind die gleichen wie beim freigegebenen Ordner.
  • über die Service-API (swagger.ui, swaggerhub) - ein separater Service, der sich mit dem Spezifikationsmanagement befasst.

Wir haben uns für die einfachste Option entschieden - Verträge im Projektordner des Dienstleisters zu speichern. Dies ist zu diesem Zeitpunkt genug für uns. Warum also mehr bezahlen?

Ab wann generieren Sie


Jetzt müssen Sie entscheiden, zu welchem ​​Zeitpunkt die Codegenerierung durchgeführt werden soll.
Wenn die Verträge geteilt würden, könnten Verbraucherdienste die Verträge erhalten und den Code bei Bedarf selbst generieren.

Wir haben uns entschlossen, die Verträge im Ordner des Dienstanbieterprojekts abzulegen. Dies bedeutet, dass die Erzeugung nach der Montage des Lieferantenserviceprojekts selbst erfolgen kann.

Wo soll der Client-Code platziert werden?


Der Kundencode wird vertraglich generiert. Es bleibt herauszufinden, wo es platziert werden soll.
Es scheint eine gute Idee zu sein, den Clientcode in ein separates StorageServiceClientProxy-Projekt einzufügen. Jedes Projekt kann diese Baugruppe verbinden.

Vorteile dieser Lösung:

  • Der Client-Code ist in der Nähe seines Dienstes und ständig auf dem neuesten Stand.
  • Verbraucher können den Link zum Projekt in einem Repository verwenden.

Nachteile:

  • funktioniert nicht, wenn Sie einen Client in einem anderen Teil des Systems generieren müssen, z. B. in einem anderen Repository. Es wird gelöst, indem mindestens ein freigegebener Ordner für Verträge verwendet wird.
  • Verbraucher müssen in derselben Sprache verfasst sein. Wenn Sie einen Client in einer anderen Sprache benötigen, müssen Sie OpenApiTools verwenden.

Wir befestigen NSwag


Controller-Attribute


Sie müssen NSwag mitteilen, wie die richtige Spezifikation für unsere Controller generiert werden soll.

Dazu müssen Sie die Attribute anordnen.

[Microsoft.AspNetCore.Mvc.Routing.Route("[controller]")]  //  url
[Microsoft.AspNetCore.Mvc.ApiController] //     
public class DescriptionController : ControllerBase {
[NSwag.Annotations.OpenApiOperation("GetDescription")] //    
[Microsoft.AspNetCore.Mvc.ProducesResponseType(typeof(ConversionDescription), 200)] //    200  
[Microsoft.AspNetCore.Mvc.ProducesResponseType(401)] //    401
[Microsoft.AspNetCore.Mvc.ProducesResponseType(403)] //    403
[Microsoft.AspNetCore.Mvc.HttpGet("{pluginName}/{binaryDataId}")] //  url
public ActionResult<ConversionDescription> GetDescription(string pluginName, Guid binaryDataId) { 
 // ... 
}

Standardmäßig kann NSwag nicht die richtige Spezifikation für die Anwendung / den Oktett-Stream vom Typ MIME generieren. Dies kann beispielsweise passieren, wenn Dateien übertragen werden. Um dies zu beheben, müssen Sie Ihr Attribut und Ihren Prozessor schreiben, um die Spezifikation zu erstellen.

[Microsoft.AspNetCore.Mvc.Route("[controller]")]
[Microsoft.AspNetCore.Mvc.ApiController]
public class FileController : ControllerBase {
[NSwag.Annotations.OpenApiOperation("SaveFile")]
[Microsoft.AspNetCore.Mvc.ProducesResponseType(401)]
[Microsoft.AspNetCore.Mvc.ProducesResponseType(403)]
[Microsoft.AspNetCore.Mvc.HttpPost("{pluginName}/{binaryDataId}/{fileName}")]
[OurNamespace.FileUploadOperation] //  
public async Task SaveFile() { // ... }

Prozessor zum Generieren von Spezifikationen für Dateivorgänge


Die Idee ist, dass Sie Ihr Attribut und Ihren Prozessor schreiben können, um dieses Attribut zu verarbeiten.

Wir hängen das Attribut an den Controller, und wenn NSwag es erfüllt, verarbeitet es es mit unserem Prozessor.

Um dies zu implementieren, stellt NSwag die Klassen OpenApiOperationProcessorAttribute und IOperationProcessor bereit.

In unserem Projekt haben wir unsere Erben gemacht:

  • FileUploadOperationAttribute: OpenApiOperationProcessorAttribute
  • FileUploadOperationProcessor: IOperationProcessor

Lesen Sie hier mehr über die Verwendung von Prozessoren.

NSwag-Konfiguration zur Spezifikations- und Codegenerierung


In den Hauptabschnitten von config 3:

  • Laufzeit - Gibt die .net-Laufzeit an. Zum Beispiel NetCore22;
  • documentGenerator - beschreibt, wie eine Spezifikation generiert wird;
  • codeGenerators - Definiert, wie Code gemäß der Spezifikation generiert wird.

NSwag enthält eine Reihe von Einstellungen, was zunächst verwirrend ist.

Zur Vereinfachung können Sie NSwag Studio verwenden. Mithilfe dieser Funktion können Sie in Echtzeit sehen, wie sich verschiedene Einstellungen auf das Ergebnis der Codegenerierung oder -spezifikationen auswirken. Wählen Sie danach die ausgewählten Einstellungen in der Konfigurationsdatei manuell aus.

Weitere Informationen zu den Konfigurationseinstellungen finden Sie hier

Wir generieren die Spezifikation und den Client-Code bei der Zusammenstellung des Projekts des Dienstleisters


Gehen Sie wie folgt vor, damit nach der Zusammenstellung des Dienstanbieterprojekts die Spezifikation und der Code generiert werden:

  1. Wir haben ein WebApi-Projekt für den Kunden erstellt.
  2. Wir haben eine Konfiguration für Nswag CLI - Nswag.json geschrieben (im vorherigen Abschnitt beschrieben).
  3. Wir haben ein PostBuild-Ziel innerhalb des csproj-Dienstanbieterprojekts geschrieben.

<Target Name="GenerateWebApiProxyClient“ AfterTargets="PostBuildEvent">
<Exec Command="$(NSwagExe_Core22) run nswag.json”/>

  • $ (NSwagExe_Core22) nswag.json ausführen - Führen Sie das Dienstprogramm NSwag unter .bet runtine netCore 2.2 mit der Konfiguration nswag.json aus

Das Ziel macht Folgendes:

  1. NSwag generiert eine Spezifikation aus einer Vendor Service Assembly.
  2. NSwag generiert Client-Code gemäß Spezifikation.

Nach jeder Baugruppe des Dienstanbieterprojekts wird das Clientprojekt aktualisiert.
Das Projekt des Kunden und des Dienstleisters befinden sich in derselben Lösung.
Die Montage erfolgt als Teil der Lösung. Die Lösung ist so konfiguriert, dass das Client-Projekt nach dem Supplier-Service-Projekt zusammengestellt wird.

Mit NSwag können Sie auch die Spezifikation / Codegenerierung über die Software-API unbedingt anpassen.

So fügen Sie Unterstützung für JWT hinzu


Wir müssen unseren Service vor unbefugten Anfragen schützen. Dafür verwenden wir JWT-Token. Sie müssen in den Headern jeder HTTP-Anforderung gesendet werden, damit der Dienstanbieter sie überprüfen und entscheiden kann, ob die Anforderung erfüllt werden soll oder nicht.

Weitere Informationen zu JWT hier jwt.io .

Die Aufgabe besteht darin, die Header der ausgehenden HTTP-Anforderung zu ändern.
Zu diesem Zweck kann der NSwag-Codegenerator einen Erweiterungspunkt generieren - die CreateHttpRequestMessageAsync-Methode. Innerhalb dieser Methode gibt es Zugriff auf die HTTP-Anforderung, bevor sie gesendet wird.

Codebeispiel
protected Task<HttpRequestMessage> CreateHttpRequestMessageAsync(CancellationToken cancellationToken) {
      var message = new HttpRequestMessage();

      if (!string.IsNullOrWhiteSpace(this.AuthorizationToken)) {
        message.Headers.Authorization =
          new System.Net.Http.Headers.AuthenticationHeaderValue(BearerScheme, this.AuthorizationToken);
      }

      return Task.FromResult(message);
    }


Fazit


Wir haben die Option mit OpenAPI gewählt, weil Es ist einfach zu implementieren und die Tools für die Arbeit mit dieser Spezifikation sind hoch entwickelt.

Schlussfolgerungen zu OpenAPI und GRPC:

OpenAPI

  • die Spezifikation ist ausführlich;
  • , ;
  • ;
  • .

GRPC

  • , URL, HTTP ..;
  • OpenAPI;
  • ;
  • ;
  • HTTP/2.

Somit haben wir eine Spezifikation erhalten, die auf dem bereits geschriebenen Code der Steuerungen basiert. Zu diesem Zweck mussten spezielle Attribute an die Controller gehängt werden.

Basierend auf der empfangenen Spezifikation haben wir dann die Generierung von Client-Code implementiert. Jetzt müssen wir den Client-Code nicht mehr manuell aktualisieren.

Es wurden Studien im Bereich Versions- und Testverträge durchgeführt. Aufgrund fehlender Ressourcen war es jedoch nicht möglich, das Ganze in der Praxis zu testen.

Versionierung öffentlicher Aufträge


Warum öffentliche Aufträge versionieren?


Nach Änderungen bei den Dienstanbietern muss das gesamte System in einem konsistenten Betriebszustand bleiben.

Das Brechen von Änderungen in der öffentlichen API muss vermieden werden, um Clients nicht zu beschädigen.

Lösungsoptionen


Ohne Versionierung öffentlicher Aufträge


Das Dienstanbieterteam selbst repariert die Verbraucherdienste.



Dieser Ansatz funktioniert nicht, wenn das Service Provider-Team keinen Zugriff auf die Consumer Service Repositories hat oder keine Kompetenzen besitzt. Wenn es keine derartigen Probleme gibt, können Sie auf die Versionierung verzichten.



Verwenden Sie die Versionierung öffentlicher Aufträge


Das Dienstleisterteam verlässt die vorherige Version der Verträge.



Dieser Ansatz hat nicht die Nachteile des vorherigen, fügt aber andere Schwierigkeiten hinzu.
Sie müssen sich für Folgendes entscheiden:

  • welches Werkzeug zu verwenden ist;
  • wann eine neue Version einzuführen ist;
  • wie lange alte Versionen zu pflegen.

Welches Tool zu verwenden


Die Tabelle zeigt die Funktionen von OpeanAPI und GRPC im Zusammenhang mit der Versionierung.
gRPCOpenapi
VersionsattributAuf der Protobuf-Ebene gibt es ein Attributpaket [packageName]. [Version]Auf der Spezifikationsebene gibt es die Attribute basePath (für URL) und Version
Veraltetes Attribut für MethodenJa, aber vom Codegenerator unter C # nicht berücksichtigtJa, es ist als veraltet markiert
. NSwag wird nicht zuerst mit Code unterstützt. Sie müssen Ihren Prozessor schreiben
Veraltetes Attribut für ParameterIst als veraltet markiertJa, es ist als veraltet markiert
. NSwag wird nicht zuerst mit Code unterstützt. Sie müssen Ihren Prozessor schreiben
Veraltet bedeutet, dass sich diese API nicht mehr lohnt.

Beide Tools unterstützen die Attribute version und veraltet.

Wenn Sie OpenAPI und den Code First-Ansatz verwenden, müssen Sie erneut Prozessoren schreiben, um die richtige Spezifikation zu erstellen.

Wann soll eine neue Version eingeführt werden?


Die neue Version muss eingeführt werden, wenn Änderungen an den Verträgen die Abwärtskompatibilität nicht gewährleisten.

Wie kann überprüft werden, ob Änderungen die Kompatibilität zwischen der neuen und der alten Vertragsversion verletzen?


Wie lange müssen Versionen gewartet werden?


Es gibt keine richtige Antwort auf diese Frage.

Um die Unterstützung für die alte Version zu entfernen, müssen Sie wissen, wer Ihren Dienst verwendet.

Es ist schlecht, wenn die Version entfernt wird und jemand anderes sie verwendet. Es ist besonders schwierig, wenn Sie Ihre Kunden nicht kontrollieren.

Was kann also in dieser Situation getan werden?

  • Benachrichtigen Sie Kunden, dass die alte Version nicht mehr unterstützt wird. In diesem Fall können wir Kundeneinkommen verlieren;
  • unterstützen den gesamten Satz von Versionen. Die Kosten für Software-Support steigen.
  • Um diese Frage zu beantworten, müssen Sie das Unternehmen fragen: Übersteigen die Einnahmen alter Kunden die Kosten für die Unterstützung älterer Softwareversionen? Könnte es rentabler sein, Kunden um ein Upgrade zu bitten?

Der einzige Rat in dieser Situation besteht darin, öffentlichen Aufträgen mehr Aufmerksamkeit zu schenken, um die Häufigkeit ihrer Änderungen zu verringern.

Wenn öffentliche Aufträge in einem geschlossenen System verwendet werden, können Sie den CDC-Ansatz verwenden. So können wir herausfinden, wann Kunden ältere Versionen der Software nicht mehr verwenden. Danach können Sie die Unterstützung der alten Version entfernen.

Fazit


Verwenden Sie die Versionierung nur, wenn Sie nicht darauf verzichten können. Wenn Sie sich für die Versionierung entscheiden, sollten Sie beim Entwerfen von Verträgen die Versionskompatibilität berücksichtigen. Es muss ein Gleichgewicht zwischen den Kosten für die Unterstützung älterer Versionen und den damit verbundenen Vorteilen hergestellt werden. Es lohnt sich auch zu entscheiden, wann Sie die alte Version nicht mehr unterstützen können.

Testverträge und CDC


Dieser Abschnitt ist oberflächlich beleuchtet, wie Es gibt keine ernsthaften Voraussetzungen für die Umsetzung dieses Ansatzes.

Verbrauchergetriebene Verträge (CDC)


CDC ist die Antwort auf die Frage, wie sichergestellt werden kann, dass Lieferant und Verbraucher dieselben Verträge nutzen. Dies sind eine Art Integrationstest zur Überprüfung von Verträgen.
Die Idee ist wie folgt:

  1. Der Verbraucher beschreibt den Vertrag.
  2. Der Lieferant setzt diesen Vertrag zu Hause um.
  3. Dieser Vertrag wird im CI-Prozess beim Verbraucher und Lieferanten verwendet. Wenn der Prozess verletzt wird, hat jemand den Vertrag nicht mehr eingehalten.

Pakt


PACT ist ein Tool, das diese Idee umsetzt.

  1. Der Verbraucher schreibt Tests mit der PACT-Bibliothek.
  2. Diese Tests werden in eine Artefakt-Pakt-Datei konvertiert. Es enthält Informationen zu den Verträgen.
  3. Der Anbieter und der Verbraucher verwenden die Paktdatei, um die Tests auszuführen.

Während Client-Tests wird ein Provider-Stub erstellt, und während Supplier-Tests wird ein Client-Stub erstellt. Beide Stubs verwenden eine Paktdatei.

Ein ähnliches Verhalten bei der Stub-Erstellung kann mit dem Swagger Mock Validator bitbucket.org/atlassian/swagger-mock-validator/src/master erzielt werden .

Nützliche Links zum Pakt





Wie CDC in CI eingebettet werden kann


  • Pact + Pact Broker selbst bereitstellen;
  • Kaufen Sie eine fertige Pact Flow SaaS-Lösung.

Fazit


Ein Pakt ist erforderlich, um die Einhaltung der Verträge sicherzustellen. Es wird angezeigt, wenn Vertragsänderungen die Erwartungen von Verbraucherdienstleistungen verletzen.

Dieses Tool eignet sich, wenn sich der Lieferant an den Kunden - den Kunden - anpasst. Dies ist nur innerhalb eines isolierten Systems möglich.

Wenn Sie einen Service für die Außenwelt erbringen und nicht wissen, wer Ihre Kunden sind, ist Pact nichts für Sie.

All Articles