20170526-JavaSpektrum-Microservces-testautomation-1
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
IntegrationsSpektrum<br />
JS-3-17 – grötz – k1<br />
<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
16<br />
17<br />
18<br />
19<br />
20<br />
21<br />
22<br />
23<br />
24<br />
25<br />
26<br />
27<br />
28<br />
29<br />
30<br />
31<br />
32<br />
33<br />
34<br />
35<br />
36<br />
37<br />
38<br />
39<br />
40<br />
41<br />
42<br />
43<br />
44<br />
45<br />
46<br />
47<br />
48<br />
49<br />
50<br />
51<br />
52<br />
53<br />
54<br />
55<br />
56<br />
57<br />
58<br />
59<br />
60<br />
61<br />
62<br />
63<br />
64<br />
65<br />
dungen. Nun werfen wir einen Blick auf die Entwicklung von<br />
Microservices. Das Ganze am Beispiel einer mobilen Anwendung<br />
für Hobby-Angler.<br />
Die Probleme eines Hobby-Anglers<br />
Es ist ein großer Vorteil für Angler zu wissen, wann die Sonne<br />
auf und wann die Sonne untergeht. Warum? Weil auf manchen<br />
Gewässern das Nachtfischen verboten ist. Nun stellt sich die<br />
Frage, von wann bis wann ist es eigentlich Nacht? Die Antwort<br />
steht im Fischereigesetz: eine Stunde nach Sonnenuntergang<br />
bis eine Stunde vor Sonnenaufgang. Daher muss man wissen,<br />
wann die Sonne auf und untergeht.<br />
Dann gibt es ja auch noch die Wetterfrage.<br />
Was zieht der Angler an? Welche<br />
Kleidung muss berücksichtigt werden?<br />
Überrascht mich wieder das Wetter und<br />
ich muss den Anglertrip abbrechen?<br />
All diese Fragen beantwortet unsere mobile<br />
App SunRiseSet (s. Abb. 2). Sie liefert<br />
für einen eingegebenen Ort den Sonnenauf-<br />
und Untergangszeitpunkt, die Wetterdaten<br />
und die Landkarte. Ausgehend von<br />
den Millionen von registrierten Fischereikartenbesitzern<br />
(und noch mehr Schwarzfischern),<br />
wird diese App sicher ein großer<br />
Erfolg. Aus diesem Grund müssen sich Benutzer<br />
registrieren, damit wir mit den Kundendaten<br />
Geld verdienen können.<br />
Abb. 2: Startscreen Soweit die Theorie. Doch beschäftigen<br />
der App<br />
wir uns nun mit der Praxis: der Microservice-Architektur,<br />
die alle diese Daten ermittelt,<br />
speichert und zur Verfügung steht.<br />
SunRiseSet – Microservice-Architektur<br />
Unser System besteht auf der Backend-Seite aus sechs Microservices,<br />
die in Docker-Containern laufen. Der Location-<br />
Service und der Weather-Service greifen auf externe APIs zu.<br />
Die Services sind ein Mix aus NODE.JS und Python und haben<br />
folgende Funktionalitäten:<br />
H API-Gateway dient als Facade. Nur über dieses Gateway<br />
kann auf die dahinterliegenden Service zugegriffen werden.<br />
H Auth dient zu Authentifizierung des User und der Tokenverwaltung.<br />
H MariaDB dient zum Persistieren der Userdaten.<br />
H Location dient zur Ermittlung der Geolocation via externen<br />
Webservice.<br />
H Weather ermittelt die Wetterdaten für die Geolocation via<br />
externen Webservice.<br />
H Sun berechnet Sonnenauf- und Sonnenuntergang für die<br />
Geolocation.<br />
Jedes Service läuft in einem eigenen Docker-Container und<br />
liefert JSON zurück.<br />
Ablauf<br />
Das API-Gateway nimmt Anfragen von Clients (Mobile und<br />
Web) entgegen, führt die Authentifizierung durch und greift<br />
auf die dahinterliegenden Services zu. Abbildung 3 enthält das<br />
Komponentendiagramm, das Sequenzdiagramm in Abbildung<br />
4 zeigt die Details des Login-Vorgangs.<br />
Abb. 3: Übersicht der Docker-Container & Microservices<br />
Abb. 4: Login-Vorgang<br />
Der Login-Service<br />
Unser erster Microservice ist für das Login über das API-Gateway<br />
zuständig. Er besteht gerade mal aus 23 Zeilen (20 ohne<br />
Leerzeilen) NODE.JS-Code, verwendet Port 8080, HTTP und<br />
liefert JSON zurück.<br />
20 Zeilen Code – in Österreich würde man sagen „Ned<br />
schlecht Herr Specht“, oder anders ausgedrückt „Gut gemacht,<br />
bemerkenswert!“<br />
Zur Vereinfachung werden wir uns im Folgenden nur um<br />
diesen Microservice kümmern. Das gesamte Projekt finden Sie<br />
auf GitHub [GitLab]. Wir werden keine Zeit damit verbringen,<br />
den Code der Microservices zu diskutieren.<br />
var express = require('express');<br />
var request = require('request');<br />
var cors = require('cors');<br />
var app = express();<br />
app.use(cors());<br />
app.get('/login', function(req, res) {<br />
request('http://auth:8080/token?username=' + req.query.username +<br />
'&password=' + req.query.password, function(err1, r1, data) {<br />
var _data = {};<br />
try {<br />
var _data = JSON.parse(data);<br />
if(_data.success === true) {<br />
return res.send(_data);<br />
} else {<br />
return res.status(403).send(_data)<br />
}<br />
} catch(e) {<br />
console.error('could not parse auth response', e);<br />
return res.sendStatus(500);<br />
}<br />
});<br />
});<br />
Listing 1: Authentication-Service<br />
Der Aufruf des Service im Browser via<br />
http://localhost:8000/login?username=rgroetz&password=test123<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
16<br />
17<br />
18<br />
19<br />
20<br />
21<br />
22<br />
23<br />
24<br />
25<br />
26<br />
27<br />
28<br />
29<br />
30<br />
31<br />
32<br />
33<br />
34<br />
35<br />
36<br />
37<br />
38<br />
39<br />
40<br />
41<br />
42<br />
43<br />
44<br />
45<br />
46<br />
47<br />
48<br />
49<br />
50<br />
51<br />
52<br />
53<br />
54<br />
55<br />
56<br />
57<br />
58<br />
59<br />
60<br />
61<br />
62<br />
63<br />
64<br />
65<br />
2<br />
JavaSPEKTRUM 3/2017