Die aufgeworfene Frage ist eigentlich für jedes System, das auf einer SOA aufbaut, sehr häufig. In der Regel haben Sie einige Verbraucher für eine WSDL oder einige Dienste, die dieselbe WSDL verwenden, und nun muss diese WSDL aktualisiert werden.
- Müssen wir alle Clients und den Server gleichzeitig aktualisieren (das ist teuer!)?
- Welche Vorgänge in der WSDL sind bei einer stufenweisen Bereitstellung betroffen (defekt), wenn der aktualisierte Client einen nicht aktualisierten Dienst aufruft?
- Und andersherum: Können einige Clients später aktualisiert werden?
- Wie ändert sich die XML-Struktur? Können diese Änderungen von einigen Parsern toleriert werden (z. B. brechen einige Parser nicht ab, wenn sie ein neues Element am Ende der Sequenz finden, wohl aber, wenn es in der Mitte gefunden wird).
Und nein, weder diff für WSDL noch diff für generiertes XML können zuverlässig helfen.
Zusätzlich zu den Schemaänderungen kann WSDL die Art und Weise ändern, wie die Nutzdaten strukturiert sind (Body/Header), die Kodierung/Qualifizierung, die SOAP-Action, die Bindungseigenschaften - all dies kann den Verlust der Interoperabilität zur Folge haben.
Erschwerend kommt hinzu, dass einige Arten von Änderungen, die in der Eingabe vorgenommen werden, das Szenario "aktualisiert auf alt" aufheben, während sie in der Ausgabe als nicht aufhebend betrachtet werden sollten. So würde beispielsweise ein neues optionales Element in der Anfrage den alten Dienst unterbrechen, wenn es übergeben wird, aber das gleiche Element in der Antwort wird vom alten Dienst nicht erzeugt (weil er es nicht kennt), und das Fehlen des Elements wird vom aktualisierten Client toleriert, weil das Element optional ist.
Mein Team ist etwa einmal pro Woche mit diesen Aufgaben konfrontiert. Bis vor kurzem haben wir einen manuellen Vergleich der WSDL-/Schemadateien durchgeführt und versucht, die Auswirkungen herauszufinden. Manchmal ist es offensichtlich, aber manchmal führte unser Ansatz zu Fehlern. Wir brauchten einen besseren Weg.
Membrane SOA war eine Hilfe. Leider werden in einigen Fällen die Änderungen im Schema nicht erkannt, so dass ein Vorgang fälschlicherweise als nicht betroffen gemeldet wird, obwohl er in Wirklichkeit defekt ist. Außerdem ist aus der Ausgabe nicht sofort ersichtlich, welches Szenario ("alt zu aktualisiert" oder "aktualisiert zu alt") gemeldet wird.
Nach einigen Jahren der Qual musste ich also meinen eigenen Code schreiben, der die obigen Fragen in einer Weise beantwortet, die ich unseren BAs/PMs direkt als unterstützende Dokumentation für die Folgenabschätzung vorlegen kann.
Siehe hier: https://wsdldiff.mockmotor.com/
- Laden Sie Ihre WSDL und Schemata hoch:
- Der Dienst gibt Ihnen eine Zusammenfassung der Auswirkungen: Sind die Änderungen fehlerhaft und welches Einsatzszenario ist betroffen?
- Jeder Vorgang wird als "breaking" oder "non-breaking" Änderung sowohl in den Ports als auch in den Bindungen markiert:
- Sie können einen Blick auf die Details einer bahnbrechenden Änderung werfen (d.h. welche Schema-/wsdl-Änderung sie verursacht). Hier wurde zum Beispiel ein obligatorisches Element in der Mitte einer Sequenz hinzugefügt:
Das soll nicht heißen, dass man sich blind auf Instrumente wie dieses verlassen sollte, aber es spart eine Menge Zeit bei der Folgenabschätzung.