From 6e9fdfd59edf2c5f1bb87c12463c3a200eb45d7f Mon Sep 17 00:00:00 2001 From: mlabusch Date: Wed, 10 May 2017 18:47:03 +0200 Subject: [PATCH] [Task]: Add persistant layer to documentation --- .../chapter/GettingStarted.tex | 4 ++-- .../microservice_stock/chapter/Struktur.tex | 20 +++++++++--------- documentation/microservice_stock/pics/db.vsd | Bin 0 -> 42496 bytes 3 files changed, 12 insertions(+), 12 deletions(-) create mode 100644 documentation/microservice_stock/pics/db.vsd diff --git a/documentation/microservice_stock/chapter/GettingStarted.tex b/documentation/microservice_stock/chapter/GettingStarted.tex index a6cd1f4..25ed748 100644 --- a/documentation/microservice_stock/chapter/GettingStarted.tex +++ b/documentation/microservice_stock/chapter/GettingStarted.tex @@ -13,5 +13,5 @@ Um den Microservice Warenwirtschaft zu starten, muss die folgende Befehlszeile u go run main.go \end{lstlisting} -\subsection{Start des Microservice} -Der angepasste Monolith wird entsprechend der Anleitung unter \texttt{https://gitlab.com/matthiasstock/monolith} gestartet. \ No newline at end of file +\subsection{Start des Monolithen} +Der angepasste Monolith wird entsprechend der Anleitung unter \linebreak \texttt{https://gitlab.com/matthiasstock/monolith} gestartet. \ No newline at end of file diff --git a/documentation/microservice_stock/chapter/Struktur.tex b/documentation/microservice_stock/chapter/Struktur.tex index 7d4ff49..907b799 100644 --- a/documentation/microservice_stock/chapter/Struktur.tex +++ b/documentation/microservice_stock/chapter/Struktur.tex @@ -1,12 +1,10 @@ \section{Architektur des Microservice} \label{sec: Architektur des Microservice} 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 sett sich aus den neun Packages zusammen, die in der Abbildung X dargestellt werden. In den beiden nachfolgenden Unterkapiteln werden die Packages und die darin enthaltenen Go-Files des Presentation sowie des Application Layers kurz vorgestellt. Go-Files mit der Bezeichnung \texttt{<>\_test.go} beinhalten Whitebox-Testfälle um die Funktionen der benannten Go-Files zu prüfen. Aus Gründen der Übersichtlichkeit werden diese File hier nicht explizit aufgeführt. -Der Microservice nutzt anstelle einer klassischen Datenbank eine In-Memory-Datenbank im Cache. Aus diesem Grund verschwimmen klassischen Grenzen des Application und Persitant Layers und auf die dezidierte Aufführung des letzteren wird verzichtet. \begin{figure}[H] - \begin{center} + \centering \includegraphics[width=0.95 \textwidth]{./pics/struktur.png} - \end{center} \caption{Struktur des Microservice} \label{pic:Struktur des Microservice} \end{figure} @@ -99,10 +97,17 @@ Der Presentation Layer umfasst alle Packages, die sich mit der eigentlichen Dar \subsection{Integrierte Tests} \label{subsec: Integrierte Test} Neben den Go-Files die bereits Whitebox-Tests enthalten, 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 Test kann in der hier beschriebenen Version eine Code-Coverage von 100\% erreicht werden, das heißt jedes Stück Code wird mindestens einmal zur Ausführung gebracht. +\newpage -\subsection{Admin-Frontend} -\label{subsec: Admin-Frontend} +\subsection{Persistant Layer} +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 ein Lieferdatum und eine Anzahl haben. Dabei kann eine Ware nur zu einem Produkt gehören. +\begin{figure}[H] + \centering + \includegraphics[width=0.5 \textwidth]{./pics/db.pdf} + \caption{Datenbankmodell des Microservice} + \label{pic:Datenbankmodell des Microservice} +\end{figure} \newpage \subsection{Anpassung des Monolithen} @@ -125,8 +130,3 @@ Weiter wurde eine HTML-Datei \texttt{admin.html} zu den statischen Webseiteninha [...] \end{lstlisting} - - - - - diff --git a/documentation/microservice_stock/pics/db.vsd b/documentation/microservice_stock/pics/db.vsd new file mode 100644 index 0000000000000000000000000000000000000000..bb5b921d8dd285a8118c2cf03413e376e8a654b4 GIT binary patch literal 42496 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