Skip to content

This project arose in a small project team at university to design and develop “Thin Server Architectures” especially by using RESTful Web Services as an modern web architecture.

Notifications You must be signed in to change notification settings

LangeJustin/CRM-Microservice

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

shopKunde

shopKunde

KundeController

kundeController

KundeService

KundeService

KundeResource

kundeResource

Benutzerpolicy (Use-Case-Diagramm)

benutzerPolicy

Vorbereitung für den Start der Server

Internet-Verbindung

Eine Internet-Verbindung muss vorhanden sein, damit die eigenen Microservices über die IP-Adresse des Rechners aufgerufen werden können. Ansonsten würden die Rechnernamen verwendet werden, wozu ein DNS-Server benötigt wird.

Bereits vorhandene Tests in JUnit 5 muss dem Projekt entfernt werden!!!

IP-Adresse und hosts

Die IP-Adresse wird über das Kommando ipconfig ermittelt und liefert z.B. folgende Ausgabe:

    C:\>ipconfig

    Windows-IP-Konfiguration

    Ethernet-Adapter Ethernet:

       ...
       IPv4-Adresse  . . . . . . . . . . : 193.196.84.110
       ...

Die IP-Adresse muss dann in C:\Windows\System32\drivers\etc\hosts am Dateiende eingetragen und abgespeichert werden. Dazu muss man Administrator-Berechtigung haben.

    193.196.84.110 localhost

Proxy-Einstellung für Gradle

Die Proxy-Einstellung in gradle.properties muss richtig gesetzt sein. Dabei muss die eigene IP-Adresse bei den Ausnahmen ("nonProxyHosts") eingetragen sein, wozu man typischerweise Wildcards benutzt.

Überblick: Start der Server (REIHENFOLGE!)

  • MongoDB
  • Mailserver
  • Service Registry
  • Config-Server
  • API-Gateway
  • Circuit Breaker Dashboard (optional)
  • kunde
  • bestellung

Die Server (außer MongoDB) sind jeweils in einem eigenen Gradle-Projekt.

MongoDB starten und beenden

Durch Aufruf der .bat-Datei:

    mongodb

bzw.

    mongodb stop

IntelliJ IDEA als Datenbankbrowser

Das Teilfenster Mongo Explorer aktivieren und einen Doppelklick auf den Eintrag localhost machen. Jetzt sieht man die Datenbank hska und kann zu den Collections dieser Datenbank navigieren.

Eine Collection kann man wiederum durch einen Doppelklick inspizieren und kann dabei die Ansicht zwischen Tree und Table variieren.

Config-Server starten

Siehe ReadMe.md im Beispiel config-server.

Übersetzung und Ausführung

Start des Servers

In einer Eingabeaufforderung wird der Server mit der Möglichkeit für einen Restart gestartet, falls es geänderte Dateien gibt:

    kunde

Kontinuierliches Monitoring von Dateiänderungen

In einer zweiten Eingabeaufforderung überwachen, ob es Änderungen gibt, so dass die Dateien für den Server neu bereitgestellt werden müssen; dazu gehören die übersetzten .class-Dateien und auch Konfigurationsdateien. Damit nicht bei jeder Änderung der Server neu gestartet wird und man ständig warten muss, gibt es eine "Trigger-Datei". Wenn die Datei restart.txt im Verzeichnis src\main\resources geändert wird, dann wird ein Neustart des Servers ausgelöst und nur dann.

Die Eingabeaufforderung, um kontinuierlich geänderte Dateien für den Server bereitzustellen, kann auch innerhalb der IDE geöffnet werden (z.B. als Terminal bei IntelliJ).

    gradlew classes -t --build-cache

Properties beim gestarteten Microservice kunde überprüfen

Mit der URI https://localhost:8444/admin/env kann überprüft werden, ob der Microservice kunde die Properties vom Config-Server korrekt ausliest. Der Response wird mit dem MIME-Type application/vnd.spring-boot.actuator.v1+json zurückgegeben, welcher von einem Webbrowser i.a. nicht verstanden wird.

Man kann z.B. den REST Client von IntelliJ IDEA benutzen, der über Tools > Test RESTful Web Service aktiviert werden kann:

  • HTTP method: GET
  • Host/port: https://localhost:8444
  • Path: /admin/env

Die Ausgabe kann mit den beiden Icons View as JSON und Reformat response gut lesbar dargestellt werden. Die vom Config-Server bereitgestellten Properties sind bei "configService:file:///C:/Users/.../IdeaProjects/config-server/git-repo/kunde-dev.properties" zu finden.

Analog können bei Microservice bestellung die Properties überprüft werden:

  • Der Port ist von 8444 auf 8445 zu ändern.
  • Bei "configService:file:///C:/Users/... steht bestellung-dev.properties

Registrierung bei Service Registry überprüfen

    http://localhost:8761/eureka/apps/kunde

Herunterfahren in einer eigenen Eingabeaufforderung

    kunde stop

Tests

    gradlew test --build-cache

Codeanalyse durch FindBugs und CheckStyle einschl. Tests

    gradlew check --build-cache

Die Tests können durch die Option -x junitPlatformTest ausgelassen ("eXclude") werden.

Codeanalyse durch SonarQube einschl. Tests

    gradlew sonarqube --build-cache

Dazu muss der Sonar-Server gestartet sein. Die Tests können durch die Option -x junitPlatformTest ausgelassen ("eXclude") werden.

