03.06.2017 Aufrufe

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!