genofire/hs_monolith
genofire
/
hs_monolith
Archived
1
0
Fork 0
This repository has been archived on 2020-09-27. You can view files and clone it, but cannot push or open issues or pull requests.
hs_monolith/documentation/microservice_stock/chapter/Struktur.tex

179 lines
12 KiB
TeX
Raw Normal View History

\section{Architektur des Microservice}
\label{sec: Architektur des Microservice}
2017-06-07 17:16:11 +02:00
Der Microservice Warenwirtschaft wurde in der Programmiersprache Go\footnote{https:\//golang.org\/doc\/} entwickelt. Go-An-wendungen bestehen aus Packages, in denen die einzelnen Go-Files organisiert sind, Klassen im Sinne der Objektorientierung gibt es nicht. Der Microservice Warenwirtschaft setzt sich aus den neun Packages zusammen, die die Abbildung \ref{pic:Struktur des Microservice} dargestellt. In den nachfolgenden Unterkapiteln \ref{subsec: Presentation Layer} und \ref{subsec: Application Layer} werden die Packages und die darin enthaltenen Go-Files des Presentation sowie des Application Layers kurz vorgestellt. Go-Files mit der Bezeichnung \texttt{<<Name>>\_test.go} beinhalten Whitebox-Testfälle um die Funktionen der benannten Go-Files zu prüfen. Aus Gründen der Übersichtlichkeit werden diese Files hier nicht explizit aufgeführt. Die weiteren Unterkapitel beschreiben die Schnittstellen, den Persistant Layer sowie das Admin-Frontend und schließlich die Anpassung des Monolithen, um den Microservice Warenwirtschaft in diesen zu integrieren.
2017-04-26 15:40:01 +02:00
\begin{figure}[H]
\centering
\includegraphics[width=0.95 \textwidth]{./pics/struktur.png}
\caption{Struktur des Microservice}
\label{pic:Struktur des Microservice}
\end{figure}
\newpage
2017-04-26 15:40:01 +02:00
\subsection{Schnittstellen zu anderen Microservices}
\label{subsec: Schnittstellen zu anderen Microservices}
2017-06-07 17:16:11 +02:00
Der Microservice Warenwirtschaft weißt drei Schnittstellen\footnote{Da es nicht Teil der übergeordneten Aufgabenstellung war, die Microservices der einzelnen Projektgruppen zu einem lauffähigen Webshop zusammenzufügen, greift der Microservice Warenwirtschaft an diesen Stellen auf Testdaten zurück} zu anderen Microservices auf. Zunächst greift der Microservice Warenwirtschaft für die Authentifizierung der Benutzer des Admin-Frontends vollständig auf einen Microservice Benutzerauthentifizierung zurück. Anstelle einer Login-Maske weißt das Admin-Frontend deshalb bisher nur einen Icon in Form eines Schlosses auf. Dieser symbolisiert, ob ein Benutzer die passende Berechtigung für das Admin-Front besitzt (Schloss geschlossen) oder nicht (Schloss geöffnet). \par
2017-05-15 10:22:24 +02:00
Weiter benötigt der Microservice Warenwirtschaft Informationen darüber, ob ein Benutzer eine Ware in den Warenkorb gelegt hat und ob eine Bestellung abgeschlossen wurde. So können Waren im Warenkorb für die Bestellung durch andere Benutzer blockiert und die erfolgreich bestellten Waren aus dem Warenbestand gelöscht werden. Diese Funktionalitäten geben eine eine Schnittstelle zu dem Microservice Bestellung vor. \par
2017-06-07 17:16:11 +02:00
Die dritte Schnittstelle besteht zu dem Microservice Produktkatalog, von welchem die Warenwirtschaft die angebotenen Produkte -- die sich dementsprechend im Lager befinden können -- abfragt. Die drei nachfolgenden Listings zeigen die Daten, die von den Microservices Produktkatalog und Bestellung im JSON-Format erwartet, beziehungsweise an diese ausgegeben werden.
\begin{lstlisting}[caption=Datenabfrage aus dem Produktkatalog]
{
"id": <<Int>>,
"title": "<<Produktname>>"
}
\end{lstlisting}
\begin{lstlisting}[caption=Datenabfrage von der Bestellung (Waren im Warenkorb abgelegt)]
{
"id": <<Int>>,
"amount": <<Int>>
}
\end{lstlisting}
\begin{lstlisting}[caption=Datenabfrage von der Bestellung (Waren wurden bestellt)]
{
"id": <<Int>>,
"amount": <<Int>>
}
\end{lstlisting}
2017-04-26 15:57:44 +02:00
\newpage
2017-05-15 10:22:24 +02:00
\subsection{Presentation Layer -- Admin-Frontend}
\label{subsec: Presentation Layer}
2017-05-15 10:22:24 +02:00
Der Presentation Layer umfasst alle Packages, die sich mit der eigentlichen Darstellung der Warenwirtschaft aus der Sicht des Endbenutzers befassen. Im Detail ist dies das Package \textbf{\texttt{webroot}}, welches den statischen Inhalt der Frontends, wie zum Beispiel die HTML-Files und Bilder enthält. \par
2017-06-07 17:16:11 +02:00
Die Startseite \textit{List} des Admin-Frontends zeigt eine Übersicht aller vorhandenen Produkte mit ihrer Anzahl an Waren (Abbildung \ref{pic:Admin-Frontend -- List}). Letztere wird mit einem Ampelsystem dargestellt, wobei ein vollkommen rot gefärbter Kreis einem Warenbestand von null entspricht und der Kreis mit zunehmender Anzahl an Waren immer mehr grün eingefärbt wird. Zu jedem Produkt können über den, mit einem Plus, gekennzeichneten Button Waren hinzugefügt werden. Ein Klick auf das jeweilige Produkt führt zu dessen Produktseite. \par
Die Produktseiten führen die ID, die Gesamtanzahl an Waren sowie die einzelnen Waren auf (Abbildung \ref{pic:Admin-Frontend -- Produktseite}). Diese können jeweils über den Icon in Form eines Mülleimers manuell gelöscht werden. Auch auf den Produktseiten sind über einen, mit einem Plus gekennzeichneten, Button neue Waren hinzufügbar. Beim Hinzufügen von neuen Waren sind für diese ein Ablaufdatum, eine Lagerposition sowie ein Kommentar und die Anzahl anzugeben (Abbildung \ref{pic:Admin-Frontend -- Hinzufuegen von Waren}). Die Seite \textit{Statistics} gibt letztendlich einen Überblick der gesamten und der durchschnittlichen Waren im Warenbestand.
2017-05-15 10:22:24 +02:00
\begin{figure}[H]
\centering
2017-06-07 17:16:11 +02:00
\includegraphics[width=0.75 \textwidth]{./pics/product.png}
2017-05-15 10:22:24 +02:00
\caption{Admin-Frontend -- Produktseite}
\label{pic:Admin-Frontend -- Produktseite}
\end{figure}
\begin{figure}[H]
\centering
2017-06-07 17:16:11 +02:00
\includegraphics[width=0.75 \textwidth]{./pics/add.png}
2017-05-15 10:22:24 +02:00
\caption{Admin-Frontend -- Hinzufügen von Waren}
\label{pic:Admin-Frontend -- Hinzufuegen von Waren}
\end{figure}
2017-04-26 15:40:01 +02:00
2017-05-15 10:22:24 +02:00
\newpage
\subsection{Application Layer}
\label{subsec: Application Layer}
2017-06-07 17:16:11 +02:00
Die Packages und Go-Files des Application Layers umfassen die Logik des Microservice Warenwirtschaft. Sie werden nachfolgend aufgelistet und kurz beschrieben.
2017-06-07 17:16:11 +02:00
\paragraph{cmd:} Go-File main.go, welches die Applikation letztendlich ausführt und alle Angaben zu den Config-Files der Applikation enthält
2017-04-26 15:40:01 +02:00
2017-06-07 17:16:11 +02:00
\paragraph{http:} Go-Files, die die Anwendungslogik (Funktionen) und die API-Routen beinhalten
2017-04-26 15:40:01 +02:00
\begin{itemize}
2017-04-28 09:27:59 +02:00
\item \texttt{bindapi.go}: Funktionen, die für das Binden der URL-Pfade notwendig sind
2017-05-15 10:22:24 +02:00
\item \texttt{good.go}: Funktionen für das Hinzufügen von Waren zum Warenbestand
\item \texttt{good\_show.go}: Funktionen für die Auflistung und Zählung der vorhandenen Waren sowie die Feststellung ihrer Verfügbarkeit
2017-05-03 08:02:29 +02:00
\item \texttt{good\_temp.go}: Hilfsfunktionen, die für die Darstellung des Warenbestandes als Ampel im Kunden-Frontend benötigt werden
2017-04-26 15:40:01 +02:00
\item \texttt{status.go}: Funktion, die den Status des Microservice abfragt
\end{itemize}
2017-05-03 08:02:29 +02:00
\paragraph{models:} Go-Files, die Structs und zugehörige Hilfsfunktionen (hauptsächlich statischen Inhalt des Microservice) beinhalten
2017-04-26 15:40:01 +02:00
\begin{itemize}
\item \texttt{config.go}: Structs mit den Informationen zur Konfiguration des Webservers, der Datenbank und dem Cache-Management sowie Hilfsfunktionen zum Lesen von Config-Files
\item \texttt{duration.go}: Structs und Hilfsfunktionen zur Definition eines Typs für Zeitangaben
2017-05-15 10:22:24 +02:00
\item \texttt{good.go}: Structs und Hilfsfunktionen zur Darstellung von Waren, hier werden auch die geforderten Funktionalitäten wie das Blockieren von Waren umgesetzt
2017-05-03 08:02:29 +02:00
\item \texttt{structstorage}:
2017-04-26 15:40:01 +02:00
\end{itemize}
\paragraph{runtime:} Go-Files mit weiteren Hilfsfunktionen
\begin{itemize}
\item \texttt{auth.go}: Hilfsfunktionen zur Prüfung, ob eine Berechtigung für den Zugriff vorliegt
\item \texttt{cache\_worker.go}: Hilfsfunktionen für das Löschen und Anlegen von Cache-Workers
2017-05-15 10:22:24 +02:00
\item \texttt{good\_release.go}: Hilfsfunktionen zum Blockieren und Entsperren von Waren
\item \texttt{productcache.go}: Hilfsfunktionen zum Anlegen eines Caches für Produkte
2017-05-03 08:02:29 +02:00
\item \texttt{runtime.go}: Übergreifende Hintergrundfunktionalitäten
2017-04-26 15:40:01 +02:00
\end{itemize}
2017-05-03 08:02:29 +02:00
2017-04-26 15:40:01 +02:00
\newpage
\paragraph{lib:} fasst die vier Packages \texttt{database}, \texttt{http}, \texttt{log} und \texttt{worker} zusammen
\begin{itemize}
2017-04-28 09:27:59 +02:00
\item \texttt{database}: Go-File \texttt{database.go} mit Funktionen für das Öffnen und Schließen der Datenbank
2017-04-26 15:40:01 +02:00
\item \texttt{http}: Go-Files, die die Webserverlogik umgesetzten
\begin{itemize}
2017-05-15 10:22:24 +02:00
\item \texttt{io.go}: Funktionen zum Lesen und Schreiben von JSON aus beziehungsweise in HTTP-Pakete
2017-04-26 15:40:01 +02:00
\item \texttt{permission.go}: Funktionen zur Prüfung der Berechtigung für den Zugriff
\end{itemize}
2017-04-28 09:27:59 +02:00
\item \texttt{log}: Go-File \texttt{log.go}, das den Logger startet und initiiert
2017-05-15 10:22:24 +02:00
\item \texttt{worker}: Go-File \texttt{worker.go}, dass Funktionen für die Nutzung eines Caches für die Produkte aus dem Produktkatalog (Worker) bereitstellt
2017-04-26 15:40:01 +02:00
\end{itemize}
\subsection{Persistant Layer}
2017-06-07 17:16:11 +02:00
Der Persitant Layer umfasst eine SQL-Lite-Datenbank, die im Cache gehalten wird. Die nachfolgende Abbildung \ref{pic:Datenbankmodell des Microservice} zeigt den grundsätzlichen Aufbau der Datenbank. Sie speichert den Warenbestand (stock) in Produkten (product). Jedes Produkt wird mit seiner ID und seinem Namen gehalten, die aus dem Produktkatalog bezogen und in einem Cache zwischengespeichert werden. Zu jedem Produkt gehören wiederum mehrere Waren (good), die eine ID, ein Ablaufdatum, eine Lagerposition und einen Kommentar besitzen. Dabei kann eine Ware nur zu einem Produkt gehören. Die Datenbank kann über die Konfigurationsdatei \texttt{config\_example.conf}, deren relevanter Ausschnitt nachfolgend dargestellt wird, flexibel angepasst werden.
2017-05-19 09:45:28 +02:00
\begin{lstlisting}[caption=Datenbankeinstellungen in der Konfigurationsdatei]
[database]
type = "sqlite3"
# logging = true
connection = "file::memory:?mode=memory&cache=shared"
# For Master-Slave cluster
# read_connection = ""
\end{lstlisting}
\begin{figure}[H]
\centering
2017-06-07 17:16:11 +02:00
\includegraphics[width=0.40 \textwidth]{./pics/db.pdf}
\caption{Datenbankmodell des Microservice}
\label{pic:Datenbankmodell des Microservice}
\end{figure}
2017-04-26 15:40:01 +02:00
2017-05-19 09:45:28 +02:00
\newpage
2017-05-15 10:22:24 +02:00
\subsection{Integrierte Tests}
\label{subsec: Integrierte Test}
2017-06-07 17:16:11 +02:00
Neben den bisherigen Packages, die bereits Whitebox-Tests umfassen, ist in dem Package \textbf{\texttt{test}} ein weiteres Go-File (\texttt{testRest.go}) enthalten. Dieses setzt einen Test des Webservers um, bei dem auf Testdaten eines Produktkataloges zurückgegriffen wird. Mit Hilfe der integrierten Tests wird in der hier beschriebenen Version eine Code-Coverage von 100\% erreicht, das heißt jedes Stück Code wird mindestens einmal zur Ausführung gebracht.
2017-05-15 10:22:24 +02:00
\subsection{Anpassung des Monolithen}
2017-04-28 16:06:38 +02:00
\label{subsec: Anpassung des Monolithen}
2017-05-15 10:22:24 +02:00
Damit der Microservice Warenwirtschaft durch den bestehenden Monolithen des Webshops Mosh genutzt werden kann, wurden hier dir nachfolgend aufgeführten Änderungen vorgenommen. Zunächst wurde für den Aufruf des Admin-Frontends über die URL des Monolithen \texttt{/stockadmin} das nachfolgende Mapping in der Java-Datei \texttt{HomepageController.java} ergänzt.
2017-05-19 11:12:17 +02:00
\begin{lstlisting}[caption=Anpassung in HomepageController.java, language=Java]
private final String STOCKADMINFRONTENDTEMPLATE = "https://stock.pub.warehost.de/index.html";
2017-05-15 10:22:24 +02:00
@RequestMapping(value = "/stockadmin", method = RequestMethod.GET)
2017-05-19 11:12:17 +02:00
public String redirect(Model model) {return "redirect:"+ this.STOCKADMINFRONTENDTEMPLATE;
2017-05-19 11:26:12 +02:00
}
}
\end{lstlisting}
2017-05-19 11:12:17 +02:00
Weiter wurde die Ampeldarstellung der Verfügbarkeit unter \texttt{products.html} eingefügt. Hierfür wurde das \texttt{ProductDTO.java} um die Rückgabe der Produkt-ID erweitert.
\begin{lstlisting}[caption=Anpassung products.html, language=HTML]
2017-05-19 11:26:12 +02:00
<div class="col-md-8">
<h2 th:text="${product.name}">Product Name</h2>
<img class="icon" th:src="${'https://stock.pub.warehost.de/api/good/availablity/'+product.id}"/>
<p class="text-info text-uppercase" th:text="${product.price}">0,00 Euro</p>
<p class="lead" th:text="${product.description}">Description.</p>
<div th:replace="fragments/reviews :: reviews"></div>
</div>
2017-05-19 11:12:17 +02:00
\end{lstlisting}
2017-05-19 11:12:17 +02:00
\begin{lstlisting}[caption=Anpassung ProductDTO.java, language=Java]
\end{lstlisting}
2017-05-19 11:12:17 +02:00