Beispielhafte URI für einen GET-Request

    https://localhost:8444/000000000000000000000001

Dabei muss man BASIC-Authentifizierung mit z.B. Username admin und Passwort p verwenden.

Um unnötigen Datentransfer zu vermeiden, kann der Header If-None-Match mit einer Versionsnummer (z.B. 0) als Wert verwendet werden. Falls die angeforderte Ressource genau diese Versionsnummer hat, wird der Statuscode Not Modified bzw. 304 zurückgeliefert

Wenn das API-Gateway gestartet ist, kann der Microservice kunde auch darüber aufgerufen werden, d.h. mit https://localhost:8443/kunde.

Mit nachfolgender URI kann man einen GET-Request absetzen, wobei Eureka und OpenFeign genutzt wird:

    https://localhost:8445/100000000000000000000001

Mit nachfolgender URI kann man einen GET-Request absetzen, wobei Eureka, OpenFeign und Hystrix genutzt wird:

    https://localhost:8445/bestellung/100000000000000000000010

Beispiel für einen POST-Request

URI für einen POST-Request

    https://localhost:8444

Datensatz für einen POST-Request

    {
        "nachname": "Test",
        "email": "[email protected]",
        "newsletter": true,
        "geburtsdatum": [
            1918,
            1,
            31
        ],
        "waehrung": "EUR",
        "homepage": "https://www.test.de",
        "geschlecht": "W",
        "familienstand": "L",
        "interessen": [
            "R",
            "L"
        ],
        "adresse": {
            "plz": "12345",
            "ort": "Testort"
        },
        "account": {
            "username": "test",
            "password": "p"
        }
    }

MIME-Type für einen POST-Request

Im REST Client bei Request und Headers durch + den Eintrag Content-Type mit dem Wert application/json setzen.

Beispiel für einen PATCH-Request

URI für einen PATCH-Request

    https://localhost:8444/000000000000000000000001

Datensatz für einen PATCH-Request

    [
        { "op": "replace", "path": "/nachname", "value": "Neuername" },
        { "op": "replace", "path": "/email", "value": "[email protected]" },
        { "op": "add", "path": "/interessen", "value": "R" },
        { "op": "remove", "path": "/interessen", "value": "L" }
    ]

Dazu muss der Header If-Match mit der Versionsnummer des Kunden (z.B. 0) als Wert gesetzt werden.

MIME-Type für einen PATCH-Request

Im Headers bei Content-Type den MIME-Type application/json-patch+json setzen.

Beispiel für einen PUT-Request mit einer multimedialen Datei

RESTclient aufrufen

gradlew restclient aufrufen

URI für einen PUT-Request

    https://localhost:8444/000000000000000000000001

Auswahl der hochzuladenden Datei

Beim Karteireiter Body den Eintrag Multipart Body auswählen. Danach beim Label Add Part: auf den Button File klicken und folgende Einstellungen vornehmen:

  • Name: file
  • File: anklicken und die hochzuladende Datei auswählen, z.B. in src\test\resources\rest gibt es PNG-, JPG- und MP4-Dateien. Dabei erkennt RESTclient, welchen MIME-Type die ausgewählte Datei hat und schlägt den entsprechenden Eintrag für Content type vor.

Danach auf Add & Close klicken und den PUT-Request schließlich abschicken. Der Statuscode muss dann 200 OK sein.

Nun kann man mit MongoChef in der Datenbank hska in der Collection fs.files die hochgeladene Datei mit dem Default-Viewer inspizieren.

Außerdem kann man in einem Webbrowser die hochgeladene Datei über die URL https://localhost:8444/000000000000000000000001/media herunterladen.

Dashboard für Service Registry (Eureka)

    http://localhost:8761

Anzeige im Circuit Breaker Dashboard (FEHLT)

    http://localhost:8762

Im Dashboard die URI für den zu beobachtenden Microservice eingeben, z.B.:

    http://admin:p@localhost:8081/admin/hystrix.stream

Hier wird BASIC-Authentifizierung mit dem Benutzernamen 'admin' und mit dem Passwort 'p' verwendet.

Beachte

  • Erst nach dem ersten Request des zu beobachtenden Microservice ist eine Anzeige zu sehen.
  • Mit dem Microservice wird über HTTP, und nicht über HTTPS kommuniziert, weil man sonst für Hystrix noch einen Truststore konfigurieren müsste. Das würde den Umfang der Übungen sprengen und gehört in Vorlesungen mit den Schwerpunkten "IT-Sicherheit" und "Automatisierung von Geschäftsprozessen".

Swagger

    https://localhost:8444/swagger-ui.html

Vorhandene Mappings auflisten

D.h. welche Zuordnung gibt es zwischen URIs bzw. Pfaden, HTTP-Methoden und Java-Methoden?

    https://localhost:8444/admin/mappings

Vorhandene Spring-Beans auflisten

    https://localhost:8444/admin/beans

Monitoring mit JConsole

In einer Eingabeaufforderung:

    jconsole

Navigation, z.B.:

    kunde.jar > MBeans > org.springframework.boot > Endpoint > beansEndpoint > Operations > getData()

Analog mit requestMappingsEndpoint statt beansEndpoint.

Ausführen der JAR-Datei in einer Eingabeaufforderung

    java -Xbootclasspath/p:alpn-boot.jar -jar build/libs/kunde.jar --spring.profiles.active=dev

About

This project arose in a small project team at university to design and develop “Thin Server Architectures” especially by using RESTful Web Services as an modern web architecture.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages