|
| 1 | +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
| 2 | +<documents> |
| 3 | + <document uid="84f7f22eb70c7598e43d0d6d2d175c26"> |
| 4 | + <field name="title"><![CDATA[Konvertierung einer REST-API zu einer SOAP-Schnittstelle mithilfe von Kong]]></field> |
| 5 | + <field name="subline"><![CDATA[]]></field> |
| 6 | + <field name="teaser"><![CDATA[<p>Welche Möglichkeiten haben wir, wenn neben einer REST-API auch eine SOAP-Schnittstelle zur Verfügung stehen soll? |
| 7 | +In diesem Artikel wird eine Methode vorgestellt, wie man diese Anforderung mit Hilfe von Kong umsetzen kann.</p> |
| 8 | +
|
| 9 | +]]></field> |
| 10 | + <field name="language_multi_keyword"><![CDATA[de]]></field> |
| 11 | + <field name="content_type_multi_keyword"><![CDATA[blog]]></field> |
| 12 | + <field name="mime_type_multi_keyword"><![CDATA[text/html]]></field> |
| 13 | + <field name="category_multi_keyword"><![CDATA[Softwareentwicklung]]></field> |
| 14 | + <field name="tag_multi_keyword"><![CDATA[Kong]]></field> |
| 15 | + <field name="tag_multi_keyword"><![CDATA[SOAP]]></field> |
| 16 | + <field name="tag_multi_keyword"><![CDATA[REST]]></field> |
| 17 | + <field name="tag_multi_keyword"><![CDATA[Lua]]></field> |
| 18 | + <field name="date_date"><![CDATA[2021-06-18T16:00:00+02:00]]></field> |
| 19 | + <field name="date_l"><![CDATA[1624024800000]]></field> |
| 20 | + <field name="change_date"><![CDATA[1624024800000]]></field> |
| 21 | + <!--Picture--> |
| 22 | + <!-- Not in use at the moment--> |
| 23 | + <!--Author Information--> |
| 24 | + <field name="author_first_name"><![CDATA[Daniel]]></field> |
| 25 | + <field name="author_last_name"><![CDATA[Kraft]]></field> |
| 26 | + <field name="author_id"><![CDATA[DanielKraft]]></field> |
| 27 | + <field name="author_picture_stored_only"><![CDATA[http://localhost:4000/assets/images/avatars/DanielKraft.jpg]]></field> |
| 28 | + <!--Postcontent--> |
| 29 | + <field name="headlines"><![CDATA[Konvertierung einer REST-API zu einer SOAP-Schnittstelle mithilfe von Kong]]></field> |
| 30 | + <field name="display_content"><![CDATA[<div class="i2-intro p-t-1"> |
| 31 | + <p>Welche Möglichkeiten haben wir, wenn neben einer REST-API auch eine SOAP-Schnittstelle zur Verfügung stehen soll? |
| 32 | +In diesem Artikel wird eine Methode vorgestellt, wie man diese Anforderung mit Hilfe von Kong umsetzen kann.</p> |
| 33 | +
|
| 34 | +</div>]]></field> |
| 35 | + <field name="content"><![CDATA[<div class="adesso-text-formate"> |
| 36 | +<div class="row p-t-2"> |
| 37 | +<div class="adesso-container"> |
| 38 | +<div class="col-xl-8 adesso-center p-b-1 p-l-0 p-r-0"> |
| 39 | + <p>Welche Möglichkeiten haben wir, wenn neben einer REST-API auch eine SOAP-Schnittstelle zur Verfügung stehen soll? |
| 40 | +In diesem Artikel wird eine Methode vorgestellt, wie man diese Anforderung mit Hilfe von Kong umsetzen kann.</p> |
| 41 | +
|
| 42 | +<h4 id="motivation">Motivation</h4> |
| 43 | +<p>Wie bereist beschrieben, kann es manchmal gewollt sein, dass eine Schnittstelle über REST und SOAP erreichbar ist. |
| 44 | +Hier stellt sich nun die Frage wie man diese Anforderung realisiert.</p> |
| 45 | +
|
| 46 | +<p>Eine intuitive Herangehensweise wäre es, für den Service die zwei Schnittstellen getrennt zu implementieren. |
| 47 | +Diese Lösung hat allerdings den Nachteil, dass die Schnittstellen sich durch die getrennte Implementierung unterschiedlich verhalten könnten. |
| 48 | +Außerdem müssen bei einer Änderung des Service beide Schnittstellen verändert werden, womit zusätzlicher Arbeitsaufwand verbunden wäre.</p> |
| 49 | +
|
| 50 | +<p>Um diese Probleme zu vermeiden, könnten wir für den Service nur eine Schnittstelle implementieren, zum Beispiel eine REST-API, da diese heutzutage häufig verwendet wird. |
| 51 | +Die SOAP-Schnittstelle hingegen könnten wir anschließend aus der REST-API generieren.</p> |
| 52 | +
|
| 53 | +<h4 id="vorstellung-der-architektur">Vorstellung der Architektur</h4> |
| 54 | +<p>Für die Realisierung beider Schnittstellen wird ein <a href="https://konghq.com/kong/">Kong API Gateway</a> mit dem Kong Plugin <a href="https://github.com/adessoAG/kong-plugin-soap2rest">soap2rest</a> sowie ein REST-Service benötigt.</p> |
| 55 | +
|
| 56 | +<p><img src="/assets/images/posts/Konvertierung-einer-REST-API-zu-einer-SOAP-Schnittstelle-mithilfe-von-Kong/Architektur.png" alt="Architektur Skizze" /></p> |
| 57 | +
|
| 58 | +<p>Die Abbildung zeigt, wie die einzelnen Komponenten miteinander verknüpft sind. |
| 59 | +Das Kong API Gateway verwaltet den Zugriff auf den REST-Service. |
| 60 | +Für den Fall, dass wir eine Anfrage über die REST-Schnittstelle stellen, wird diese Anfrage an den Service weitergeleitet und bearbeitet.</p> |
| 61 | +
|
| 62 | +<p>Für die Verarbeitung von SOAP-Anfragen wird das Kong Plugin soap2rest verwendet. |
| 63 | +Das Plugin benötigt zur Konfiguration zwei Dateien. |
| 64 | +Damit das Plugin die SOAP-Anfragen richtig verarbeiten kann, benötigt es die WSDL der SOAP-Schnittstelle. |
| 65 | +Und um die Konvertierung von SOAP zu REST Anfragen korrekt durchzuführen, wird zusätzlich die OpenAPI-Spezifikation der REST-API benötigt.</p> |
| 66 | +
|
| 67 | +<h4 id="funktionsablauf-des-plugins">Funktionsablauf des Plugins</h4> |
| 68 | +<p><img src="/assets/images/posts/Konvertierung-einer-REST-API-zu-einer-SOAP-Schnittstelle-mithilfe-von-Kong/Ablauf.png" alt="Funktionsablauf des Plugins" /></p> |
| 69 | +
|
| 70 | +<p>Diese Abbildung zeigt den Fall, dass eine Anfrage über die SOAP-Schnittstelle gestellt wird. |
| 71 | +Sobald Kong eine Anfrage über die Route der SOAP-Schnittstelle registriert, wird das Plugin soap2rest ausgeführt. |
| 72 | +Das Plugin konvertiert die Anfrage in eine gültige REST-Anfrage und sendet diese an den REST-Service. |
| 73 | +Nachdem der REST-Service geantwortet hat, wird die Antwort in eine gültige SOAP-Antwort übersetzt und zurückgegeben.</p> |
| 74 | +
|
| 75 | +<p>Anhand des folgenden Beispiels lässt sich der Ablauf näher verdeutlichen. |
| 76 | +Angenommen, folgende Anfrage wird an die SOAP-Schnittstelle gestellt.</p> |
| 77 | +
|
| 78 | +<pre><code class="language-xml"><?xml version="1.0" encoding="utf-8"?> |
| 79 | +<soap:Envelope |
| 80 | + xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" |
| 81 | + xmlns:tns="http://www.w3.org/2001/XMLSchema"> |
| 82 | + <soap:Body> |
| 83 | + <tns:GetPetByPetid_InputMessage> |
| 84 | + <tns:petId>1</tns:petId> |
| 85 | + </tns:GetPetByPetid_InputMessage> |
| 86 | + </soap:Body> |
| 87 | +</soap:Envelope> |
| 88 | +</code></pre> |
| 89 | +
|
| 90 | +<p>Aus dieser Anfrage lassen sich verschiedene Informationen ableiten. |
| 91 | +Zum einen wird mit dieser Anfrage die SOAP-Action <code>GetPetByPetid</code> ausgeführt. |
| 92 | +Zusätzlich beinhaltet die Anfrage den Parameter <code>petId</code> mit dem Wert <code>1</code>. |
| 93 | +Anhand dieser Informationen kann die Anfrage der passenden REST Anfrage zugeordnet werden. |
| 94 | +In diesem Fall entspricht die Anfrage dem Pfad <code>/pet/1</code>.</p> |
| 95 | +
|
| 96 | +<p>Nachdem das Plugin die generierte Anfrage an die REST-API gestellt hat, bekommt es folgende Antwort:</p> |
| 97 | +
|
| 98 | +<pre><code class="language-json">{ |
| 99 | + "id": 1, |
| 100 | + "name": "doggie", |
| 101 | + "photoUrls": [], |
| 102 | + "tags": [], |
| 103 | + "status": "available" |
| 104 | +} |
| 105 | +</code></pre> |
| 106 | +
|
| 107 | +<p>Anschließend wird diese Antwort vom Plugin in gültiges XML umgewandelt und in eine SOAP-Antwort eingesetzt, welche anschließend zurückgegeben wird.</p> |
| 108 | +
|
| 109 | +<pre><code class="language-xml"><?xml version="1.0" encoding="UTF-8"?> |
| 110 | +<soap:Envelope |
| 111 | + xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" |
| 112 | + xmlns:tns="http://www.w3.org/2001/XMLSchema"> |
| 113 | + <soap:Body> |
| 114 | + <tns:GetPetByPetid_OutputMessage> |
| 115 | + <tns:Pet> |
| 116 | + <tns:id>1</tns:id> |
| 117 | + <tns:name>doggie</tns:name> |
| 118 | + <tns:photoUrls></tns:photoUrls> |
| 119 | + <tns:tags></tns:tags> |
| 120 | + <tns:status>available</tns:status> |
| 121 | + </tns:Pet> |
| 122 | + </tns:GetPetByPetid_OutputMessage> |
| 123 | + </soap:Body> |
| 124 | +</soap:Envelope> |
| 125 | +</code></pre> |
| 126 | +
|
| 127 | +<h4 id="besonderheiten-des-kong-plugins-soap2rest">Besonderheiten des Kong Plugins soap2rest</h4> |
| 128 | +<h5 id="analyse-der-schnittstellen-spezifikationen">Analyse der Schnittstellen-Spezifikationen</h5> |
| 129 | +<p>Die Analyse der WSDL und der OpenAPI ist ein wichtiger Bestandteil des Plugins. |
| 130 | +Sie wird nur einmal vor der ersten Anfrage an die SOAP-Schnittstelle ausgeführt, um die Schnittstelle zu konfigurieren. |
| 131 | +Dadurch verzögert sich die Antwort der ersten Anfrage im Durchschnitt um 200 Millisekunden. |
| 132 | +Anschließend wird diese Konfiguration für die Verarbeitung aller folgenden Anfragen verwendet.</p> |
| 133 | +
|
| 134 | +<p>Bei der Analyse der WSDL werden wichtige Merkmale der SOAP-Schnittstelle ausgelesen. |
| 135 | +Dazu gehören zum Beispiel das Auslesen der verschiedenen Operationen und ihrer zugehörigen Rückgabetypen und Faults. |
| 136 | +Es wird besonders die Struktur der Rückgabetypen betrachtet, damit das Plugin später gültige SOAP-Antworten generieren kann.</p> |
| 137 | +
|
| 138 | +<p>Nachdem die WSDL analysiert wurde, wird die Konfiguration des Plugins mit der OpenAPI-Spezifikation der REST-API vervollständigt. |
| 139 | +Dabei werden den SOAP-Operationen die passenden Pfade der REST-API automatisiert zugeordnet. |
| 140 | +Außerdem werden jeder Operation die passenden Content-Types zugeordnet, damit die HTTP-Header bei der Weiterleitung der Anfragen an die REST-API korrekt gesetzt werden können.</p> |
| 141 | +
|
| 142 | +<h5 id="request-und-response-konvertierung">Request und Response Konvertierung</h5> |
| 143 | +<p>Bei der Konvertierung von eingehenden SOAP-Anfragen, werden diese in den meisten Fällen direkt von XML in JSON überführt. |
| 144 | +Manchmal müssen davor aber noch andere Verarbeitungsschritte durchgeführt werden. |
| 145 | +Zum Beispiel werden sämtliche SOAP-Header in HTTP-Header überführt. |
| 146 | +Außerdem werden Dateiuploads in Multipart Bodys überführt und den Dateien wird mit Hilfe einer Mime Type Analyse der richtige Content-Type zugeordnet.</p> |
| 147 | +
|
| 148 | +<p>Auch bei der Konvertierung der REST-Antworten werden verschiedene Zwischenschritte benötigt. |
| 149 | +Wenn die REST-API nicht den Statuscode 200 zurückgibt, wird die Antwort in ein gültiges SOAP-Fault umgewandelt.</p> |
| 150 | +
|
| 151 | +<p>Bei der Umwandlung der Antwort in XML wird besonders darauf geachtet, dass die Reihenfolge der Attribute des Rückgabetyps mit der Reihenfolge in der WSDL übereinstimmen. |
| 152 | +Dafür wird die automatisch generierte Konfiguration des Plugins verwendet.</p> |
| 153 | +
|
| 154 | +<h4 id="auswirkungen-auf-die-verfügbarkeit">Auswirkungen auf die Verfügbarkeit</h4> |
| 155 | +<p>Damit der Einsatz des Plugins sich lohnt, sollte die Verfügbarkeit der Schnittstelle nicht unter dem Einsatz des Plugins leiden. |
| 156 | +Um die Auswirkungen des Plugins auf die Verfügbarkeit der Schnittstelle zu testen, wurde ein Performance- und ein Lasttest vorgenommen.</p> |
| 157 | +
|
| 158 | +<h5 id="durchführung-eines-performancetests">Durchführung eines Performancetests</h5> |
| 159 | +<p>Der Performancetest besteht aus vier verschiedenen Anfragen, welche jeweils 10-mal wiederholt wurden. |
| 160 | +Zwei der vier Anfragen liefern nur einen HTTP Status Code von 200 und 300 zurück. |
| 161 | +Die dritte Anfrage sendet mit einem HTTP POST ein kleines JSON Objekt an die Schnittstelle. |
| 162 | +Und die vierte Anfrage versucht die Grenzen der Schnittstelle auszuloten, indem eine Datei an die Schnittstelle gesendet wird.</p> |
| 163 | +
|
| 164 | +<p>Die nachfolgende Grafik zeigt links die Ergebnisse des Performancetests auf die REST-API und rechts die Ergebnisse der SOAP-Schnittstelle.</p> |
| 165 | +
|
| 166 | +<p><img src="/assets/images/posts/Konvertierung-einer-REST-API-zu-einer-SOAP-Schnittstelle-mithilfe-von-Kong/Performancetest.png" alt="Vergleich der Anfragezeiten" /></p> |
| 167 | +
|
| 168 | +<p>Im direkten Vergleich fällt auf, dass die Performance nur beim Senden von Dateien leidet. |
| 169 | +Die Performance aller andern Anfragen verändert sich nur geringfügig.</p> |
| 170 | +
|
| 171 | +<p>Der Anstieg der Antwortzeit ist darauf zurückzuführen, dass bei SOAP-Anfragen deutlich mehr Daten an die Schnittstelle gesendet werden müssen.</p> |
| 172 | +
|
| 173 | +<h5 id="durchführung-eines-lasttests">Durchführung eines Lasttests</h5> |
| 174 | +<p>Im Gegensatz zum Performancetest wurden die vier Anfragen 250-mal parallel ausgeführt. |
| 175 | +Um ein aussagekräftiges Ergebnis zu erhalten wurde dieser 10-mal wiederholt.</p> |
| 176 | +
|
| 177 | +<p>Die folgende Grafik zeigt die Ergebnisse des Lasttests.</p> |
| 178 | +
|
| 179 | +<p><img src="/assets/images/posts/Konvertierung-einer-REST-API-zu-einer-SOAP-Schnittstelle-mithilfe-von-Kong/Lasttest.png" alt="Lasttest" /></p> |
| 180 | +
|
| 181 | +<p>Auf den ersten Blick fällt auf, dass die SOAP-Schnittstelle bei vielen parallelen Anfragen längere Antwortzeiten aufweist, als die REST-API. |
| 182 | +Vor allem das Senden von Dateien führt zu einem deutlichen Anstieg der Antwortzeit. |
| 183 | +Der Kommunikationsaufwand in Verbindung mit den vielen gleichzeitigen Anfragen auf die Schnittstelle ist für die langsamere Antwortzeit verantwortlich.</p> |
| 184 | +
|
| 185 | +<h4 id="fazit">Fazit</h4> |
| 186 | +<p>Zusammenfassend lässt sich sagen, dass die Nutzung dieses Kong Plugins den Vorteil hat, dass nicht beide Schnittstellen implementiert werden müssen. |
| 187 | +Ein Nachteil ist die zusätzliche Wartezeit auf die Antwort der Schnittstelle, da sich hinter jeder SOAP-Anfrage eine Anfrage auf die REST-API verbirgt. |
| 188 | +Diese Verzögerung kann allerdings vernachlässigt werden, da erst bei vielen parallelen Anfragen ein deutlich längere Wartezeit entsteht. |
| 189 | +Im Großen und Ganzen überwiegen die Vorteile des Plugins die Nachteile.</p> |
| 190 | +
|
| 191 | +</div> |
| 192 | +</div> |
| 193 | +</div> |
| 194 | +</div>]]></field> |
| 195 | + </document> |
| 196 | +</documents> |
0 commit comments