Skip to content
This repository was archived by the owner on Nov 27, 2023. It is now read-only.

Commit 2e9a659

Browse files
jekyll2cmsroot
authored andcommitted
ADD assets/first-spirit-xml/2021-06-18/2021-06-18-Konvertierung-einer-REST-API-zu-einer-SOAP-Schnittstelle-mithilfe-von-Kong.xml
1 parent f2c8f72 commit 2e9a659

File tree

1 file changed

+196
-0
lines changed

1 file changed

+196
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
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">&lt;?xml version="1.0" encoding="utf-8"?&gt;
79+
&lt;soap:Envelope
80+
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
81+
xmlns:tns="http://www.w3.org/2001/XMLSchema"&gt;
82+
&lt;soap:Body&gt;
83+
&lt;tns:GetPetByPetid_InputMessage&gt;
84+
&lt;tns:petId&gt;1&lt;/tns:petId&gt;
85+
&lt;/tns:GetPetByPetid_InputMessage&gt;
86+
&lt;/soap:Body&gt;
87+
&lt;/soap:Envelope&gt;
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">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
110+
&lt;soap:Envelope
111+
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
112+
xmlns:tns="http://www.w3.org/2001/XMLSchema"&gt;
113+
&lt;soap:Body&gt;
114+
&lt;tns:GetPetByPetid_OutputMessage&gt;
115+
&lt;tns:Pet&gt;
116+
&lt;tns:id&gt;1&lt;/tns:id&gt;
117+
&lt;tns:name&gt;doggie&lt;/tns:name&gt;
118+
&lt;tns:photoUrls&gt;&lt;/tns:photoUrls&gt;
119+
&lt;tns:tags&gt;&lt;/tns:tags&gt;
120+
&lt;tns:status&gt;available&lt;/tns:status&gt;
121+
&lt;/tns:Pet&gt;
122+
&lt;/tns:GetPetByPetid_OutputMessage&gt;
123+
&lt;/soap:Body&gt;
124+
&lt;/soap:Envelope&gt;
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

Comments
 (0)